我不知道为什么除法会产生错误的商和余数

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

如何解决这个问题:我不知道为什么商和余数都不对。

我的 DOSBox 代码:

.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    

错误结果:

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

您向我们展示的奇怪结果源于程序执行除法 55 / 51 这确实会产生商 1 和余数 4。

DOS.GetCharacter函数01h用于在AL中输入returns一个ASCII码。当您按下键盘上的 7 时,AL 寄存器将保存 ASCII 码 37h 或十进制的 55。在计算中使用此输入之前,您需要将字符转换为数字表示的值。一个简单的 sub al, 30h 就可以做到这一点。当然你也需要为第二个输入做同样的事情:

...
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
...