2016-06-08 40 views
2

我在組裝新的打印0到99中,我使用emu8086 問題: 用戶將輸入之間99到0的數,讓它是88 我有打印88爲零。寫一個循環中遞減順序(組裝)

要做到這一點,我是想這種技術:

  1. 呼叫AH,1兩次MSBLSB

  2. 副本MSB TO BHLSBBL

  3. 每個BH

    - >檢查,如果BH是0

    - >真,則檢查BL槽update_it如果是0

    ->true,then goto exit (because number is 00) 
    
        ->false,then decrement msb and add 9 to lsb (make 80 to 79) 
         and goto loop 2 to print it 
    

    - >假然後執行正常LSB遞減(77至76)

但我總是得到錯誤的輸出結合許多字符,請提到我的錯誤。提前致謝 。

這裏是我的代碼

.MODEL SMALL 

.STACK 100H 

.DATA 

.CODE 
MAIN PROC 

;INITIALIZE DS 
MOV AX,@DATA 
MOV DS,AX 

MOV AH,1   ;SCAN MSB 
INT 21H   ;MSB IS NOW AT AH 
MOV BH,AL  ;SAVE IT TO BH 

       ;SCAN LSB 
MOV AH,1   ;LSB IS NOW AT AL 
INT 21H   ;SAVE IT TO BL 
MOV BL,AL 

MOV AH,2   ;SINGLE CHAR PRINT 
MOV DL,0DH  ;CARRIAGE RETURN 
INT 21H   ;AL = 0DH 

MOV DL,0AH  ;LINE FEED 
INT 21H   ;AL = 0AH 

;PRINT THE FIRST NUMBER 

MOV DL,BH  ;MSB 
INT 21H   ; 

MOV DL,BL  ;LSB 
INT 21H   ; 



LOOP1: 

    CMP BL,0  ;LET 70 
        ;SO UPDATE O TO 9 
        ;AND 7 TO 6 
    JE UPDATE_IT ;IF TRUE 

    JMP LOOP2  ;IF FASLE 


LOOP2: 


    MOV DL,' '  ;SPACE 
    INT 21H 

    MOV DL,BH  ;MSB 
    INT 21H 

    MOV DL,BL  ;LSB 
    INT 21H 


    DEC BL   ;DECREMENT LSB 


    JMP LOOP1 

UPDATE_IT: 

    CMP BH,0  ;BOTH MSB 
        ;AND LSB ARE ZERO 
    JE EXIT_  ;IF TRUE EXIT = 00 


    DEC BH   ;IF FALSE 
        ;DEC MSB 
    ADD BL,9  ;TURN LSB O TO 9 
        ;EXAMPLE 80 TO 79 
    JMP LOOP2  ;DO NORMAL DECREMENT 

;DOS EXIT      
EXIT_:    
MOV AH,4CH   ;DOS EXIT FUNCTION 
INT 21H   ;EXECUTE 

MAIN ENDP 

END MAIN 
+1

我想到的第一個問題是:確保保存BL和BH(在調用int 021之前使用'push bx',並在之後恢復它們'pop BX'。 int21可能會破壞BX(不在家atm,所以我不能檢查它) – Tommylee2k

+1

請記住,'0'不是0.用戶輸入的字符不是數字,當你按下鍵* 0 *時,你在* AL * 。 –

+1

也0和ASCII'0'不相等...你必須檢查'0'來確定循環的結束,而不是0 – Tommylee2k

回答

4

你的做法近的工作,主要的問題是:你與ASCII誤0「0」(的0x30)
你的循環應該「0」結束時達到(更準確地說:你也想打印'10','20','30'等等......所以當'0'被通過時,循環不得不停止,因此在-)

(我還允許自己將外環移到環體下方,以消除對第一個數字的初始輸出的需要)

.MODEL SMALL 
.STACK 100H 
.DATA 

.CODE 
MAIN PROC 

;INITIALIZE DS 
MOV AX,@DATA  ; not sure this is really needed in model .small 
MOV DS,AX 

MOV AH,1   ;SCAN MSB 
INT 21H   ;MSB IS NOW AT AH 
MOV BH,AL  ;SAVE IT TO BH 

       ;SCAN LSB 
MOV AH,1   ;LSB IS NOW AT AL 
INT 21H   ;SAVE IT TO BL 
MOV BL,AL 

MOV AH,2   ;SINGLE CHAR PRINT 
MOV DL,0DH  ;CARRIAGE RETURN 
INT 21H   ;AL = 0DH 
MOV DL,0AH  ;LINE FEED 
INT 21H   ;AL = 0AH 

LOOP1: 
    MOV DL,' '  ;SPACE 
    INT 21H 
    MOV DL,BH  ;MSB 
    INT 21H 
    MOV DL,BL  ;LSB 
    INT 21H 

    DEC BL   ;DECREMENT LSB 
    CMP BL,'0'-1 ;LET 70 
        ;SO UPDATE O TO 9 
        ;AND 7 TO 6 
    JNE LOOP1  ;IF FALSE 

UPDATE_IT:   ; IF LST was zero 

    MOV BL,'9'  ;TURN LSB O TO 9 
        ;EXAMPLE 80 TO 79 

    DEC BH 
    CMP BH,'0'-1 ;BOTH MSB 
        ;AND LSB ARE ZERO 
    JNE LOOP1  

;DOS EXIT      
EXIT_:    
MOV AH,4CH   ;DOS EXIT FUNCTION 
INT 21H   ;EXECUTE 

MAIN ENDP 
END MAIN