我正在使用gcc的扩展asm来调用系统调用。我正在使用PowerPC(飞思卡尔MPC5200B)上的专有RTOS。
根据gcc的documentation我应该将汇编代码使用的所有寄存器 - 既不是输入也不输出 - 添加到clobbers列表中,因为gcc不分析汇编代码,因此不知道哪些寄存器正在改变。
问题是我不知道系统调用哪些寄存器会改变。实际上我正在观察系统调用改变一个包含指针的寄存器的情况。系统调用返回后,正在使用寄存器中的指针,这会导致无效的内存访问。
我应该如何处理这种情况?
答案 0 :(得分:1)
对于未来的读者:
一般的答案是你可以在系统的ABI文档中找到系统调用所改变的寄存器。
对于我的系统(Freescale MPC5200B),我发现答案是IBM Application Note'开发PowerPC嵌入式应用程序二进制接口(EABI)兼容程序'。
所以我将标记为volatile的寄存器(即R3..R12,F0..F13和标志寄存器)添加到clobbers列表中。