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的。如果有人能为我说明这些差异,我将非常感激。
谢谢!
维基百科的二进制乘法文章解释了位级细节,并有一个关于有符号乘法的部分。您可以找到类似的除法位级详细信息。
但就像汉斯所说,你实际上不需要了解细节来解决这个问题。您确实需要知道,与 add/sub 不同,对于 2 的补码整数和无符号整数,mul 和 div 的按位运算是不同的,而不仅仅是结果的解释。有趣的事实:对于乘法,全角结果的下半部分对于 mul 和 imul 是相同的。
因此,您只需要指令参考手册中对指令操作的描述,再加上理解,例如-1的 2 补码表示形式是 0xFF。(请参阅http://www.felixcloutier.com/x86/ ,或英特尔的原始 PDF: x86标签 wiki中的链接)
以与指令相同的方式解释每个操作数中的位,并“正常”进行数学运算。例如
AX = 0xFFCE => -2^16 + 0xFFCE = -0x32 = -50
AH = 0xFF => -1
-50 / -1 = 50, no remainder
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10095 次 |
| 最近记录: |