跳转到内容

微处理器设计/ALU 标志

来自维基教科书,开放的书籍,为开放的世界

出于多种原因,从 ALU 导出一些状态代码非常重要,用于检测错误和做出决策。

两个值之间的比较通常通过减去它们来完成。我们可以通过检查差值来确定两个值之间的关系

  • 如果第一个大于第二个,结果将为正
  • 如果第二个大于第一个,结果将为负
  • 如果两个相等,结果将为零。

零标志

[编辑 | 编辑源代码]

确定两个值是否相等,需要 ALU 确定结果是否为零。这可以通过将结果的每一位馈送到一个 NOR 门来实现。这样做的好处是,一个单一的多分支 NOR 门比一个完整的等效二端口门阵列需要更少的硬件。

溢出标志

[编辑 | 编辑源代码]

了解加法或乘法的结果是否大于最大结果大小很有用。同样,了解减法或除法的结果是否小于可能的值,从而导致下溢也很有用。可以使用两个单独的标志表示这些情况,或者根据输入操作以不同的方式解释一个标志。

进位/借位标志

[编辑 | 编辑源代码]

此标志指示操作结果是否大于累加器可以表示的值(进位/溢出)或小于累加器可以表示的值(借位/下溢)。软件可以使用它来实现任意宽度的算术,例如“bignum”库。

锁存 ALU 标志还是不锁存?

[编辑 | 编辑源代码]

一些指令集引用了先前指令的 ALU 标志

 CMP R1,R2 // compare
 ...
 BEQ equal_routine // branch if equal

这样的指令集迫使 CPU 设计人员将这些 ALU 标志锁存在某种“状态寄存器”中,并非常小心地确保在中断例程期间可以保存这些标志。

其他指令集永远不会引用先前的 ALU 标志——它们总是使用与它们计算时相同的指令中的 ALU 结果

 BEQ R1,R2,equal_routine // compare and branch if equal

或者

 SKEQ R1,R2 // compare and skip next instruction if equal
   JMP equal_routine

一些 CPU 设计人员更喜欢永远不会引用先前 ALU 标志的指令集。这样的指令集使乱序执行变得更加简单。许多 Chuck Moore 的 CPU 设计从未引用过任何先前指令的 ALU 标志。

华夏公益教科书