Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly imul和idiv是如何工作的8086?_Assembly_Binary_X86_Twos Complement_Negative Number - Fatal编程技术网

Assembly imul和idiv是如何工作的8086?

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。有人能解释一下为什么会有这样的结果吗?我需要知道如何解释指令是如何工作的(一点

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

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

我搜索了所有的网页,我刚才写的是我找到的唯一信息,但写的方式不同

我有这个:

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