Reputation: 405
I am new in assembly , I am using emu8086 question : user will input a number between 99 to 0 , let it is 88 i have to print 88 to zero .
to do this , i was trying this technique :
call AH,1
two times for MSB and LSB
copy MSB TO BH and LSB to BL
for each bh
->check if bh is 0
->true,then check bl trough update_it if it is 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 then do normal lsb decrement ( 77 to 76 )
but i always get the wrong output combining many characters , please mention my mistake . thanks in advance .
here is my code
.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
Upvotes: 2
Views: 1818
Reputation: 2731
your approach nearly worked, the main problem was: you've mistaken 0 with ascii '0' (0x30)
Your loop should end when '0' was reached (to be more precise: you also want to print '10','20','30' etc... so the loop has to stop when '0' was PASSED, not reached. therefore the -1 in cmp '0'-1
)
( I also allowed myself to move the outer loop to UNDER the loop body, to remove the need of the initial output of the first number )
.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
Upvotes: 4