assembly - 汇编器 8086 将 32 位数除以 16 位数

标签 assembly x86 division x86-16

我尝试将 32 位数除以 16 位数。 例如 10000000h 除以 2000h。根据我尝试做的设计,我除以 4 个右边的数字是除数,然后是 4 个左边的数字是除数。

这是我的代码:

.DATA 
num dd 10000000h
divisor dw 2000h 

result dd ? 
remainder dw ? 

.CODE
main:

mov ax,@DATA    
mov ds,ax 

xor dx,dx
mov cx ,word ptr divisor
mov bx,offset num
mov ax,[bx]
div cx

mov bx,offset result 
mov [bx],ax 
mov bx,offset num
mov ax,[bx+2]


mov ax,[bx+2]
div cx 
mov bx,offset result 
mov [bx+2],ax 

我的可变结果为零。不确定是分界设计的问题还是只是一个小错误。

最佳答案

使用16位的div指令,需要将被除数的高16位放入dx,低16位放入ax。您已经为第一个 div 完成了后者,但是您将 dx 设置为 0,因此您最终计算的是 0h/2000h,即 0。

相反,你想要这样的东西:

mov bx, offset num
mov ax, [bx]
mov dx, [bx+2]
mov cx, word ptr divisor
div cx

当然,这仅在结果适合 16 位时有效——如果不适合,div 指令将引发 #DE 异常。

关于assembly - 汇编器 8086 将 32 位数除以 16 位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41501491/

相关文章:

未在 Linux 内核模块中执行的 CLI 指令

Java 使用 BigDecimal 除法

assembly - 在汇编中编写 __attribute((constructor)) 函数 - 可以完成吗?

c - 堆栈、数据和指令段在哪里实现?

c - 读取ARM中的堆栈指针值

algorithm - 使用多寄存器处理大量数据

c++ - 如何在 x86 程序集中移动两个 float 相乘的结果?

python - 楼层划分的递归函数

go - big.Float 中的 Div 和 Mod

linux - 在 x86_64 AT&T 中调用 scanf 时出现段错误