原帖由 beepbug 于 2007-4-26 21:04 发表于 10楼
哪谁来设置标志位呢?标志位自己判别的?你把概念搞混了。
先要有判断。按照判别,设置标志位。设置标志位,是为了告诉后续操作或其它部件(譬如陷阱),这次计算发生了溢出。
当然变形码并非唯一做法。我 ...
什么叫9位ALU呢?我没有这个概念。如果8位+8位得到9位,在我眼里,那依然是8位ALU。
比方32位乘法,得到64位,不好说这是64位乘法器吧。
可以负责的说,标志也是电路输出,不只是计算结果而已。
对于补码运算(一般补码运算电路设计比较方便),有无符号都可以使用同一组合电路。
另外,可以解释一下变形码吗?英文怎么说? 对不起,这个英文忘了。但是,我可以把问题说清楚。
本来,楼主的问题和溢出无关。这两数相减,无论是看作有符号,还是去符号,都不会溢出。
为了说明这里没有溢出,我说了CPU是如何判断溢出的。
我们可以利用逻辑运算来判断是否发生了溢出,逻辑表达式是:
溢出=x0 y0 z0 + x0 y0 z0
但是,这要每做一次加法即做一次这样的逻辑运算,会导致CPU效率严重下降。利用变形码,效率较高。
把补码变成变形码,也叫符号位扩展,就是把原来一个符号位变成两个相同的符号位。符号位为0的变成00,为1的变成11。
再举一个会溢出的加法例子。在8位机里,
54H→01010100(补码)→001010100(变形补码)
37H→00110111(补码)→000110111(变形补码)
两变形补码都是9位。
001010100
+)000110111
---------
010001011
两符号位是01,正溢出。
-54H→10101100(补码)→110101100(变形补码)
-37H→11001001(补码)→111001001(变形补码)
两变形补码都是9位。
110101100
+)111001001
---------
1101110101
最左边的1丢弃。两符号位是10,负溢出。
-5→11111011(补码)→111111011(变形补码)
-3→11111101(补码)→111111101(变形补码)
两变形补码都是9位。
111111011
+)111111101
---------
1111111000
最左边的1丢弃。两符号位是11,没有溢出,结果是-8。
变形码和标志位是两码事。对变形码两符号的检查,设置标志寄存器里的溢出位。 采用变形码的机器,在ALU里,符号位是两位的。这样,8位CPU,里面的ALU是9位。
北工大李大友讲的原理比较透彻。他能讲到门电路一级。这样就一定会讲到变形码。
不知道哪去找他的教材。
页:
1
[2]