Loops 写入循环以按递减顺序打印0到99(程序集)

Loops 写入循环以按递减顺序打印0到99(程序集),loops,if-statement,assembly,emu8086,Loops,If Statement,Assembly,Emu8086,我是装配新手,我使用的是emu8086 问题: 用户将输入一个介于99到0之间的数字,设为88 我必须打印88到零 为此,我尝试了以下技术: 对MSB和LSB调用AH,1两次 将MSB复制到BH和LSB复制到BL 对于每个bh ->检查bh是否为0 ->如果为true,则检查bl是否为0 ->true,then goto exit (because number is 00) ->false,then decrement msb and add 9 to lsb (

我是装配新手,我使用的是emu8086 问题: 用户将输入一个介于99到0之间的数字,设为88 我必须打印88到零

为此,我尝试了以下技术:

  • MSBLSB调用
    AH,1
    两次

  • MSB复制到BHLSB复制到BL

  • 对于每个bh

    ->检查bh是否为0

    ->如果为true,则检查bl是否为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
    

    您的方法几乎成功了,主要问题是:您将0与ascii“0”(0x30)弄错了
    循环应在到达“0”时结束(更准确地说:您还希望打印“10”、“20”、“30”等…因此循环必须在通过“0”而未到达时停止。因此
    cmp“0'-1
    中的-1)

    (我还允许自己将外循环移动到循环体下方,以消除第一个数字初始输出的需要)


    我首先想到的是:确保保存BL和BH(在调用int 021之前使用
    推送bx
    ,然后恢复它们
    弹出bx
    。int21可能会破坏bx(不是在家atm,所以我无法检查)请记住,“0”不是0。用户输入的字符不是数字,当您按0键时,您会得到AL中的数字30h。0和ASCII“0”也不等效…您必须检查“0”以确定循环的结束,而不是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