写一个循环以递减顺序打印0到99(汇编)

时间:2016-06-08 08:50:40

标签: loops if-statement assembly emu8086

我是装配新手,我使用的是 emu8086 题 : 用户将输入99到0之间的数字,让它为88 我必须将88打印到零。

要做到这一点,我正在尝试这种技术:

  1. MSB LSB

  2. 致电AH,1两次
  3. MSB 复制到 BH LSB 复制到 BL

  4. 每个bh
  5. - >检查bh是否为0

    - >如果为0,则检查bl_0是否为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)

  6. 但我总是得到错误的输出结合很多字符,请提一下我的错误。提前谢谢。

    这是我的代码

    .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 个答案:

答案 0 :(得分:4)

你的方法几乎奏效,主要问题是:你用ascii' 0' (0x30)
你的循环应该在' 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