问题是要求用户输入任何数字。并将输入的数字与预定义的常数进行比较。然后输出一条消息,输入的数字大于或小于或等于定义的数字。在此示例中,我的预定义数字是27。
我的代码是:
.MODEL small
.STACK 100h
.DATA
promptmsg DB 'Please enter a number [1..100]',13,10,'$'
greatermsg db 'You have entered a greater number', 13, 10, '$'
lessmsg db 'You have entered a lesser number', 13 , 10, '$'
correctmsg db 'You have hit the right number', 13, 10, '$'
numbr dw 27
.CODE
.startup
mov ax,@data
mov ds,ax
lea dx, promptmsg
mov ah,9
int 21h
mov ah, 0ah
int 21h
mov ah, 9
int 21h
mov bx, numbr
cmp ax, bx
jb lesser
ja greater
correct:
mov dx, offset correctmsg
mov ah, 09h
int 21h
jmp endexe
greater:
mov dx, offset greatermsg
mov ah, 09h
int 21h
jmp endexe
lesser:
mov dx, offset lessmsg
mov ah, 09h
int 21h
endexe:
mov ah,4ch ;DOS terminate program function
int 21h ;terminate the program
END
如果我输入任何数字,无论它是大于还是小于或等于预定义的数字,它总是跳到更大。我的代码是否有任何问题,无法识别我的输入数字?
更新:更正了变量numbr而非ans。
答案 0 :(得分:0)
我在你的代码中看到了这一行:
mov bx, ans
但是,我没有在任何地方看到'ans'。你的意思是'numbr'吗?
我还看到其他一些问题。你的代码似乎认为int 21h / ah = 0ah操作的结果将通过ax寄存器返回一个数字。它不会。根据{{3}}在谷歌搜索时,该操作返回ds:dx引用的缓冲区中的字符串。哪个,BTW,你的代码没有明确地建立 - 当int 21h / ah = 0ah,被调用时,ds:dx仍然指向promptmsg,所以操作将覆盖提示。
因此看起来代码打印提示,请求输入,然后将输入打印回用户。当它进行比较时:
cmp ax, bx
你已经将9放入了ax的上半部分,因此总是采用“更大”的路径是有意义的。但同样,这并不重要,因为read指令不会通过ax返回输入数据,而是返回ds:dx指向的缓冲区。
但是,即使您加载了ds:dx引用的第一个字节,您的代码仍然无法正常工作。您需要将一系列ASCII字符转换为数字。即,'9' - > 9,'100' - >那将需要更多的代码。