2013-07-31 42 views
-7

它說操作碼的組合無效和操作數這個彙編代碼有什麼問題?

section .data 
    name:  db "What is your name?" 
    name_L:  equ $-name 
    hello:  db "Hello" 
    hello_L:  equ $-hello 
section .bss 
    name_V  resb 255 



section .test 


    global _start: 
_start: 

    mov eax, 4 
    mov eax, 1 
    mov ecx, name 
    mov edx, name_L 
    int 80h 
    mov eax, 3 
    mov ebx, 0 
    mov ecx, name_V 
    mov edx, 255 
    int 80h 
    int eax, 4 
    mov ebx, 1 
    mov ecx, hello 
    mov edx, hello_L 
    int 80h 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, name_V 
    mov edx, 255 
    int 80h 
    mov eax, 1 
    mov eax, 0 
    int 80h 
+2

彙編器報告中哪行包含錯誤?你正在使用哪個彙編器? – stakx

+0

看起來像NASM –

回答

2

哦,通常,彙編實際上告訴你這行是有問題的一個,你應該檢查操作碼和操作數,以確保兼容性(或者,至少,讓我們知道它是哪一行)。

在此期間,你必須在你的程序不正確或多餘的代碼只是_start後:

mov eax, 4 
mov eax, 1 ; probably should be ebx 

如果這些是Linux的電話,你可能很幸運它沒有安裝。經過隨機長度sys_write將會引發各種悲傷:-)傳遞一個隨機出口值sys_exit也沒有勸道:

mov eax, 1 
mov eax, 0 ; probably should be ebx 
int 80h 

而且你一定所需的text(代碼)部分被稱爲test

也將大大有助於使您的代碼可讀性很長的路要走使用equ值,而不是幻數和添加註釋:

fn_exit equ 0 
fb_read equ 3 
fn_write equ 4 
: 
mov eax, fn_write  ; write 
mov ebx, 1    ; to stdout (fd 1) 
mov ecx, name   ; text to write 
mov edx, name_L  ; length of text to write 
0

編輯

我沒有看到你的代碼[BITS32]指令如果彙編器的默認模式是16位,可能會導致試圖將16位偏移量加載到32位寄存器中

/編輯

+0

'mov ecx,name'是有效的NASM語法(這是OP似乎正在使用的)。它相當於MASM/TASM語法中的'mov ecx,OFFSET name'。 – Michael

+0

@Michael謝謝!然而,我想知道,在這種情況下,其他* opcode *用法的根本問題可能是完美的。在'全球_開始:'我不認爲冒號是必要的/合法的,彙編程序也可能會抱怨這個事實,但是肯定沒有*操作碼*。代碼很簡單,所以根據錯誤信息,可以立即發現錯誤。也許這不是完整的來源? – Powerslave

+0

@Michael ...但沒有別的似乎是這個簡單的代碼合乎邏輯......謝謝btw。那真是個奇怪的問題。期待解決方案。 – Powerslave

2

除了什麼其他的答案已經覆蓋,這條線是不正確的:

int eax, 4 

我假設它應該是一個mov指令,而不是int

+0

該死的我錯過了那個!太好了! +1 – Powerslave

+0

其實,這個可能是贏家。將eax作爲int操作碼的操作數是_definitely_不匹配。 – paxdiablo