Assembly imul和idiv是如何工作的8086?
我试图弄清楚8086微处理器的imul和idiv指令是如何工作的 我知道这一点: 1.mul和div是无符号数的乘法和除法 2.imul和idiv也是除有符号数字外的乘法和除法 我搜索了所有的网页,我刚才写的是我找到的唯一信息,但写的方式不同 我有这个:Assembly imul和idiv是如何工作的8086?,assembly,binary,x86,twos-complement,negative-number,Assembly,Binary,X86,Twos Complement,Negative Number,我试图弄清楚8086微处理器的imul和idiv指令是如何工作的 我知道这一点: 1.mul和div是无符号数的乘法和除法 2.imul和idiv也是除有符号数字外的乘法和除法 我搜索了所有的网页,我刚才写的是我找到的唯一信息,但写的方式不同 我有这个: mov AX, 0FFCEh idiv AH 因为它是一个字节,AL=AX/ah(结果)和ah=余数 在指令之后,我得到AX=0032h,显然是0余数,结果是32。有人能解释一下为什么会有这样的结果吗?我需要知道如何解释指令是如何工作的(一点
mov AX, 0FFCEh
idiv AH
因为它是一个字节,AL=AX/ah(结果)和ah=余数
在指令之后,我得到AX=0032h,显然是0余数,结果是32。有人能解释一下为什么会有这样的结果吗?我需要知道如何解释指令是如何工作的(一点一点)
imul指令也是如此
我有:
mov AX, 0FF10h
imul AL
因为AL是一个字节,所以乘法的结果将保存到AX中。在执行imul指令AX=0100h之后,为什么不是F100h
我不知道CPU实际上是如何执行mul、div、imul和idiv的。如果有人能为我解释一下这些差异,我会非常感激的
谢谢 维基百科的二进制乘法文章解释了位级别的详细信息,以及。您可以找到分区的类似位级详细信息
但正如汉斯所说,你不需要真正了解解决这个问题的细节。您确实需要知道,与add/sub不同,对于2的补码整数和无符号整数,mul和div的按位运算是不同的,而不仅仅是结果的解释。有趣的事实:对于乘法 因此,说明参考手册对说明操作的描述就是您所需要的,另外还要了解-1的表示形式是0xFF。(请参阅或英特尔原始PDF:tag wiki中的链接) 按照指令的相同方式解释每个操作数中的位,并“正常”进行计算。e、 g
你所遇到的问题在评论中有部分阐述
mov AX, 0FFCEh
idiv AH
将FFCE除以FF。谢天谢地,这是有符号除法,否则会引起错误
乘法要容易得多:
mov AX, 0FF10h
imul AL
将AL*AL的结果存储在AX中
小心大于字节的乘除运算;他们也使用DX寄存器。idiv答案的一部分
AX=FFCE
啊=FF
负数的定义是它们的最高排名位等于1,所以
FFCE为阴性
因为
1111 1111 1100 1110
处理器不能处理负片,
我们需要有正数,这意味着我们对这个数字求反(或者处理器自动地根据排名最高的位执行此操作)
或
然后next-AH寄存器是FF-也是负数,并且
我们需要积极的版本,我们需要否定
1111 1111 =>
=> 0000 0000 +1 =>
=> 0000 0001 =>
=> 01h
然后当所有数字都为正时,我们计算除法
32h分区1h,0h余数=>AL,32h结果=>AH
两者都是负数,这意味着结果是正数,不需要再进行转换
答案的一部分
AL=10h
imul/mul在参数为8位时使用AL
所以,伊穆尔·艾尔和我一样
AL * AL => 10h * 10h => 0100h = AX
答案的imul部分已扩展
啊=FF
AL=10h
现在我们有了AL*AH=>AX
铝=10小时
它是负的,我们需要正的,我们求反,得到=>01h
正数乘法
10h*01h=>0010h
但因为只有一个是否定的,所以我们必须否定结果,
不要丢失起始零,否则您的答案将不正确
0010h => FFEF +1 => FFF0 = AX
IMUL r/m8
的描述是AX如果您使用IDIV,它将其操作数解释为有符号值。所以它是0FFCEh/0FFh=-50/-1=50=32h。请更清楚地说明你在问什么。您想知道更多关于在硬件中实现这些指令所使用的位移位的信息吗?或者您想知道更多关于这些操作中使用的寄存器的信息,即使它们没有显式写入指令中?我很想帮忙,但真的不明白哪一部分对你来说有问题。看看这个
1111 1111 1100 1110 =>
=> 0000 0000 0011 0001 +1 =>
=> 0000 0000 0011 0010 =>
=> 0032h
1111 1111 =>
=> 0000 0000 +1 =>
=> 0000 0001 =>
=> 01h
mov AX, FF10
imul AL
AL * AL => 10h * 10h => 0100h = AX
mov AX, FF10
imul AH
0010h => FFEF +1 => FFF0 = AX