簡體   English   中英

編寫循環以遞減順序打印0到99(匯編)

[英]write a loop to print 0 to 99 in decrement order (assembly)

我是組裝新手 ,我正在使用emu8086問題:用戶將輸入一個介於99到0之間的數字,讓它是88我必須將88打印為零。

為此,我正在嘗試這種技術:

  1. MSBLSB兩次致電AH,1兩次

  2. MSB復制到BH ,將LSB復制到BL

  3. 每bh

    ->檢查bh是否為0

    -> true,然后檢查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 

    -> false,然后正常進行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

您的方法幾乎奏效了,主要問題是:您將ascii'0'(0x30)誤認為0
您的循環應在到達“ 0”時結束(更准確地說:您還希望打印“ 10”,“ 20”,“ 30”等...,因此循環必須在通過“ 0”時停止,而不是達到。因此在cmp '0'-1為-1)

(我還允許自己將外部循環移動到循環主體下,從而無需使用第一個數字的初始輸出)

.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM