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

Assembly 当我们将16位数字除以8位1时会发生什么?,assembly,x86-16,tasm,integer-division,Assembly,X86 16,Tasm,Integer Division,据我所知,如果我们使用带有8位数字的div指令,那么商是存储在AL中的8位数字,剩余的是存储在AH中的8位数字 但是如果我们把一个16位的数字除以1呢 每当执行下面的代码时,我的指令指针就被放错了位置 MOV AX, 9999H MOV BL, 1 DIV BL 我们有没有办法强迫8086用ax来表示商,用do来表示余数,同时除以ax 在8086处理器上,您可以选择字节大小的除法和字大小的除法 字节大小的除法将把AX中的字除以指定的字节大小的操作数。您的示例代码使用这种除法。商进入AL寄存器

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

但是如果我们把一个16位的数字除以1呢

每当执行下面的代码时,我的指令指针就被放错了位置

MOV AX, 9999H
MOV BL, 1
DIV BL
我们有没有办法强迫8086用ax来表示商,用do来表示余数,同时除以ax

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


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

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

字大小的除法将把
DX:AX
中的双字除以指定的字大小的操作数。商进入
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

@塞普罗兰:塔斯姆和EMU8086不可能同时出现。对16位代码(包括8086)使用
[x86-16]
。对于8086和286答案之间存在巨大差异的少数情况,问题文本可以处理这一点。(
[8086]
是[x86-16]的标记同义词,这很好,尽管标记自动完成8086到8086)。emu8086是一个特定的汇编程序+模拟器+调试器,对于有关ISA的问题来说并不太好。@PeterCordes我不知道这一点。无论如何,至少有12个问题同时用TASM和EMU8086标记。@SepRoland:如果是关于asm语法的,那么TASM和EMU8086确实使用类似MASM的语法,所以它们可能不都需要重新标记。也许不值得在现有的老问题上费心。显示了
div
的文档,并讨论了8位是特例,而DX:AX输入/结果用于更广泛的应用。很抱歉不清楚…我实际尝试的是将8位寄存器除以16位寄存器,以获得16位商…我不需要remainder@MotherofStackoverflow请看我的修正答案。AX是一个16位数字…BL是8位数字…执行一些指令DIV BL。。AX现在是16位商