IMUL
有符号数乘法指令,相乘的两个数均看做有符号数,
AL的内容是个有符号数,一般计算机中有符号数用补码表示,所以0B4H是某个数的补码,即[X]的补码
=
0B4H
=
1011
0100
B,求出X=
-100
1100
B
=
-76.
BL的内容是个有符号数,11H是某个数的补码,即[X]的补码
=
11H
=
0001
0001
B,求出X=
+001
0001
B
=
+17.
(AL)*(BL)=
-76
*
(+17)=
-1292
把
-1292
转换成二进制为
-101
0000
1100
B
在将这个结果(-101
0000
1100
B)转换成16位补码形式,转换之前还要把它补齐成16位,即,为-000
0101
0000
1100
B
,将它转换成补码形式为1111
1010
1111
0100
B
,最后把这个数再转换成16进制,即为FAF4H.
根据IMUL指令的规定,若乘积的高一半是低一半的符号位的扩展则OF=CF=0,否则OF=CF=1.
也就是说,如果结果的高一半的所有位,与低一半的第一位相同,则OF=CF=0,如果不相同,则OF=CF=1.
本题中,结果是FAF4H=1111
1010
1111
0100
B,那么高一半是1111
1010,低一半是1111
0100
,所以结果的高一半的所有位,与低一半的第一位
不
相同,即乘积的高一半
不是
是低一半的符号位的扩展,所以OF=CF=1.
带符号数相乘的计算。如(AL)=0B4H ,(BL)=11H,求 IMUL BL。
------------------------------
带符号数相乘,在《计算机组成原理》中,介绍了多种方法。
intel 的 CPU,用的是哪种方法? 《计算机组成原理》的作者,也不知道。
按照小学的知识来说,就是:符号位异或、绝对值相乘。
(AL)= 0B4H = 1011 0100B,其真值是:-76。
(BL) = 11H = 0001 0001B,其真值是:+17。
由此可得出:乘积 = -1292 = -101 0000 1100B。
转换成补码,就是:1111 1010 1111 0100B = FAF4H。
CF、OF 都是什么,就得仔细看书了。