0

问题是要求用户输入任何数字。并将输入的数字与预定义的常数进行比较。然后输出一条消息,表明输入的数字大于或小于或等于定义的数字。在这个例子中,我的预定义数字是 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
   

如果我输入任何数字,无论它大于或小于或等于预定义的数字,它总是跳到更大。我的代码是否有任何问题,无法识别我的输入号码?

4

1 回答 1

1

我在您的代码中看到了这一行:

mov bx, ans

但是,我没有在任何地方看到“ans”的定义。您指的是 'numbr' 吗?

我看到了其他一些问题。您的代码似乎认为 int 21h/ah=0ah 操作的结果将通过 ax 寄存器返回一个数字。它不会。根据我在谷歌搜索时发现的第一个引用,该操作在 ds:dx 引用的缓冲区中返回一个字符串。其中,顺便说一句,您的代码没有明确建立——当调用 int 21h/ah=0ah 时,ds:dx 仍然指向 promptmsg,因此该操作将覆盖提示。

所以看起来代码打印了提示,要求输入,然后将输入打印回给用户。到了比较的时候:

cmp ax, bx

您已经将 9 放入 ax 的上半部分,因此总是采用“更大”的路径是有道理的。但同样,这并不重要,因为读取指令不会通过 ax 返回输入数据,而是在 ds:dx 指向的缓冲区中返回。

但是,即使您确实加载了 ds:dx 引用的第一个字节,您的代码仍然无法按预期工作。您需要将一系列 ASCII 字符转换为数字。即,'9' -> 9,'100' -> 100。这将需要更多代码。

于 2013-03-05T17:14:20.957 回答