Assembly 比较汇编中的两个字符串
我试图在一个简单的汇编程序中比较两个字符串,但由于某些原因,它从未跳转到给定的目的地,但是如果我在eax和ebx中放入5,则如果相等,则跳转效果良好 我使用NASM作为编译器Assembly 比较汇编中的两个字符串,assembly,nasm,Assembly,Nasm,我试图在一个简单的汇编程序中比较两个字符串,但由于某些原因,它从未跳转到给定的目的地,但是如果我在eax和ebx中放入5,则如果相等,则跳转效果良好 我使用NASM作为编译器 SECTION .bss SECTION .data EatMsg: db "Eat at Joe's",10 EatLen: equ $-EatMsg Input: times 100 db 0 ok: db "ok" oklen: equ $-ok TastyMsg: db "Its tazty",10 TastyLe
SECTION .bss
SECTION .data
EatMsg: db "Eat at Joe's",10
EatLen: equ $-EatMsg
Input: times 100 db 0
ok: db "ok"
oklen: equ $-ok
TastyMsg: db "Its tazty",10
TastyLen: equ $-TastyMsg
SECTION .text
global _start
_start:
nop
mov eax,4
mov ebx,1
mov ecx,EatMsg
mov edx,EatLen
int 80H
mov eax,3
mov ebx,0
mov ecx,Input
mov edx,100
int 80H
mov eax,Input
mov ebx,ok
cmp eax,ebx
je tasty
mov eax,1
mov ebx,0
int 80H
tasty:
mov eax,4
mov ebx,1
mov ecx,TastyMsg
mov edx,TastyLen
int 80H
mov eax,1
mov ebx,0
int 80H
NASM中一种常见的跳闸危险:使用
mov eax、Input
和mov ebx,ok
加载相应标签的地址,而不是该位置的内容。这两个地址当然不同。要加载内容,必须用方括号括住标签
要比较任意两个字符串,必须在循环中逐字节比较它们。但是,在您的情况下,将ok
的两个字节加载到字寄存器中并与输入的前两个字节进行比较就足够了
改变
mov eax,Input
mov ebx,ok
cmp eax,ebx
到
或者更好的方法是,不要将2个字节作为数据存储在任何地方,只需执行cmp word[Input],“ok”
即可为字符串数据使用立即数常量。(由于imm16,在英特尔CPU上解码时有LCP暂停的风险。)
mov ax, [Input]
mov bx, [ok]
cmp ax, bx