ALU 的状态标志
复习
- 补码:补码是反码加 1,能统一加减法且只有一个零
- 减法器:减法器复用加法器,把减数取反再加一
- 算术逻辑单元:ALU 把算术与逻辑运算集成起来,用控制码选择运算
TL;DR
- 状态标志是 ALU 对本次结果的简短备注
- Z、N、C、V 分别描述零、负数、进位和有符号溢出
- 进位和溢出不是一回事
- 标志是机器以后“看结果做判断”的依据
正文
假设 ALU 算出一个 0000。这可能是普通的 0,也可能是绕了一圈才回到 0。只看结果这一串 0,我们其实并不知道刚才究竟发生了什么。
- 算出来结果真的就是 0 的情况:比如
0001减0001得到0000 - 绕了一圈才回到 0 的情况:比如
1111加1得到0000
所以,ALU 除了交出答案,还会顺手亮起几盏“指示灯”。它们是关于这次运算的简短备注,叫作 状态标志(status flag)。
四盏常用的灯
- Z,Zero,零标志:结果是不是全 0
- N,Negative,负数标志:把结果看作补码时,最高位是不是 1
- C,Carry,进位标志:无符号加法有没有从最高位产生进位
- V,oVerflow,溢出标志:有符号结果是否超出当前位宽能表示的范围
名字不用死记,也不关键,对应起来就好:
- Z 关心“是不是 0”
- N 关心“符号位是几”
- C 关心“有没有从最高位冒出去”
- V 关心“有符号数算崩了没有”
举个例子:4 位 ALU 计算 0011 - 0011 = 0000,这时 Z 变成 1。以后机器要判断“两个数是否相等”,只要做一次减法、再看 Z 就行,不用再造一套用来比较的东西。
进位不等于溢出
C 和 V 很容易搞混,但是非常非常关键!
它们都和“装不下”有关,但是各自的视角不同。
先看 4 位 无符号数:
1111 + 0001 = 1 0000
低 4 位是 0000,最高位外面多出一个进位,于是 C = 1。把输入看作无符号数,这就是 15 + 1 超出了 0~15 的范围,多出来的那位被顶了出去。
再看 4 位有符号补码:
0111 + 0001 = 1000
+7 + 1 本该等于 +8,可 4 位补码最多只能表示 +7。结果串 1000 若按补码解释,反而成了 -8。这就是溢出,于是 V = 1。注意这次最高位外面并没有多余进位,所以 C 可以是 0。
把两者并排看,区别就清楚了:
- C 关心无符号数有没有向位宽之外进位
- V 关心有符号数的数学答案是否超出范围
同一串比特,用无符号和有符号去看,结论可能完全不同——所以机器必须用两个标志分别记录,不能只留一个。
思考题 1
在 4 位 ALU 中计算
1111 + 0001。把输入看作无符号数和有符号补码时,各发生了什么?C 和 V 应分别是多少?
标志有什么用
状态标志不会替我们决定下一步,但它们给了机器决定的依据:结果为零就停下,结果为负就拐到另一条路,发生溢出就报告错误。
可以说,标志是“运算”通往“判断”的桥梁。后面我们将会看到条件跳转,就会用到这些标志。
- 举个例子,我们对成年人和小孩子的看法肯定不一样
- 年龄 >= 18,我们会和他们讲道理,讲原因
- 年龄 < 18,我们更可能直接找家长,不会和小孩子讲道理
- 那么我们就可以用
年龄 - 18,看 Z 和 N 标志是否为 1,来判断是否是成年人- 如果 Z = 1,说明结果为零,刚好是 18 岁,成年人,Z = 0 只能表示年龄不是 18 岁,至于比 18 岁大还是比 18 岁小,要看 N 标志
- 如果 N = 1,说明结果为负,小孩子,N = 0,说明结果大于 18 岁,成年人
思考题 2
为什么判断“两个数相等”可以靠减法加 Z 标志,而判断“谁大谁小”却有时还要多看一个 V(或 N)?只靠 Z 够吗?
现在,运算结果和对结果的备注都有了。下一章,我们把输入、ALU、控制码和这些标志正式装进一个运算器。
小结
知识点
- Z、N、C、V 四种常见状态标志
- C 服务于无符号运算
- V 服务于有符号补码运算
- 比较可以借助减法结果和状态标志完成
参考资料
- Wikipedia(zh):标志寄存器:状态标志在寄存器中的组织
- Wikipedia(zh):整数溢出:有符号数超出表示范围的现象
思考题答案(仅供参考)
思考题 1
结果低 4 位为 0000,并产生最高位进位,所以 C = 1。若按有符号补码解释,1111 是 -1,-1 + 1 = 0 完全在范围内,所以 V = 0;此时结果为零,Z = 1。
思考题 2
不够。相等只有一个含义:差为零,所以看 Z 就够了。但“谁大谁小”取决于你把数看作无符号还是有符号:同样一串位模式,无符号解释下的比较结果,可能和有符号解释下相反。所以比较大小不能只看零标志,还要结合符号标志,或者按无符号/有符号分别看待。
同一串比特,它表示什么含义,取决于怎么解读。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪