Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

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 服务于有符号补码运算
  • 比较可以借助减法结果和状态标志完成

参考资料

  1. Wikipedia(zh):标志寄存器:状态标志在寄存器中的组织
  2. Wikipedia(zh):整数溢出:有符号数超出表示范围的现象

思考题答案(仅供参考)

思考题 1

  结果低 4 位为 0000,并产生最高位进位,所以 C = 1。若按有符号补码解释,1111 是 -1,-1 + 1 = 0 完全在范围内,所以 V = 0;此时结果为零,Z = 1。

思考题 2

  不够。相等只有一个含义:差为零,所以看 Z 就够了。但“谁大谁小”取决于你把数看作无符号还是有符号:同样一串位模式,无符号解释下的比较结果,可能和有符号解释下相反。所以比较大小不能只看零标志,还要结合符号标志,或者按无符号/有符号分别看待。

  同一串比特,它表示什么含义,取决于怎么解读。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪