我在8086写这个汇编程序,但是它运行不正常。即使我使用单位数字,商和余数也会打印出一些随机符号。有人可以指出程序中的错误/错误吗?谢谢。
.model small
.stack 50h
.data
Divisor db ?
Dividend db ?
Quotient db ?
Remainder db ?
.code
main_method proc
mov ax, @data
mov ds, ax
mov ah, 01
int 21h
sub al, 48
mov Divisor, al
mov ah, 01
int 21h
sub al, 48
mov Dividend, al
mov bl, 00
mov al, 00
mov bl, Divisor
mov al, Dividend
div bl
mov Quotient, al
mov Remainder, ah
mov dl, Quotient
add dl, 48
mov ah, 02
int 21h
mov dl, Remainder
add dl, 48
mov ah, 02
int 21h
mov ah, 4ch
int 21h
main_method endp
end main_method
答案 0 :(得分:4)
DIV BL
将AX
中的16位值除以BL
,因此您应该清除那些您未使用的AX
位(在这种情况下为整个上部字节)。所以在DIV
之前添加:
MOV AH,0
或
XOR AH,AH ; XORing something with itself clears all bits
或者,如果您的目标是80386或更高,则可以将Mov Al, Dividend
替换为MOVZX AX, BYTE PTR Dividend
答案 1 :(得分:1)
基本上 DIV 功能除 AX 然后将商置于 AL 中,其余部分置于 AH 中。 AX 由 AH 和 AL 组成。因此,如果您只想划分 AL ,则必须确保 AH 0 。你可以在下面的方法中做出零点。
MOV AH, 0
OR
AND AH, 0
OR
XOR AH, AH