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 startclrscr:    mov ax,3    int 10h    retinput_char:    mov ah,1    int 21h    retprint_char:    mov ah,2    int 21h    retprint_str:    mov ah,9    int 21h    retcheck:    cmp al,'0'    jb mali    cmp al,'9'    ja mali    retmali:    lea dx,msg4    call print_str    jmp taposstart: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 axpop axmov bl,alpop axmul bx              ;multiplication of the 2 numbers (stored in ax)mov cx,000ahdiv cx              ;ones digit(remainder) in dlpush dx             ;to stackmov dl,00h          ;reset dldiv cx              ;tens digit in dlpush dx             ;to stackdiv cl              ;thousands digit in al / hundreds digit in ahor ax,3030h         ;convert to printable characterspush ax             ;to stacklea dx,msg3call 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_chartapos:int 20hmsg1 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