如何显示存储在 DX:AX 中的 32 位 DIV 结果
How to display a 32-bit DIV result stored in DX:AX
我写这段代码是为了在一些计算后显示当前值。但是当它应该给出十进制 10 结果时,程序给出了错误的输出,它给出了 13107 结果,我找不到原因。在这个标签之前,我所做的基本上是从用户那里获取输入并将这些值存储在 si 寄存器中。
islem:
MOV AX,[SI+14]
MOV BX,[SI+10]
MOV CX,[SI+2]
SUB AX,BX
SUB AX,CX
MOV BX,[SI+8]
MOV [SI+16],AX
MOV DX,00H
MOV AX,[SI+16]
DIV BX
MOV [SI+18],OFFSET IE
MOV [SI+18],AX
MOV [SI+20],DX
CALL NEWLINE
mov dx, offset Ie_msg
mov ah,9
int 21h
MOV AX,[SI+18]
MOV DX,[SI+20]
mov bx,10 ;CONST
push bx ;Sentinel
a: mov cx,ax ;Temporarily store LowDividend in CX
mov ax,dx ;First divide the HighDividend
xor dx,dx ;Setup for division DX:AX / BX
div bx ; -> AX is HighQuotient, Remainder is re-used
xchg ax,cx ;Temporarily move it to CX restoring LowDividend
div bx ; -> AX is LowQuotient, Remainder DX=[0,9]
push dx ;(1) Save remainder for now
mov dx,cx ;Build true 32-bit quotient in DX:AX
or cx,ax ;Is the true 32-bit quotient zero?
jnz a ;No, use as next dividend
pop dx ;(1a) First pop (Is digit for sure)
b: add dl,"0" ;Turn into character [0,9] -> ["0","9"]
mov ah,02h ;DOS.DisplayCharacter
int 21h ; -> AL
pop dx ;(1b) All remaining pops
cmp dx,bx ;Was it the sentinel?
jb b ;Not yet
ret
MOV AX,[SI+18]
MOV DX,[SI+20]
您的计算结果来自除法 (div bx
)。 商仅保存在 AX
寄存器中 。 DX
寄存器包含除法的余数。
只需用 mov ax, [si+18]
加载 AX
,然后用 xor dx, dx
加载零 DX
。
以后你可以运行我的转换码...
我写这段代码是为了在一些计算后显示当前值。但是当它应该给出十进制 10 结果时,程序给出了错误的输出,它给出了 13107 结果,我找不到原因。在这个标签之前,我所做的基本上是从用户那里获取输入并将这些值存储在 si 寄存器中。
islem:
MOV AX,[SI+14]
MOV BX,[SI+10]
MOV CX,[SI+2]
SUB AX,BX
SUB AX,CX
MOV BX,[SI+8]
MOV [SI+16],AX
MOV DX,00H
MOV AX,[SI+16]
DIV BX
MOV [SI+18],OFFSET IE
MOV [SI+18],AX
MOV [SI+20],DX
CALL NEWLINE
mov dx, offset Ie_msg
mov ah,9
int 21h
MOV AX,[SI+18]
MOV DX,[SI+20]
mov bx,10 ;CONST
push bx ;Sentinel
a: mov cx,ax ;Temporarily store LowDividend in CX
mov ax,dx ;First divide the HighDividend
xor dx,dx ;Setup for division DX:AX / BX
div bx ; -> AX is HighQuotient, Remainder is re-used
xchg ax,cx ;Temporarily move it to CX restoring LowDividend
div bx ; -> AX is LowQuotient, Remainder DX=[0,9]
push dx ;(1) Save remainder for now
mov dx,cx ;Build true 32-bit quotient in DX:AX
or cx,ax ;Is the true 32-bit quotient zero?
jnz a ;No, use as next dividend
pop dx ;(1a) First pop (Is digit for sure)
b: add dl,"0" ;Turn into character [0,9] -> ["0","9"]
mov ah,02h ;DOS.DisplayCharacter
int 21h ; -> AL
pop dx ;(1b) All remaining pops
cmp dx,bx ;Was it the sentinel?
jb b ;Not yet
ret
MOV AX,[SI+18] MOV DX,[SI+20]
您的计算结果来自除法 (div bx
)。 商仅保存在 AX
寄存器中 。 DX
寄存器包含除法的余数。
只需用 mov ax, [si+18]
加载 AX
,然后用 xor dx, dx
加载零 DX
。
以后你可以运行我的转换码...