2017-02-25 42 views
-1

我正在寫一個8086彙編語言的程序,要求1-9之間的單個數字,然後存儲它。如果它不在1-9之間,則應該循環回去。如何測試輸入字符是否在1-9之間?

什麼是一種很好的方式來測試它,並讓它循環回來(並允許你輸入另一個數字),直到滿足要求爲止?

我迄今爲止代碼:

section .data 
    prompt1 db "Enter a single digit digit between 1-9 --> $" 
section .text 
    ;Display prompt 
    mov ah,9  ; print prompt 
    mov dx,prompt1 ; load register with prompt1 
    int 21h   ; display it 
    ; Input character and store. 
    mov ah,1  ; reach char fcn 
    int 21h   ; read character into al 
    mov bl,al  ; store character into bl 
+0

哪一部分是你造成的問題?你知道比較,條件分支和ASCII碼嗎? – Jester

+0

我瞭解條件分支,但不熟悉比較。 – user3394363

+2

然後閱讀關於'cmp'的參考頁面。 TL; DR:你可以做一些像'cmp bl','1''然後使用你已經知道的條件分支。 – Jester

回答

2

我沒有測試過,但總的來說,代碼應該檢查是否BL比39H小於31H或更大。這些是19的ASCII值。

所以一些示例代碼看起來是這樣的:

; Input character and store. 
loop1:    ; added label 
    mov ah,1  ; read char fcn 
    int 21h   ; read character into AL 
    mov bl, al  ; store character into BL 
    ; now comes the additional code 
    cmp bl, 31h  ; compare BL to the ASCII value of '1' 
    jb loop1  ; jump back if ASCII value is less than '1' = 31h 
    cmp bl, 39h  ; compare BL to the ASCII value of '9' 
    ja loop1  ; jump back if ASCII value is greater than '9' = 39h 
    ; BL contains an ASCII value between '1' and '9' which integer value can be acquired by subtracting the value 30h 
+1

'jl'已簽名,'ja'未簽名。這是行得通的,因爲你不需要127以上的輸入值來工作,但是它看起來像讀取源代碼時的錯誤,所以它會讓我煩惱很多,因爲我不得不考慮它每次都是如何工作的。 「jb」在「下面」沒有簽名。 – Ped7g

+1

在**兩者比較(使用'AL')之後,通過將'AL'移動到'BL' ** **,您將獲得免費的代碼大小優化。 –

+0

@ Ped7g:謝謝。當然你是對的。我修正了我的錯誤。 – zx485

相關問題