1

NASMアセンブリで2つの単語を比較するには? このコードを検討してください:

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: エラー: オペランドのサイズが一致しません

cmp を から に変更cmp word [eax],ecxするcmp word [eax],word ecx

戻り値:

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

これを修正する方法がわかりません。誰かがそれを説明できますか?

4

1 に答える 1

1

cmp word [eax],ecxオペランドのサイズが一致しない ( ecxis a dword, not word) ため、間違っています。2 つのオペランドを持つほとんどの x86 命令は、同じサイズのオペランドでのみ機能します。

cmp word [eax],word ecxは間違っているので、そうでecxはありdwordませんword

あなたが(g)as/gccの世界から来たのであれば、their.wordは機械語であり、32 ビット マシンでは 32 ビットであることに注意してください。NASMwordは常に 16 ビットで、dword常に 32 ビットです。

あなたはおそらくちょうどしたいですcmp [eax], ecx。の 2 つのオペランドはcmp同じサイズでなければならないため、NASM はここで、アドレス in のメモリ オペランドeaxがレジスタ オペランドecx、32 ビット ( dword) と同じサイズであると推測します。

于 2013-02-16T19:45:43.233 に答える