根据“ARM-thumb 过程调用标准”:
通用寄存器
通用寄存器包含R0到R12,13个寄存器
R0-R3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。而当参数多于4个时,会将多出的参数压入栈中进行传递(其实在函数调用过程中也会把r0,r1,r2,r3传递的参数压入栈)。
R4-R11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。
R12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。
R13 R13 是堆栈指针。在 CM3 处理器内核中共有两个堆栈指针.
- 主堆栈指针(MSP),或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务 例程以及所有需要特权访问的应用程序代码来使用
- 进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码(不处于异常服用例程中时)
R14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复
R15 是程序计数器 PC。它不能用于任何其它用途。因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。
注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4~R11,Cortex‐M3 在进入异常服务例程时,自动压栈了 R0‐R3, R12, LR, PSR 和 PC,并且在返回时自动弹出它们。
特殊功能寄存器
Cortex‐M3 中的特殊功能寄存器包括:
- 程序状态寄存器组(PSRs 或曰 xPSR)
- 中断屏蔽寄存器组(PRIMASK, FAULTMASK,以及 BASEPRI),这三个寄存器用于控制异常的使能和除能
- 控制寄存器(CONTROL)
它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址,只能通过寄存器名字进行操作。
程序状态寄存器组
中断屏蔽寄存器组
控制寄存器
CONTROL[0]和CONTROL[1]寄存器都只允许在特权级模式下进行修改,一旦进入到用户级模式,则只能通过一个svc指令触发软中断,才能修改控制寄存器并回到特权级模式,