imul和idiv在8086上到底是如何工作的?

use*_*076 5 binary x86 assembly negative-number twos-complement

我试图弄清楚 8086 微处理器的 imul 和 idiv 指令是如何工作的。

我知道这一点: 1. mul 和 div 是无符号数的乘法和除法 2. imul 和 idiv,也是有符号数的乘法和除法

我搜索了整个网络,上面写的内容是我找到的唯一信息,但以不同的方式编写。

我有这个:

mov AX, 0FFCEh
idiv AH
Run Code Online (Sandbox Code Playgroud)

因为 ah 是一个字节,AL=AX/AH(结果)且 AH=余数

在指令之后,我得到AX=0032h,显然余数为 0,结果为 32。有人能解释一下它是如何得到这个结果的吗?我需要知道如何解释指令是如何工作的(一点一点)。

imul 指令也是如此。

我有:

mov AX, 0FF10h
imul AL
Run Code Online (Sandbox Code Playgroud)

因为AL是一个字节,所以乘法的结果将保存到AX中。执行 imul 指令AX=0100h后,为什么不是 F100h ?

我不知道CPU实际上是如何执行mul、div、imul和idiv的。如果有人能为我说明这些差异,我将非常感激。

谢谢!

Pet*_*des 2

维基百科的二进制乘法文章解释了位级细节,并有一个关于有符号乘法的部分。您可以找到类似的除法位级详细信息。


但就像汉斯所说,你实际上不需要了解细节来解决这个问题。您确实需要知道,与 add/sub 不同,对于 2 的补码整数和无符号整数,mul 和 div 的按位运算是不同的,而不仅仅是结果的解释。有趣的事实:对于乘法,全角结果的下半部分对于 mul 和 imul 是相同的

因此,您只需要指令参考手册中对指令操作的描述,再加上理解,例如-1的 2 补码表示形式是 0xFF。(请参阅http://www.felixcloutier.com/x86/ ,或英特尔的原始 PDF: 标签 wiki中的链接)

以与指令相同的方式解释每个操作数中的位,并“正常”进行数学运算。例如

AX = 0xFFCE      =>   -2^16 + 0xFFCE = -0x32 = -50
AH = 0xFF        =>   -1

-50 / -1 = 50,  no remainder
Run Code Online (Sandbox Code Playgroud)