2014-02-10 62 views
12

我試圖通過組裝中的棧傳遞參數。我使用的是fedora 20,64位系統。錯誤:`push'的指令後綴無效

當我嘗試下面的代碼,

pushl%ebp的

popl等的%ebp

我得到的錯誤, 錯誤:無效的指令後綴'推」

怎麼會我克服了這個錯誤!

我通過編譯它, 作爲-ggstabs -o Function_Stack.o Function_Stack.c

回答

19

你得到的錯誤從一個非常簡單的事實出來:在32位模式下push指令接受16-位和32位立即數作爲參數。但是,在64位模式下使用的push指令僅接受16位和64位立即數。由於您清楚地將代碼編譯爲64位,所以彙編器會拋出錯誤,因爲它不可能編碼這樣的指令。另外,請記住,您通過在push指令中添加l後綴來強制操作數大小。我在這裏寫的所有內容與pop完全相同,只是它接受寄存器/內存,而不是立即數。

但是,您也需要需要來記住32位和64位Linux系統之間ABI的差異。 ABI指定了參數如何傳遞給函數,以及如何從用戶模式應用程序調用內核。你的代碼顯然是爲32位模式編寫的,看看它如何使用堆棧來傳遞參數以及調用系統調用的非常過時的方式。要了解64位ABI,請參見this document

或者,您可以選擇在64位系統上編譯32位代碼。如果您的64位系統上安裝了必要的32位運行時庫,那麼這樣的可執行文件就可以工作。大多數發行版都允許你以不同的方式做到這一點。您的編譯器as--32開關用於發送32位代碼。

+4

我用--32開關,它成功地創建了obj。現在它爲ld prog.0拋出錯誤-o prog,ld:輸入文件'prog.o'的i386體系結構與i386:x86-64輸出不兼容。 ld應該是什麼標誌? – InQusitive

+3

(僅供參考)嘗試使用ld的「-melf_i386」標誌。 – Fabio

+1

這工作正常,但後來我得到「無法執行二進制文件:Exec格式錯誤」猜猜我無法運行它呢? = S –