微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM 过程调用标准

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 等)面临着失败!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top