How can i show the 3 digit answer?
Note: I have Base 3 needed in addend and augend same as the answer need is base 3 how can i show ? I'am using notepad then tasm add.asm / tlink add / add. to execute the program. I'am new in dosbox so just want to learn how to show 3 digit answer in base 3.
My Code in notepad :
.model small
.stack 100h
.data
Spc db 0dh,0ah, " $" ;New Line
ErAd31 db 0dh,0ah, "Input only number to proceed [00-22 only]. $" ;Error Input Addition Addend and Augend
ErAd32 db 0dh,0ah, "Input only [Y/y] Add Again [N/n] No. $" ;Error Input Add Again
;Bases Calculation in Calculator
BsA31 db 0dh,0ah, " Base 03 Addition " ;Addition Base 03
db 0dh,0ah, " "
db 0dh,0ah, "Addend[00-22]: $"
BsA32 db 0dh,0ah, "Augend[00-22]: $"
SumA db 0dh,0ah, " Sum is : $" ;Sum
AgA db 0dh,0ah,0dh,0ah, "Add Again[Y/N]? : $" ;Sum Again
;Calculation Logic
Dg11 db 0
Dg12 db 0
NoAd1 db 0
NoAd2 db 0
SumAd db 0
.code
main proc
mov ax,@data ;initialize ds
mov ds,ax
AdBs3:
mov ah,09h
lea dx, Spc
int 21h
lea dx, BsA31 ;Addend
int 21h
mov ah,01h
int 21h ;1st Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg11,al
mov ah,01h
int 21h ;2nd Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg12,al
mov al, Dg11
mov bl,10h
mul bl
mov NoAd1,al
mov al,Dg12
add NoAd1,al
jmp AdBs32
ErrAd31:
mov ah,09h
lea dx, Spc
int 21h
lea dx, ErAd31
int 21h
jmp AdAgain
Ad1:
cmp al, 59h or 79h
je AdBs3
AdBs32:
mov ah,09h
lea dx, BsA32 ;Augend
int 21h
mov ah,01h
int 21h ;1st Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg11,al
mov ah,01h
int 21h ;2nd Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg12,al
mov al, Dg11
mov bl,10h
mul bl
mov NoAd2,al
mov al,Dg12
add NoAd2,al
;Addition
mov bl, NoAd1
add bl, NoAd2
mov cx,bx
add cx,3210h
mov ah,09h
lea dx, SumA
int 21h
mov ah,02h
mov dl,ch
int 21h
mov dl,cl
int 21h
jmp AdAgain
AdAgain:
mov ah,09h
lea dx, Spc
int 21h
lea dx, AgA
int 21h
mov ah,01h
int 21h
cmp al, 59h or 79h
je Ad1
cmp al, 4Eh or 6Eh
je AdOut
AdOut:
mov ah,4Ch ;end here
int 21h
main endp
end main
Needed Output:
Base 03 Addition
Addend[00-22]: 22
Augend[00-22]: 22
Sum is :121
Add Again[Y/N]? : N
CodePudding user response:
cmp al, 29h <================ jle ErrAd31 cmp al, 33h jge ErrAd31
and
mov al, Dg11 mov bl, 10h <================ mul bl
and
mov bl, NoAd1 add bl, NoAd2 mov cx, bx add cx, 3210h <================
You seem to have trouble with the hexadecimal number system!
To check the validity of the inputted digit, you should compare with 2Fh instead of 29h. You're forgetting that hex also uses A, B, C, D, E, and F as digits. The ASCII code directly below "0" is 2Fh (because the ASCII code of "0" is 30h).
To convert your base-3 input, the multiplication should use 3, not 10h which is in effect equal to 16.
I have no idea about what you think this
add cx, 3210h
could be doing.
how to show 3 digit answer in base 3.
Displaying a number in base 3 is no different from displaying a number in base 10.
I copied next snippet of code from my answer at Displaying numbers with DOS. I changed mov bx, 10
into mov bx, 3
et voilà...
mov al, NoAd1
add al, NoAd2
mov ah, 0
; Your number is in AX
mov bx, 3 ; CONST
xor cx, cx ; Reset counter
.a: xor dx, dx ; Setup for division DX:AX / BX
div bx ; -> AX is Quotient, Remainder DX=[0,2]
push dx ; (1) Save remainder for now
inc cx ; One more digit
test ax, ax ; Is quotient zero?
jnz .a ; No, use as next dividend
.b: pop dx ; (1)
add dl, "0" ; Turn into character [0,2] -> ["0","2"]
mov ah, 02h ; DOS.DisplayCharacter
int 21h
AdAgain:
It's cumbersome how you repeat or exit the program
mov ah,01h int 21h cmp al, 59h or 79h je Ad1 cmp al, 4Eh or 6Eh je AdOut AdOut:
- This use of
or
does not offer a choice between UCase and LCase. - Jumping to the top with a conditional jump forced you to introduce an intermediate label because the target was too far away.
- If the user presses none of the mentioned keys, you exit the program anyway. Then why bother to compare with "N" or "n"?
Better use:
AdAgain:
mov ah, 09h
lea dx, Spc
int 21h
lea dx, AgA ; "Continue?"
int 21h
.z: mov ah, 01h
int 21h
or al, 32 ; Make LCase
cmp al, "n" ; 6Eh
je AdOut
cmp al, "y" ; 79h
jne .z ; (*)
jmp AdBs3 ; (**)
AdOut:
(*) The user must respond with "N", "n", "Y", or "y", else the question gets repeated.
(**) This jmp
can jump all the way to the top. You no longer need the intermediate label Ad1.