assembly - 当我们将 16 位数字除以 8 位 1 时会发生什么?

标签 assembly x86-16 tasm integer-division

据我所知,如果我们使用带有 8 位数字的 div 指令,那么商就是存储在 AL 中的 8 位数字,余数又是存储在 AH 中的 8 位数字

但是如果我们将 16 位数字除以 1 会怎样?

每当执行下面的代码时,我的指令指针就会被放错地方。

MOV AX, 9999H
MOV BL, 1
DIV BL

有什么方法可以强制 8086 在除以 AX 时使用 ax 求商并使用余数吗?

最佳答案

在 8086 处理器上,您可以在字节大小的划分和字大小的划分之间进行选择。

<小时/>

字节大小的除法会将 AX 中的单词除以您指定的字节大小的操作数。您的示例代码使用这种划分。商进入 AL 寄存器,余数进入 AH 寄存器。

在您的示例中,9999h 除以 1 得到的商为 9999h。此结果太大,无法放入 AL 中,因此您会遇到 #DE 除法异常。

大小的除法会将 DX:AX 中的双字除以您指定的大小的操作数。商进入 AX 寄存器,余数进入 DX 寄存器。

你的例子:

XOR DX, DX
MOV AX, 9999H
MOV BX, 1
DIV BX

这次没有问题,AX 寄存器将保存商 9999h,DX 寄存器将保存余数 0。

评论后编辑

I'm sorry to be unclear...What I am actually trying to do is divide a 8 bit register by a 16-bit register in order to obtain a 16-bit quotient...i dont need the remainder

一个例子是 BL/CX 生成 AX

如果这就是您想要做的,那么请注意,如果 16 位除法器 (CX) 中的值大于 8 位被除数 (BL ),该整数除法的商(AX)将始终为零。不是很壮观!

技巧是扩展被除数,以便我们可以使用字大小的除法,因为它使用所需的 16 位除法器。

mov al, bl  ; \
mov ah, 0   ; / sets AX=BL
cwd         ; sets DX=0
div cx      ; divides DX:AX by CX producing quotient AX

作为替代方案,前提是 CH 为零:

mov al, bl  ; \
mov ah, 0   ; / sets AX=BL
div cl      ; divides AX by CL producing quotient AL
mov ah, 0   ; desired 16-bit quotient AX

评论后编辑 2

AX is a 16 bit number...BL is the 8-bit number...Perform some instructions DIV BL.. AX is now the 16-bit quotient

如果您绝对想要执行DIV BL,它总是会计算AX/BL,在AL中生成一个8位商,并生成一个AH 中的 8 位余数。您无法改变这一点。
现在,正如您之前所说,如果您不需要余数并希望整个 AX 寄存器中的商,您只需添加将 AH 归零即可注册。

div bl
mov ah, 0   ; Quotient is now AX

关于assembly - 当我们将 16 位数字除以 8 位 1 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60108962/

相关文章:

assembly - 汇编零和等于之间的区别

assembly - 如何正确使用 ADDIS 和 ADDI 将 32 位常量直接求和到寄存器?

c++ - 从堆栈帧获取函数名称

intel - 将十六进制数组转换为十进制数英特尔 8086 汇编语言

assembly - 将 .data 部分中定义的整数移至寄存器

assembly - 使用汇编在 DOS 中以 x86 实模式设置和重置键盘中断服务例程

assembly - 我试图在 AAM 指令之后使用 AX 中存储的值将其除以 2,为什么它不适用于 2 位数字输出?

assembly - 删除程序集中的文件

assembly - x86 程序集 : Pass parameter to a function through stack

assembly - 从文档文件在 Turbo C++ 3.0 中创建内联汇编代码 (TASM)