微处理器设计/ALU 标志
外观
< 微处理器设计
出于多种原因,从 ALU 导出一些状态代码非常重要,用于检测错误和做出决策。
两个值之间的比较通常通过减去它们来完成。我们可以通过检查差值来确定两个值之间的关系
- 如果第一个大于第二个,结果将为正
- 如果第二个大于第一个,结果将为负
- 如果两个相等,结果将为零。
确定两个值是否相等,需要 ALU 确定结果是否为零。这可以通过将结果的每一位馈送到一个 NOR 门来实现。这样做的好处是,一个单一的多分支 NOR 门比一个完整的等效二端口门阵列需要更少的硬件。
了解加法或乘法的结果是否大于最大结果大小很有用。同样,了解减法或除法的结果是否小于可能的值,从而导致下溢也很有用。可以使用两个单独的标志表示这些情况,或者根据输入操作以不同的方式解释一个标志。
此标志指示操作结果是否大于累加器可以表示的值(进位/溢出)或小于累加器可以表示的值(借位/下溢)。软件可以使用它来实现任意宽度的算术,例如“bignum”库。
一些指令集引用了先前指令的 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 标志。