除了整数寄存器,CPU还维护着一组单个位的条件码(condition code)寄存器,它们描述了最近的算术和逻辑操作的属性。可以检测这些寄存器来执行条件分支指令。最常用的条件码有:
CF:进位标志。最近的操作使最高位产生了进位。可以用来检查无符号操作数的溢出。
ZF:零标志。最近的操作得出的结果为 0。
SF:符号标志。最近的操作得到的结果为负数。
OF:溢出标志。最近的操作导致一个补码溢出——正溢出或负溢出。
leal 指令不改变任何条件码,因为它是用来进行地址计算的。除此之外,随笔二十九中所列的所有指令都会设置条件码。
除上述提到的指令外,有两类指令(有8、16 和 32 位形式),它们只设置条件码而不改变任何其他寄存器;如下图所示。CMP 指令根据它们的两个操作数之差来设置条件码。除了只设置条件码而不更新目标存储器之外,CMP 指令和 SUB 指令的行为是一样的。在 ATT 格式中,列出操作数的顺序是相反的,这使代码有点难读。如果两个操作数相等,这些指令会将零标志设置为 1,而其他的标志可以用来确定两个操作数之间的大小关系。TEST 指令的行为与 AND 指令一样,除了它们只设置条件码而不改变目的的寄存器的值。典型的用法是,两个操作数是一样的(例如,testl %eax, %eax 用来检查 %eax 是负数、零,还是正数),或其中一个操作数是一个掩码,用来指示哪些位应该被测试。
指令 | 基于 | 描述 |
CMP S2, S1 | S1 – S2 | 比较 |
cmpb cmpw cmpl | Compare byte Compare word Comlare double word |
|
TEST S2, S1 | S1 & S2 | 测试 |
testb testw testl | Test byte Test word Test double word |
|