Search code examples
assemblyx86dosbcd

multiplying two two digit numbers with both the numbers taken as input and result is also to be printed in Tasm


i am not understanding as to what can be done in this case single digit multiplication was possible using the AAM instruction however for AAM you need unpacked BCD therefore the result after two digit multiplication wont be accumulated in the AX register...

so i need an idea as to how i can proceed with this problem .thank you

here is how the input should look like (to take one two digit number) and BCD is desirable

mov dx,offset msg
mov ah,09h
int 21h

mov ah,01h
int 21h

mov ch,al
sub ch,30h
ror ch,04h

mov ah,01h
int 21h

mov cl,al
sub cl,30h
add cl,ch

Solution

  • mynumber1 db ?
    mynumber2 db ?
    
    mov ah,01h
    int 21h
    sub al, 30h <- ASCII to value 
    
    mov bl, 0Ah 
    mul bl <- multiply al with 10
    
    mov mynumber1, al <- mynumber1 now stores the tens (i.e. if you entered 8 it's now 80)
    
    mov ah,01h
    int 21h 
    sub al, 30h <- ASCII to value, al now stores the ones
    
    add mynumber1, al <- now your two-digit number is completely in mynumber1
    

    Now repeat the same for mynumber2. Then:

    mov al, mynumber1
    mov bl, mynumber2
    
    mul bl
    

    Now the product is in AX. Proceed by converting the content of AX back to BCD, if you really need to.


    The following code will print a number with up to 4 digits stored in AX:

    xor dx,dx
    mov bx,03E8h
    div bx
    call printdig
    
    mov ax,dx
    xor dx,dx
    mov bx,0064h
    div bx
    call printdig
    
    mov ax,dx
    xor dx,dx
    mov bx,000Ah
    div bx
    call printdig
    
    ;remainder from last div still in dx
    mov al,dl
    call printdig
    

    Note that you need the following helper function, which prints a single digit from al:

    printdig proc
    push dx
    mov dl,al
    add dl,30h
    mov ah,02h
    int 21h
    pop dx
    ret
    printdig endp