我在比较作业中的初始化字符串时遇到麻烦。.这只是一个示例代码,我在输出时为什么会有问题...
输入您的答案:黄瓜 您的答案是:黄瓜
黄瓜是正确的答案
但显示: 你回答错了 我真的不知道如何解决
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
答案 0 :(得分:0)
您正在根据数据段中的数据静态计算字符串长度。其中一个是20个字节,另一个是“ cucumber $”,它要短得多。 您需要从用于输入的DOS调用中获取输入长度。我本人从未使用过16位DOS,但是this site提供了有关您从通话中获得的信息的参考。 如您所见,返回的缓冲区不是从实际数据开始的,因此您必须从更多字节开始读取缓冲区。 另外,您可以从那里获得所需的长度。
还请记住,repe重复cx次,因此应将其设置为字符串长度(使用strlen1,因为strlen2将包含回车符)。现在将其设置为3。
我希望这会有所帮助。
编辑:传递给调用的输入缓冲区在DX中。 您先将g放入其中,然后又用si覆盖它。