[英]write a loop to print 0 to 99 in decrement order (assembly)
我是組裝新手 ,我正在使用emu8086問題:用戶將輸入一個介於99到0之間的數字,讓它是88我必須將88打印為零。
為此,我正在嘗試這種技術:
MSB和LSB兩次致電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
您的方法幾乎奏效了,主要問題是:您將ascii'0'(0x30)誤認為0
您的循環應在到達“ 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.