2017-10-14 200 views
2

我正在與AT & T語法,但認爲我會嘗試英特爾。我有這樣的代碼:X86英特爾語法 - MOV的大小,表達式後的垃圾h?

.text 
     .global _start 

_start: 
     mov ebx, 0 
     mov eax, 1   
     int 80h 

應該返回0,對不對?它在轉換之前做了AT & T.

as out.s -msyntax=intel --32 -o out.o 

,但我得到:

我使用組裝

out.s:5: Error: ambiguous operand size for `mov' 
out.s:6: Error: ambiguous operand size for `mov' 
out.s:7: Error: junk `h' after expression 

我要去哪裏錯了嗎?

+0

我想到了全局指令作爲是一禾在 – Rafael

+1

文件彙編文件'.intel_syntax noprefix' –

+0

.section僞的.text .globl _start – Rafael

回答

2

非古老的GNU彙編語言版本提供對英特爾語法的支持,但也有一些問題。如果你正在尋找更接近NASM/MASM的intel語法的東西,那麼-msyntax=intel是不夠的。 -msyntax=intel將切換操作數的順序,因此目的地是第一個操作數,源操作數在之後。但是,您仍然需要在%%前加上所有註冊名稱。所以你可能會發現這會工作:

mov %ebx, 0 
    mov %eax, 1 

這可能會固定在MOV指令的錯誤。這可能不是你想要的。要使用Intel語法,而不%前綴,你可以添加這對每個組件文件的頂部:

.intel_syntax noprefix 

通過在每個組件文件的頂部指定此就不再需要與選擇組裝-msyntax=intel

junk 'h' after expression錯誤是因爲GNU的彙編程序(即使在英特爾語法模式下)不支持將基指定爲後綴的常量。在你的情況下,80h不被識別。 GNU彙編程序需要使用前綴(十六進制)指定基址。所以要消除這個錯誤使用:

int 0x80 

解決這些問題應該允許這些代碼進行組裝。