【问题标题】:What happens when we divide a 16-bit number with a 8-bit 1?当我们将一个 16 位数字除以一个 8 位 1 时会发生什么?
【发布时间】:2020-05-23 07:48:34
【问题描述】:

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

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

每当执行以下代码时,我的指令指针都会放错位置。

MOV AX, 9999H
MOV BL, 1
DIV BL

有什么方法可以强制 8086 用 ax 做商,除以 AX 做余数?

【问题讨论】:

  • @SepRoland:不能同时是 TASM 和 EMU8086。将[x86-16] 用于 16 位代码,包括 8086。问题文本可以处理少数情况,即 8086 与 286 答案之间存在很大差异。 ([8086] 是 [x86-16] 的标签同义词,这很好,尽管标签自动完成 8086 到 emu8086)。 emu8086 是一种特定的汇编器 + 模拟器 + 调试器,对于 ISA 的问题并不是很好。
  • @PeterCordes 我不知道这一点。无论如何,至少有 12 个问题同时标记了 TASM 和 EMU8086。
  • @SepRoland:如果是关于 asm 语法,那么 TASM 和 emu8086 确实使用类似 MASM 的语法,因此它们可能不需要重新标记。也许不值得为现有的老问题烦恼。

标签: assembly x86-16 tasm integer-division


【解决方案1】:

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


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

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

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

你的例子:

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

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

评论后编辑

很抱歉不清楚...我实际上想要做的是将一个 8 位寄存器除以一个 16 位寄存器以获得 16 位商...我不需要余数

一个例子是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 是 16 位数字...BL 是 8 位数字...执行一些指令 DIV BL.. AX 现在是 16 位商

如果您绝对要执行DIV BL,它将始终计算AX / BL,在AL 中产生一个8 位商,在AH 中产生一个8 位余数。您无法改变这一点。
现在,正如您之前所说,如果您不需要该余数并且希望整个 AX 寄存器中的商,那么您只需将 AH 寄存器归零即可。

div bl
mov ah, 0   ; Quotient is now AX

【讨论】:

  • 8086 assembly on DOSBox: Bug with idiv instruction? 显示了 div 的文档,并谈到 8 位是特殊情况,而 DX:AX 输入/结果更广泛。
  • 很抱歉不清楚...我实际上想要做的是将一个 8 位寄存器除以一个 16 位寄存器以获得 16 位商...我不需要剩下的
  • @MotherofStackoverflow 查看我修改后的答案。
  • AX 是 16 位数字...BL 是 8 位数字...执行一些指令 DIV BL.. AX 现在是 16 位商数
猜你喜欢
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2019-08-26
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多