1

 条件码

  • 定义:条件码是CPU根据运算结果由硬件设置的位,体现当前指令执行结果的各种状态信息。如算术运算产生的正、负、零或溢出等的结果。可以理解为处理器中的特殊标志位

从程序员角度看处理器:由所有可见的处理器以及标志位组成

  1. 大量寄存器用于表示程序中用到的局部变量
  2. rsp寄存器:当前程序运行时栈的顶部地址
  3. rip寄存器(程序计数器):当前所执行指令的下一条指令的地址
  4. 标志位:表示当前处理器运行的状态。存放在称为标志寄存器的一种寄存器中,标志寄存器不能通过汇编语言指令直接访问,但可间接修改和访问

四种条件码

  • CF:进位标志位,针对无符号数。若产生进位或借位,CF会被置位为1(无符号数进位或借位表示无符号位溢出)
  • SF:符号标志位,针对有符号数。表示当前指令运算结果的符号,非负数置位为0,负数置位为1
  • ZF:0标志位。运算结果为0时,会被置位为1
  • OF:溢出标志位,针对有符号数。有符号数运算有可能出现溢出而非进位,若产生溢出,则置位为1

针对溢出和进位:无符号数的溢出叫做进位,有符号数称为溢出

两种置位方法

  • 隐式置位:每当执行一个算数或逻辑运算指令时,都有可能导致标志位的变化。
  1. 在处理器执行汇编指令时,寄存器、内存是无法判断执行的指令为有符号数还是无符号数的。因此标志位置位时,把结果既看做有符号数,又看作无符号数,分别对相应标志位进行判断
  2. 地址计算指令是唯一一条不影响条件码的指令
  • 显示置位:在汇编语言中有些指令,专门用于修改条件码的值,不修改操作数

  • cmp指令对两个操作数进行比较(计算目标操作数-原操作数的差,进而影响对应条件码,但不修改参与运算的操作数)
  1. 与减法运算区别:cmp指令影响对应条件码,但不修改参与运算的操作数;减法指令会把差放到目标操作数中
  2. 影响SF和ZF。规则:差为负数,SF置位为1,表示目标操作数小于原操作数;差为非负数,SF置位为0,再看ZF;若差为0,ZF置位为1,表示二者相等;若差为正数,ZF置位为0,表示目标操作数大于原操作数

  • text按位与
  1. 类似and按位与,但and把结果放到目标操作数中;text指令影响对应条件码,但不修改参与运算的操作数
  2. 只影响ZF.SF两个操作码
  3. 可用于检查某个操作数中某一位是否为0。将数据和掩码(11...1)相比较

访问条件码

  • 条件码不能直接被修改,只能通过算数或逻辑运算指令,间接的显示或隐式的完成条件码的修改。同样,访问条件码也不能直接访问,需通过一组set指令间接访问。访问的条件码通过八位寄存器表示,即将八位寄存器最低位置0或置1,剩余位都是0
  • 下图为set组指令

  • 在X86的64位寄存器中,每个寄存器的低八位寄存器都有别名,set组指令正是对低八位寄存器进行操作

  • 通过实例理解条件码的访问

关注公众号,让我们携手并进


无欲则刚
76 声望15 粉丝