Assembly 比较两个词

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:

如何比较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字[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
,非常有效。再次感谢。