ARM汇编中SVC函数的参数寄存器使用规则及参数查询方法
ARM SVC调用中R0-R2作为参数的规则与合法参数确定方法
寄存器使用是否固定?
ARM架构本身并没有强制要求SVC调用必须用R0-R2传递参数,这完全取决于你使用的操作系统/RTOS的ABI(应用二进制接口)约定。不过在绝大多数主流ARM系统(比如Linux ARM EABI、FreeRTOS、uC/OS等嵌入式RTOS)中,都会约定用R0-R2传递SVC调用的前3个参数,超过3个的参数一般会通过栈来传递。
如何确定合法参数?
- 查目标系统的官方文档:比如Linux的ARM内核文档会明确列出每个系统调用(通过SVC触发)的参数要求;嵌入式RTOS的官方手册或内核指南里,也会说明其提供的SVC服务对应的参数规则,比如哪些寄存器传操作码、哪些传对象句柄。
- 分析SVC异常处理的源码:找到系统中负责处理SVC异常的函数(通常叫
svc_handler或者类似名称),看它对R0-R2的处理逻辑。比如有些SVC会先读取SVC指令的立即数作为服务编号,再根据编号判断R0-R2的合法取值范围——比如某SVC服务要求R0必须是已创建的任务句柄,R1是优先级值,这些限制都会在处理代码里体现。 - 参考同系统下的示例代码:看看同一系统中其他模块调用SVC的汇编代码,比如如果看到
mov r1, #0x03、svc #0x07这样的代码,结合SVC编号0x07的处理逻辑,就能反推出R1的合法参数范围。 - 自定义SVC的情况:如果是你自己在裸机或RTOS中实现的SVC服务,那参数规则完全由你编写的SVC处理函数决定,直接看自己的代码逻辑即可。
内容的提问来源于stack exchange,提问作者Dawson Chitwood
相关产品推荐
相关产品推荐

