Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 比较汇编中的两个字符串_Assembly_Nasm - Fatal编程技术网

Assembly 比较汇编中的两个字符串

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

我试图在一个简单的汇编程序中比较两个字符串,但由于某些原因,它从未跳转到给定的目的地,但是如果我在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
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