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:错误:操作数大小不匹配

并将 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

我不知道如何解决这个问题。有人可以解释一下吗?

4

1 回答 1

1

cmp word [eax],ecx是错误的,因为操作数大小不匹配(ecx是 a dword,不是word)。大多数具有两个操作数的 x86 指令只能使用相同大小的操作数。

cmp word [eax],word ecx是错误的,因为ecxis a dword, not word

如果你来自(g)as/gcc世界,值得注意的是它们.word是机器字,而在 32 位机器上它是 32 位的。NASMword始终是 16 位,它dword始终是 32 位。

You probably want just cmp [eax], ecx. Since the two operands of cmp must be of the same size, NASM deduces here that the memory operand at address in eax is the same size as the register operand ecx, 32-bit (dword).

于 2013-02-16T19:45:43.233 回答