2016-09-07 48 views
0

我使用gcc的扩展asm来调用系统调用。我正在使用PowerPC(Freescale MPC5200B)上的专有RTOS。通过由gcc的扩展asm调用的systemcall修改的寄存器

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

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

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

+1

syscall指令本身修改_RCX_和_R11_:http://www.felixcloutier.com/x86/SYSCALL.html。但是,Linux也会根据操作结果更改_RAX_。后一个寄存器在[System V 64-Bit ABI](https://web.archive.org/web/20160706074221/http://www.x86-64.org/documentation/abi.pdf) A.2.1 _呼叫公约_其中规定:_2。系统调用是通过系统调用指令完成的。内核破坏 寄存器%rcx和%r11._ –

+0

和_5。从系统调用返回时,注册%rax包含系统调用的结果 。范围在-4095和-1之间的值表示错误, 它是-errno._ –

+0

*我应该如何处理这种情况?*在rcx和r11上声明clobbers,并使用'“= a”(retval) '所以海湾合作委员会知道结果是rax。顺便说一句,[x86 tag wiki](http://stackoverflow.com/tags/x86/info)有许多好东西的链接,其中包括dup-target,其中包含有关哪些regs被系统销毁的问题的答案调用。 (我不是说你应该自己找到它;这是其中一种情况,如果你不知道正确的搜索条件很难提出) –

回答

1

对于未来的读者:

一般的答案是,你可以找到系统的ABI的文档中的一个系统调用改变的寄存器。对于我的系统(飞思卡尔MPC5200B),我发现答案是IBM应用笔记'开发PowerPC嵌入式应用程序二进制接口(EABI)兼容程序'。

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