编写一个循环以递减顺序打印 0 到 99(汇编)
write a loop to print 0 to 99 in decrement order (assembly)
我是装配新手,我正在使用 emu8086
题 :
用户将输入 99 到 0 之间的数字,让它是 88
我必须将 88 打印为零。
为了做到这一点,我正在尝试这种技术:
为MSB和LSB
[=47调用AH,1
两次=]
复制MSB到BH和LSB到BL
每个 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
您的方法几乎奏效了,主要问题是:您将 0 误认为是 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
我是装配新手,我正在使用 emu8086 题 : 用户将输入 99 到 0 之间的数字,让它是 88 我必须将 88 打印为零。
为了做到这一点,我正在尝试这种技术:
为MSB和LSB
[=47调用AH,1
两次=]复制MSB到BH和LSB到BL
每个 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
您的方法几乎奏效了,主要问题是:您将 0 误认为是 ascii '0' (0x30)
您的循环应该在达到“0”时结束(更准确地说:您还想打印“10”、“20”、“30”等...因此当“0”通过时循环必须停止,而不是达到。因此 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