如何比较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
我不知道如何解决这个问题。有人可以解释一下吗?
答案 0 :(得分:1)
cmp word [eax],ecx
错误,因为操作数大小不匹配(ecx
是dword
,而不是word
)。大多数带有两个操作数的x86指令只能用于相同大小的操作数。
cmp word [eax],word ecx
错误,因为ecx
是dword
,而不是word
。
如果您来自(g)as
/ gcc
世界,值得注意的是,他们的.word
是机器字,而在32位机器上则是32位。 NASM的word
始终为16位,dword
始终为32位。
您可能只需要cmp [eax], ecx
。由于cmp
的两个操作数必须具有相同的大小,因此NASM在此推断eax
中地址处的内存操作数与寄存器操作数ecx
(32位)的大小相同( dword
)。