ARM 过程调用标准
时间:11-10
来源:互联网
点击:
- = R11, ip = R12, sp = R13, lr = R14, pc = R15。
- 隐式的栈限制检查(使用 sl)。
- 26-bit 程序计数器。
- 不在 FP 寄存器中传递浮点实参。
- 不可重入。标志必须被恢复。
APCS-32
它是 APCS-2(-R 和 -U)的一个扩展,允许 32-bit 程序计数器,并且从执行在 USR 模式下的一个函数中退出时,允许标志不被恢复。其他事情同于 APCS-R。
Acorn C 版本 5 支持生成 32-bit 代码;在用于广域调试的 32 位工具中,它是最完整的开发发行。一个简单的测试是要求你的编译器导出汇编源码(而不是制作目标代码)。你不应该找到:
MOVS PC, R14
或者
LDMFD R13!, {Rx-x, PC}^
对编码有用的东西
首先要考虑的是该死的 26/32 位问题。 简单的说,不转弯抹角绝对没有方法为两个版本的 APCS 汇编同一个通用代码。但是幸运的这不是问题。APCS 标准不会突然改变。RISC OS 的 32 位版本也不会立刻变异。所以利用这些,我们可以设计一种支持两种版本的方案。这将远远超出 APCS,对于 RISC OS 的 32 位版本你需要使用 MSR 来处理状态和模式位,而不是使用 TEQP。许多现存的 API 实际上不需要保护标志位。所以在我们的 32 版本中可以通过把MOVS PC,...变成MOV PC,...,和把LDM {...}^变成LDM {...},并重新建造来解决。objasm 汇编器(v3.00 和以后)有一个{CONFIG}变量可以是26或32。可以使用它建造宏...my_function_nameMOV ip, spSTMFD sp!, {fp, ip, lr, pc}SUB fp, ip, #4...处理...[ {CONFIG} = 26LDMEA fp, {fp, sp, pc}^|LDMEA fp, {fp, sp, pc}]我未测试这个代码。它(或类似的东西)好象是保持与两个版本的 APCS 相兼容的最佳方式,也是对 RISC OS 的不同版本,26 位版本和将来的 32 位版本的最佳方法。
测试是否处于 32 位? 如果你要求你的代码有适应性,有一个最简单的方法来确定处理器的 PC 状态:
TEQ PC, PC ; 对于 32 位是 EQ;对于 26 位是 NE
使用它你可以确定:
- 26 位 PC,可能是 APCS-R 或 APCS-32。
- 32 位 PC,不能 APCS-R。所有 26-bit 代码(TEQP 等)面临着失败!
ARM过程调用标 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)