2013-03-05 105 views
0

問題是要求用戶輸入任何數字。並將輸入的數字與預先定義的常數進行比較。然後輸出一個消息,輸入的數字大於或小於或等於定義的數字。在這個例子中我的預定數量爲27彙編語言:如何比較8086中的輸入號碼?

我的代碼是:

.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

我看到你的這行代碼:

mov bx, ans 

不過,我沒有看到「答」的任何地方定義。你的意思是'numbr'?

我看到一些其他問題。你的代碼似乎認爲int 21h/ah = 0ah操作的結果將通過ax寄存器返回一個數字。它不會。根據the first reference I found在搜索時,該操作返回由ds:dx引用的緩衝區中的字符串。哪個,順便說一下,你的代碼沒有明確地建立 - 當int 21h/ah = 0ah時,ds:dx仍指向promptmsg,因此操作將覆蓋提示。

因此,它看起來像代碼打印提示,要求輸入,然後打印輸入回到用戶。通過它獲取的比較時間:

cmp ax, bx 

你已經把9成斧的上半部分,所以它是有道理的「更大的」路徑始終採用。但是,這並不重要,因爲讀取指令不會通過ax返回輸入數據,而是會返回ds:dx所指向的緩衝區。

但是,即使您確實加載了ds:dx引用的第一個字節,您的代碼仍然無法按預期工作。您需要將一系列ASCII字符轉換爲數字。即,'9' - > 9,'100' - > 100。這將需要更多的代碼。

+0

是的,我指的是numbr變量。如果我將代碼從'mov ah,0Ah'更改爲'mov ah,01h',它將只接受一個號碼。因爲我相信它只會準備一個角色。 – user1225163 2013-03-05 17:33:47

+0

瞭解當您從輸入中讀取時,您正在閱讀字符,而不是數字。您將讀取'0'..'9'範圍內的字符(假設用戶只輸入數字字符),而不是0..100。你瞭解差異嗎? – 2013-03-05 17:53:29

+0

是的,我知道了,我想我必須解決我的代碼,並按照您的建議將字符序列轉換爲數字。 – user1225163 2013-03-05 17:57:29