计算机底层——条件码

182 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

条件码

计算机的底层是由各种各样精细的硬件组成的。其中就包括了我们今天要介绍的一组特殊的寄存器,条件码寄存器,它是一个单个位的寄存器,它们描述了最近的算术或者逻辑操作的属性。我们最常用的条件码寄存器有一下几种:

  1. CF进位标志。最近的操作使最高位产生了进位。可用来检查无符号操作的溢出
  2. ZF零标志。最近的操作得到结果为0
  3. SF符号标志。最近的操作得到的结果为负数
  4. OF溢出标志。最近的操作导致一个补码溢出——正溢出或者负溢出

计算机系统会根据这些条件码的组合来进行条件分支的判断。

假如我们使用一条ADD指令进行t=a+b的C语言表达式的功能。三个参数都是整型。然后我们根据表达式得到的结果来进行条件码的操作:

  • 如果t(无符号整数) < a(无符号整数) 表示无符号溢出,设置CF
  • 如果t==0,设置ZF
  • 如果t < 0,设置SF
  • 如果(a < 0 == b < 0) && (t < 0 != a < 0),设置OF,表示溢出

通过执行这个表达式后,我们会得到这个算数操作后的条件码的值。条件码的值可以应用到其他指令上,例如CMP指令,TEST指令等等,这些指令都根据条件码的值进行判断的。leaq指令不会改变条件码的值,因为它是地址计算的。

总结

某些指令的运行会进行条件码的设置,通过条件码的组合情况,计算机可以清楚的了解到最近一次逻辑计算的情况,以便进行更精确的逻辑操作。单个位的条件码表示的信息是有限的,但是多个单个位的条件码的信息就不同了。明天我们会继续探讨条件码的知识的。