0

So I'm new to assembly language (Being honest, It's still confusing to me) and I need to make a multiplication table code for 3-digit numbers in assembler. This program needs to multiply as many times as the user says to but it doesn't have to be greater than 100. The result should print the multiplication table of a given 3-digit number up until the first 100 values (Depending on what the user asks for):

.model small
.stack 
.data
.code
 
    cif1 db ?
    cif2 db ?
    cif3 db ?
    cif4 db ?
    n1 db ?
    n2 db ?
    n3 db ?
    top db ?
    cic db 1
    ac db 0
    msg db "Type in the number: $"
    msg2 db "Type in the limit: $"   
    msg3 db "RESULTS: $"
    
.startup

;Clear Screen
    mov cx, 1h
    mov ah, 00h
    mov al, 03
    int 10h     
    
;Message
    mov ah, 09h
    lea dx, msg
    int 21h 
    
;Units
    mov ah, 01h
    int 21h
    sub al, 30h
    mov cif1, al
    
;Tens
    mov ah, 01h
    int 21h
    sub al, 30h
    mov cif2, al 
             
;Hundreds             
    mov ah, 01h
    int 21h
    sub al, 30h
    mov cif3, al 
    
;Clear Screen 2
    mov cx, 1h
    mov ah, 00h
    mov al, 03
    int 10h 
    
;Message 2
    mov ah, 09h
    lea dx, msg2
    int 21h 
    
;Limit Input
    mov ah, 01h
    int 21h
    sub al, 30h
    mov top, al
    inc top 

;Clear Screen 3
    mov cx, 1h
    mov ah, 00h
    mov al, 03
    int 10h 
    
;Message 3
    mov ah, 09h
    lea dx, msg3
    int 21h

    
start:
;New line
    mov ah, 02h
    mov dl, 0ah
    int 21h
    mov ah, 02h
    mov dl, 0dh
    int 21h
    
;Data Load
    mov ah, 02h
    mov dl, cif1
    add dl, 30h
    int 21h
    
    mov ah, 02h
    mov dl, cif2
    add dl, 30h
    int 21h
    
    mov ah, 02h
    mov dl, cif3
    add dl, 30h
    int 21h 
             
    mov ah, 02h
    mov dl, "*"
    int 21h         
             
    mov dl, cic
    add dl, 30h
    mov ah, 02h
    int 21h
     
    mov al, cl
    mov cif4, al
    
    mov ah, 02h
    mov dl, "="
    int 21h
    
;Math
    mov al, cic
    mov bl, cif3
    mul bl
    mov ah, 0h 
    
    aam  
    mov n3, al
    mov ac, ah
    
    mov al, cic
    mov bl, cif2
    mul bl    
    mov ah, 0h
    
    aam
    mov ac, ah
    mov n2, al
    
    mov al, cic
    mov bl, cif1
    mul bl  

    mov n1, al
    mov bl, ac
    add n1, bl
    
    mov ah, 000h
    mov al, n1
    
    aam 
    mov n1, al
    mov ac, ah

;Result Printing
    mov ah, 02h
    mov dl, ac
    add dl, 30h
    int 21h  

    mov ah, 02h
    mov dl, n1
    add dl, 30h
    int 21h   
    
    mov ah, 02h
    mov dl, n2
    add dl, 30h
    int 21h    
    
    mov ah, 02h
    mov dl, n3
    add dl, 30h
    int 21h
    
    inc cic
    mov al, cic
    cmp al, top
    
    jne start
    je end
    
end:

.exit  

I'm using the "top" variable as a counter but, as I said, I've only managed to get it to 9.

  • 1
    Probably a duplicate of [Displaying numbers with DOS](https://stackoverflow.com/q/45904075) or maybe of [NASM Assembly convert input to integer?](https://stackoverflow.com/q/19309749) since I see you're storing input digits separately instead of accumulating a total, and when reloaded I don't see a multiply by 10 there either. – Peter Cordes Mar 25 '22 at 06:19

0 Answers0