![]() |
1
80
这取决于天气 ABI here on ARM's infocenter .
如果 您使用的编译器没有区别;特别是gcc可以为几个不同的ABI进行配置,甚至可以在命令行上进行更改。查看它生成的序言/尾声代码并没有多大用处,因为它是为每个函数定制的 和
What are callee and caller saved registers?
|
![]() |
2
27
32位ARM调用约定由 AAPCS从…起 the AAPCS ,§5.1.1核心寄存器:
64位ARM调用约定由指定 AAPCS64General-purpose Registers 节指定需要保留的寄存器。
SIMD and Floating-Point Registers 指定寄存器和浮点寄存器。 |
![]() |
3
19
(来自ARM 64位体系结构的过程调用标准) A64指令集可见31个64位通用(整数)寄存器;这些都有标签 r0-r30 . 在64位上下文中,这些寄存器通常使用名称来引用 ; 在32位上下文中,寄存器通过使用 . 此外,堆栈指针寄存器, ,可与数量有限的指令一起使用。
前八个寄存器, r0-r7 登记册 和 r17(IP1) r18 SIMD v0-v31 注: 前八个寄存器, v0-v7 ,用于将参数值传递到子例程,并从函数返回结果值。它们也可用于保存例程内的中间值(但通常仅在子例程调用之间)。 登记册 必须由被调用方跨子例程调用保留;其余的登记册( )不需要保留(或者应该由调用方保留)。此外,仅存储在中的每个值的底部64位 v8-v15 需要保存;调用者有责任保留较大的值。 |
![]() |
4
7
CesarB和Pavel的回答提供了AAPCS的报价,但仍存在未决问题。被叫方是否保存r9?r12呢?r14呢?此外,答案非常笼统,并非针对要求的arm eabi工具链。这里有一个实用的方法来找出哪些寄存器被调用者保存,哪些不保存。
使用命令行
总结如下:
这至少适用于arm eabi gcc的默认设置。有一些命令行开关(特别是-mabi开关)可能会影响结果。 |
![]() |
5
0
对于函数调用和中断,至少在Cortex M3体系结构上也存在差异。
我不认为这种自动推送和弹出是为函数调用(跳转指令)而设计的。若约定说R0-R3只能用作参数、结果或暂存寄存器,那个么就不需要在函数调用之前存储它们,因为在函数返回之后不应该使用任何值。但和在中断中一样,如果在函数中使用其他CPU寄存器,则必须存储它们。 |