比较两个词

时间:2013-02-16 19:21:42

标签: assembly x86 word nasm

如何比较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],ecx更改为cmp word [eax],word ecx

返回:

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

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

1 个答案:

答案 0 :(得分: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 [eax], ecx。由于cmp的两个操作数必须具有相同的大小,因此NASM在此推断eax中地址处的内存操作数与寄存器操作数ecx(32位)的大小相同( dword)。