自从我上次编写arm汇编程序已经有一段时间了,我对细节有些生疏.如果我从arm调用C函数,我只需要担心保存r0-r3和lr,对吗?
如果C函数使用任何其他寄存器,它是否负责将这些寄存器保存到堆栈上并恢复它们?换句话说,编译器将为C函数生成执行此操作的代码.
例如,如果我在汇编函数中使用R10,我不必将它的值压入堆栈或内存,并在C调用后弹出/恢复它,对吗?
这是给ARM-EABI-GCC 4.3.0的.
自从我上次编写arm汇编程序已经有一段时间了,我对细节有些生疏.如果我从arm调用C函数,我只需要担心保存r0-r3和lr,对吗?
如果C函数使用任何其他寄存器,它是否负责将这些寄存器保存到堆栈上并恢复它们?换句话说,编译器将为C函数生成执行此操作的代码.
例如,如果我在汇编函数中使用R10,我不必将它的值压入堆栈或内存,并在C调用后弹出/恢复它,对吗?
这是给ARM-EABI-GCC 4.3.0的.
这取决于您正在编译的平台的ABI.在Linux上,有两个ARM ABI:旧的和新的.AFAIK,新的(EABI)实际上是ARM的AAPC.完整的EABI定义目前正在使用here on ARM's infocenter.
被调用者保存寄存器必须由被调用者保存(与调用者保存寄存器相反,调用者保存寄存器);因此,if这是您正在使用的ABI,您不必在调用另一个函数之前保存R10(另一个函数负责保存它).
Edit:你使用的编译器没有区别;特别是gcc,可以为几个不同的ABI配置,甚至可以在命令行上更改.看看它生成的序言/结尾代码并不是那么有用,因为它是 for each 函数and定制的.编译器可以使用其他方法来保存登记(例如,在函数的中间保存它).
术语:"被叫方保存"是"非易失性"或"呼叫保留"的同义词:What are callee and caller saved registers?