由systemcall修改的寄存器通过gcc的扩展asm调用

时间:2016-09-07 12:35:51

标签: gcc assembly inline-assembly powerpc

我正在使用gcc的扩展asm来调用系统调用。我正在使用PowerPC(飞思卡尔MPC5200B)上的专有RTOS。

根据gcc的documentation我应该将汇编代码使用的所有寄存器 - 既不是输入也不输出 - 添加到clobbers列表中,因为gcc不分析汇编代码,因此不知道哪些寄存器正在改变。

问题是我不知道系统调用哪些寄存器会改变。实际上我正在观察系统调用改变一个包含指针的寄存器的情况。系统调用返回后,正在使用寄存器中的指针,这会导致无效的内存访问。

我应该如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

对于未来的读者:

一般的答案是你可以在系统的ABI文档中找到系统调用所改变的寄存器。

对于我的系统(Freescale MPC5200B),我发现答案是IBM Application Note'开发PowerPC嵌入式应用程序二进制接口(EABI)兼容程序'。

所以我将标记为volatile的寄存器(即R3..R12,F0..F13和标志寄存器)添加到clobbers列表中。