MASM 中 8086 汇编中的除法

use*_*056 2 assembly masm masm32

我正在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
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 5

DIV BL将 16 位值除以AX,因此您应该清除那些不使用的BL位(在本例中为整个高字节)。AX因此DIV,在 之前添加:

MOV AH,0
Run Code Online (Sandbox Code Playgroud)

或者

XOR AH,AH  ; XORing something with itself clears all bits
Run Code Online (Sandbox Code Playgroud)


或者,如果您的目标是 80386 或更高版本,您可以替换Mov Al, DividendMOVZX AX, BYTE PTR Dividend