如何比较初始化字符串?

时间:2019-04-28 04:39:19

标签: assembly x86-16

我在比较作业中的初始化字符串时遇到麻烦。.这只是一个示例代码,我在输出时为什么会有问题...

输入您的答案:黄瓜 您的答案是:黄瓜

黄瓜是正确的答案

但显示: 你回答错了 我真的不知道如何解决

 Data Segment      
  input db "Enter Your Answer: $"
  g db 20 dup('$') ;
  strlen1 db $-g
  str2 db 'cucumber','$'
  strlen2 db $-str2
  streq db 10,13,'You got the correct answer','$'
  struneq db 10,13,'You got the Wrong answer','$'
Data Ends
Code Segment
  Assume cs:code, ds:data
  Begin:
    mov ax, data
    mov ds, ax
    mov es, ax    
   mov ah,09h
   lea dx,input
   int 21h    
   MOV AH,0AH
   MOV DX,SI
   INT 21H     
   lea si,g
   lea di, str2
   mov cx, 3
   mov al, strlen1
   mov bl, strlen2
   cmp al, bl
   jne Not_Equal
   repe cmpsb
   jne Not_Equal
   jmp Equal
   Not_Equal:
       mov ah, 09h
       lea dx, struneq
       int 21h
       jmp Exit
   Equal:
       mov ah, 09h
       lea dx, streq
       int 21h
   Exit:
       mov ax, 4c00h
       int 21h
Code Ends

1 个答案:

答案 0 :(得分:0)

您正在根据数据段中的数据静态计算字符串长度。其中一个是20个字节,另一个是“ cucumber $”,它要短得多。 您需要从用于输入的DOS调用中获取输入长度。我本人从未使用过16位DOS,但是this site提供了有关您从通话中获得的信息的参考。 如您所见,返回的缓冲区不是从实际数据开始的,因此您必须从更多字节开始读取缓冲区。 另外,您可以从那里获得所需的长度。

还请记住,repe重复cx次,因此应将其设置为字符串长度(使用strlen1,因为strlen2将包含回车符)。现在将其设置为3。

我希望这会有所帮助。

编辑:传递给调用的输入缓冲区在DX中。 您先将g放入其中,然后又用si覆盖它。