hello all,
In the following lines of code AX contains the hexadecimal value B(11 in decimal). This program suppose to convert the hexa value into decimal value but it is not giving the result instead it executes the AGAIN : labled instruction iteratively. Most importantly, the DIV DX gives correct result(AX=0001, DX =0001) when it is executed first time, on second time its result is unexpected(AX=3333, DX=0003). I don't understand what am I missing. please give me any idea.
Bye.
START: MOV AX,Bh ; Initialize AX to B(hex).
MOV CX,0 ; INITIALIZE THE DIGIT COUNTER
MOV BX,10 ; INITIALIZE THE DIVISOR
MOV DX,0 ; TO BE USED IN DIVISION AND TO AVOID GARBAGE
AGAIN : DIV BX ; QUOTIENT AX = AX/BX AND REMAINDER DX = AX%BX
PUSH DX ; SAVE/KEEP THE REMAINDER(I.E DIGIT)
INC CL ; CL = CL+1, INCREMENTS THE COUNTER BY 1
CMP AX,0 ; CHECK WETHER THE QUOTIENT IS ZERO
JA AGAIN ; IF NOT ZERO REPEAT THE DIVISION
NEXT : POP DX ; REMOVE THE DIGIT FROM STACK
ADD AL, 30H ; MAKE/CONVERT THE DIGIT INTO ASCII/CHAR DIGIT
MOV AH,2 ;O/S FUNCTION 2
INT 21H
LOOP NEXT ; REPEAT THE STEPS UNTILL THE DIGIT COUNTER IS ZERO
In the following lines of code AX contains the hexadecimal value B(11 in decimal). This program suppose to convert the hexa value into decimal value but it is not giving the result instead it executes the AGAIN : labled instruction iteratively. Most importantly, the DIV DX gives correct result(AX=0001, DX =0001) when it is executed first time, on second time its result is unexpected(AX=3333, DX=0003). I don't understand what am I missing. please give me any idea.
Bye.
START: MOV AX,Bh ; Initialize AX to B(hex).
MOV CX,0 ; INITIALIZE THE DIGIT COUNTER
MOV BX,10 ; INITIALIZE THE DIVISOR
MOV DX,0 ; TO BE USED IN DIVISION AND TO AVOID GARBAGE
AGAIN : DIV BX ; QUOTIENT AX = AX/BX AND REMAINDER DX = AX%BX
PUSH DX ; SAVE/KEEP THE REMAINDER(I.E DIGIT)
INC CL ; CL = CL+1, INCREMENTS THE COUNTER BY 1
CMP AX,0 ; CHECK WETHER THE QUOTIENT IS ZERO
JA AGAIN ; IF NOT ZERO REPEAT THE DIVISION
NEXT : POP DX ; REMOVE THE DIGIT FROM STACK
ADD AL, 30H ; MAKE/CONVERT THE DIGIT INTO ASCII/CHAR DIGIT
MOV AH,2 ;O/S FUNCTION 2
INT 21H
LOOP NEXT ; REPEAT THE STEPS UNTILL THE DIGIT COUNTER IS ZERO
DX must be rezeroed before each division. Remember that the entire content of the DX::AX pair is being divided.
Simply move your "AGAIN" lable at the "MOV DX,0" instruction and it should work as you intend.
Simply move your "AGAIN" lable at the "MOV DX,0" instruction and it should work as you intend.
Thank for your reply.
I did as you told and now the program's flow is correct but still it is not printing the decimal value converted from hexadecimal value. I shall be very thankful to you if you could spend some more time on it.
Regards.
I did as you told and now the program's flow is correct but still it is not printing the decimal value converted from hexadecimal value. I shall be very thankful to you if you could spend some more time on it.
Regards.
It could very well be that the result is effectively printed. However, if you are exiting the program immediately after the last instruction, your eyes may not be fast enough to see the result before the screen is refreshed. Finish your program with a "wait" of some kind (such as waiting for a keystroke before exiting) so that you have time to see your result on the screen.
NEXT : POP DX ; REMOVE THE DIGIT FROM STACK
ADD AL, 30H ; MAKE/CONVERT THE DIGIT INTO ASCII/CHAR DIGIT
I think you mean
next: pop dx
add dl,30h
absolutely I do. thanks
Don't forget an exit at the end...
mov ah,4ch
int 21h