我建立使用gcc編譯一些英特爾式內聯彙編代碼上的Xcode 4 下面的內聯彙編代碼列表部分:如何在構建intel樣式的內聯彙編代碼時使gcc編譯器保留寄存器?
_asm
{
mov eax, esp
sub esp, 116
and esp, ~15
mov [esp+112], eax
}
在休眠模式下,GCC編譯上述4行彙編代碼到:
mov %esp,%eax
sub $0x74,%esp
and $0xfffffff0,%esp
mov %eax,0x70(%esp)
這正是我想要的。 然而,在調試模式GCC編譯器會該代碼
mov %esp,%eax
mov %eax,%esp
mov %esp,%eax
mov %eax,-0x28(%ebp)
mov %esp,%eax
mov %eax,%esp
sub $0x74,%esp
mov %esp,%eax
mov %eax,-0x24(%ebp)
mov %esp,%eax
mov %eax,%esp
**and $0xfffffff0,%esp**
**mov %esp,%eax** **//changing the value of 「eax」**
mov %eax,-0x24(%ebp)
mov %esp,%ecx
mov %ecx,%esp
**mov %eax,0x70(%esp)** **//store a 「dirty」 value to address 0x70(%esp), which is not we want**
一種方法來解決上述問題是使用AT & T型指令重寫內聯彙編代碼和寄存器添加到修飾列表。但是這種方式將是一項非常耗時的工作,因爲重寫代碼很長。
還有其他有效的方法來解決這個問題嗎?爲了讓gcc編譯器知道應該保留寄存器「eax」?
斜線代碼使用寄存器eax來存儲重要值,但GCC使用「eax」作爲臨時寄存器並「污染」寄存器「eax」。如何避免這種情況? – behe 2012-04-24 10:26:53
你是什麼意思保存? inline-asm聲明結束之後?這是沒有意義的;一旦你的彙編語句完成,編譯器再次擁有寄存器。如果你想讓函數返回你留在'eax'中的東西,你需要用C變量來實現。包含asm塊函數可以內聯到另一個函數中... – 2016-10-01 10:48:00