2

我是汇编新手,我正在使用emu8086 问题:用户将输入 99 到 0 之间的数字,让它是 88 我必须打印 88 到零。

为此,我正在尝试这种技术:

  1. AH,1两次调用MSBLSB

  2. 复制MSBBHLSBBL

  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
4

1 回答 1

4

你的方法几乎奏效了,主要问题是:你把 0 误认为 ascii '0' (0x30)
你的循环应该在达到 '0' 时结束(更准确地说:你还想打印 '10','20 ','30' 等......所以当 '0' 被通过时,循环必须停止,没有达到。因此 -1 in cmp '0'-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
于 2016-06-08T13:39:53.117 回答