Assembly 当我们将16位数字除以8位1时会发生什么?
据我所知,如果我们使用带有8位数字的div指令,那么商是存储在AL中的8位数字,剩余的是存储在AH中的8位数字 但是如果我们把一个16位的数字除以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寄存器
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位商