assemblyx86-16divisiontasmdosbox

I don't know why the division produces a quotient and a remainder that are wrong


How to fix this one: I don't know why both the quotient and the remainder are wrong.

My DOSBox Code:

.model small
.stack 100h
.data

Dividend        db 0dh,0ah,"Enter Dividend    : $"  ;string
Divisor         db 0dh,0ah,"Enter Divisor     : $"
Quotient        db 0dh,0ah,"Display Quotient  : $"
Remainder       db 0dh,0ah,"Display Remainder : $"

.code
main proc   ;main program here
            
mov ax,@data                ;initialize ds
mov ds,ax
            
mov ah,09h                  ;Show Enter Dividend
lea dx, Dividend
int 21h
            
mov ah,01h                  ;Input Dividend
int 21h
mov bh,al
            
mov ah,09h                  ;Show Enter Divisor
lea dx, Divisor
int 21h
            
mov ah,01h                  ;Input Divisor
int 21h
mov bl,al
            
mov ah,00h                  ;Divide
mov al,bh
div bl
mov cx,ax
add cx,3030h
            
mov ah,09h                  ;Show Display Quotient
lea dx, Quotient
int 21h
            
mov ah,02                   ;Display Quotient
mov dl,cl
int 21h
            
mov ah,09h                  ;Show Display Remainder
lea dx, Remainder
int 21h
            
mov ah,02                   ;Display Remainder
mov dl,ch
int 21h
            
mov ah,4Ch                  ;end here
int 21h
            
main endp
end main    

Error Result:

Enter Dividend    : 7
Enter Divisor     : 3
Display Quotient  : 1
Display Remainder : 4

Solution

  • The strange results that you show us stem from the fact that the program executes the division 55 / 51 which will indeed produce a quotient of 1 and a remainder of 4.

    The DOS.GetCharacter function 01h that you use for input returns an ASCII code in AL. When you push 7 on the keyboard, the AL register will hold the ASCII code 37h or 55 in decimal. Before using this input in a calculation you need to convert from character into the value that the digit represents. A simple sub al, 30h does that. Of course you need to do the same thing for the second input too:

    ...
    mov ah, 09h                  ;Show Enter Dividend
    lea dx, Dividend
    int 21h
                
    mov ah, 01h                  ;Input Dividend
    int 21h
    sub al, 30h
    mov bh, al
                
    mov ah, 09h                  ;Show Enter Divisor
    lea dx, Divisor
    int 21h
                
    mov ah, 01h                  ;Input Divisor
    int 21h
    sub al, 30h
    mov bl, al
    ...