自从我上次编写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.

the AAPCS, §5.1.1:

  • r0-r3是参数和暂存寄存器;r0-r1也是结果寄存器
  • r4-r8是被叫方保存寄存器
  • r9可能是被叫方保存寄存器,也可能不是(在AAPC的某些变体上,它是一个特殊寄存器)
  • r10-r11是被调用方保存寄存器
  • r12-r15个是特殊寄存器

被调用者保存寄存器必须由被调用者保存(与调用者保存寄存器相反,调用者保存寄存器);因此,if这是您正在使用的ABI,您不必在调用另一个函数之前保存R10(另一个函数负责保存它).

Edit:你使用的编译器没有区别;特别是gcc,可以为几个不同的ABI配置,甚至可以在命令行上更改.看看它生成的序言/结尾代码并不是那么有用,因为它是 for each 函数and定制的.编译器可以使用其他方法来保存登记(例如,在函数的中间保存它).


术语:"被叫方保存"是"非易失性"或"呼叫保留"的同义词:What are callee and caller saved registers?

C++相关问答推荐

在C、Linux中同步进程

GCC不警告隐式指针到整数转换'

以c格式打印时间戳

为什么在C中设置文件的位置并写入文件,填充空字符?

显式地将值转换为它从函数返回的类型的含义是什么?

空指针的运行时强制转换

使用GOTO从多个嵌套循环C继续

变量>;-1如何在C中准确求值?

如果dim指定数组中的数据量,使用dim-1会不会潜在地导致丢失一个元素?

判断X宏的空性

在Linux上使用vscode和lldb调试用Makefile编译的c代码

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

在C++中父进程和子进程中的TAILQ队列同步问题

S和查尔有什么不同[1]?

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

理解bzip2的BZ2_解压缩函数中的状态重新分配

从整型转换为浮点型可能会改变其值.

当用C打印过多的';\n';时输出不正确