2013-02-16 163 views
1

如何比較兩個詞在NASM大會?考慮下面的代碼:比較兩個詞

global start 
start: 
    mov eax,array 
    mov edx,4 
    mov ecx,2987074 
.LOOP1: 
    cmp word [eax],ecx 
    je .FOUND 
    add eax,4 
    sub edx,1 
    jz .NOTFOUND 
    jmp .LOOP1 
.FOUND: 
    xor ebx,ebx 
    jmp .EXIT 
.NOTFOUND: 
    mov ebx,1 
.EXIT: 
    mov eax,1 
    int 0x80 

array: 
    dd 1137620 
    dd 3529469 
    dd 2987074 
    dd 1111111 
    dd 2222222 

回報

foo.asm:7: error: mismatch in operand sizes

和不斷變化的CMP從cmp word [eax],ecxcmp word [eax],word ecx

回報:

foo.asm:7: warning: register size specification ignored 
foo.asm:7: error: mismatch in operand sizes 

我不知道如何解決這個問題。有人可以解釋嗎?

回答

1

cmp word [eax],ecx是錯誤的,因爲操作數大小不匹配(ecxdword,而不是word)。大多數帶有兩個操作數的x86指令只能用於相同大小的操作數。

cmp word [eax],word ecx是錯誤的,因爲ecxdword,而不是word

如果你來自於(g)as/gcc世界,值得注意的是它們的.word是機器字,在32位機器上它是32位。 NASM的word始終爲16位,其dword始終爲32位。你可能只想要​​。由於cmp的兩個操作數必須具有相同的大小,因此NASM在此推導出在eax的地址處的存儲器操作數與寄存器操作數ecx,32位(dword)的大小相同。

+0

再次感謝你。我在想,沒有明確的(嘗試)數據類型的大小定義將是我有一個'dword'而不是'字'或'字節'而不是'dword'(在某些情況下)因爲這個原因,我'cmp word [ eax],單詞ecx'而不是'cmp [eax],ecx'確實有效。再次感謝你。 – 2013-02-16 20:05:43