汇编语言:如何比较8086中的输入数字?

时间:2013-03-05 16:19:37

标签: assembly x86-16

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

1 个答案:

答案 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' - >那将需要更多的代码。