Hi! I need help for multiplication. We have to multiply 2 3-digit hex numbers.
I have made this last year but this one is a multiplication using 2-digit decimal numbers.
Hope you guys can help me with this one. :s


;
;2-digit MULTIPLICATION (in decimal)

jmp start

clrscr:
   mov ax,3
   int 10h
   ret
input_char:
   mov ah,1
   int 21h
   ret
print_char:
   mov ah,2
   int 21h
   ret
print_str:
   mov ah,9
   int 21h
   ret
check:
   cmp al,'0'
   jb mali
   cmp al,'9'
   ja mali
   ret
mali:
   lea dx,msg4
   call print_str
   jmp tapos

start:

call clrscr

;input 1st number
   lea dx,msg1
   call print_str

   call input_char
   call check
   sub al,30h
   mov bl,al
   mov al,10d
   mul bl
   push ax
   call input_char
   call check
   sub al,30h
   mov bl,al
   pop ax
   add al,bl
   push ax

;input 2nd number
   lea dx,msg2
   call print_str

   call input_char
   call check
   sub al,30h
   mov bl,al
   mov al,10d
   mul bl
   push ax
   call input_char
   call check
   sub al,30h
   mov bl,al
   pop ax
   add al,bl
   push ax

pop ax
mov bl,al
pop ax
mul bx              ;multiplication of the 2 numbers (stored in ax)

mov cx,000ah

div cx              ;ones digit(remainder) in dl
push dx             ;to stack
mov dl,00h          ;reset dl
div cx              ;tens digit in dl
push dx             ;to stack
div cl              ;thousands digit in al / hundreds digit in ah
or ax,3030h         ;convert to printable characters
push ax             ;to stack

lea dx,msg3
call print_str

;print thousands digit
   mov dl,al
   call print_char
;print hundreds digit
   pop ax
   mov dl,ah
   call print_char
;print tens digit
   pop dx
   or dl,30h
   call print_char
;print ones digit
   pop dx
   or dl,30h
   call print_char

tapos:
int 20h

msg1 db "Enter 1st number[2-digit DECIMAL(00-99)]: $"
msg2 db 0ah,0dh,"Enter 2nd number[2-digit DECIMAL(00-99)]: $"
msg3 db 0ah,0dh,"Their PRODUCT is: $"
msg4 db 0ah,0dh,"Input is not in DECIMAL. Please try again.$"
Posted on 2010-09-16 11:47:36 by superdibi
Multiplying two numbers is going to be just the same, whether they're "hex" or "decimal" - these are just two ways to represent the number! What's going to need to change is the way you convert the characters the user inputs into a number. Start by thinking about your "check" routine. You're going to want to allow 'a'..'f' or 'A'..'F', along with '0'..'9'.

In your current code, when "check" returns (if it does), you subtract '0' (30h). Since you're going to want to subtract a different amount if it's a hex digit, you might want to incorporate this into a "check_hex_and_convert" routine, or something...

Then you multiply by ten (if needed). To do hex, you'd want to multiply by 16. This can more easily(?) be accomplished by shifting left 4 bits... You do the two digits "in line", one after the other. You could do this with three digits, or maybe you'd want to do it in a loop. Make sure you've got a "next digit", multiply (or shift) the "result so far", and add (or "or") in the new digit... repeat until done...

Once you've got the two numbers, multiply "as usual". Now I suppose you'll want to print the result in hex, too(?). Same idea as above, only "backwards". Instead of "div", you can use "rol reg, 4" to get the "first" (or "next") digit into a convenient position, Make a copy of it(!), and mask off the low bits with "and reg, 0Fh" - that's your digit, add '0'... if it's over '9', add another 7 to get it into the 'A..'F' range. Easier than decimal, in a way, since we can get the digits in the right order to print 'em! :)

Getting the number from the user is probably the "hard part", since you need to check for both upper and lower case - or you could insist that the user stick to one case or the other. Or you could force the case yourself... really ought to make sure it's an "alpha" character, that *has* a case, but if it isn't, it's "invalid" anyway... "and reg, 0DFh" would force to upper...

Give it a shot - get one part working before you attempt the next part. If/when you run into trouble, ask again! :)

Best,
Frank

Posted on 2010-09-20 07:18:34 by fbkotler