2016-09-07 45 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列表中。