You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:17:36