Assembly 比较两个词
如何比较NASM汇编中的两个单词?考虑这个代码:Assembly 比较两个词,assembly,x86,word,nasm,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:
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字[eax],ecx
更改为cmp字[eax],字ecx
返回:
foo.asm:7: warning: register size specification ignored
foo.asm:7: error: mismatch in operand sizes
我不知道如何解决这个问题。有人能解释一下吗?
cmp-word[eax],ecx
是错误的,因为操作数大小不匹配(ecx
是一个dword
,而不是word
)。大多数具有两个操作数的x86指令只能使用相同大小的操作数
cmp单词[eax],单词ecx
是错误的,因为ecx
是一个dword
,而不是word
如果您来自(g)as
/gcc
世界,那么值得注意的是,他们的.word
是机器字,在32位机器上是32位的。NASM的word
始终为16位,其dword
始终为32位
您可能只需要
cmp[eax],ecx
。由于cmp
的两个操作数必须具有相同的大小,因此NASM在此推断eax
中地址处的内存操作数与寄存器操作数的大小相同ecx
,32位(dword
)。cmp字[eax],ecx
是错误的,因为操作数大小不匹配(ecx
是一个dword
,而不是word
)。大多数带有两个操作数的x86指令只能使用相同大小的操作数
cmp单词[eax],单词ecx
是错误的,因为ecx
是一个dword
,而不是word
如果你来自(g)as
/gcc
世界,那么值得注意的是,他们的.word
是机器字,在32位机器上是32位的。NASM的word
总是16位,而dword
总是32位的
您可能只需要
cmp[eax],ecx
。由于cmp
的两个操作数必须具有相同的大小,因此NASM在此推断eax
中地址处的内存操作数与寄存器操作数ecx
,32位(dword
)的大小相同。再次感谢您。我在没有明确说明的情况下(请尝试)数据类型大小定义为:我使用dword
而不是word
或byte
而不是dword
(在某些情况下)因此,我使用了cmp-word[eax],word-ecx
而不是cmp[eax],ecx
它真的很有效。再次感谢。再次感谢。我在没有明确说明的情况下(试试看)数据类型大小定义为:我使用dword
而不是word
或byte
而不是dword
(在某些情况下)因此,我使用了cmp-word[eax],word-ecx
而不是cmp[eax],ecx
,非常有效。再次感谢。