Loops 写入循环以按递减顺序打印0到99(程序集)
我是装配新手,我使用的是emu8086 问题: 用户将输入一个介于99到0之间的数字,设为88 我必须打印88到零 为此,我尝试了以下技术: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 (
AH,1
两次 ->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