Сравнение двух строк в сборке - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь сравнить две строки в простой ассемблерной программе, но по какой-то причине она никогда не переходит на заданный пункт назначения, но переход при равенстве работает нормально, если я поставлю 5 в eax и ebx

, которые я использую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

1 Ответ

0 голосов
/ 29 сентября 2018

Популярная опасность отключения в NASM: при mov eax,Input и mov ebx,ok загружен адрес соответствующей метки, а не содержимое в этом месте.Эти два адреса отличаются, конечно.Чтобы загрузить содержимое, вы должны заключить метки в квадратные скобки.

Чтобы сравнить любые две строки, вы должны сравнить их побайтно в цикле.В вашем случае, однако, достаточно загрузить два байта ok в регистр WORD и сравнить их с первыми двумя байтами Input.

Изменить

mov eax,Input
mov ebx,ok
cmp eax,ebx

до

mov ax, [Input]
mov bx, [ok]
cmp ax, bx
...