条件码:
CF:最近的操作是否使最高位产生进位
ZF:最近的操作是否为零
SF:最近的操作得到的结果是否为负数
OF:最近的操作是否导致补码溢出(正溢出和负溢出)
CMP S1, S2 根据S2-S1的值设置条件码
TEST S1, S2 根据S1&S2的值设置条件码
CSAPP p136:
TEST指令的行为和AND指令一样,除了它们只设置条件码而不改变目的寄存器的值。典型的用法是,两个操作数是一样的(例如,test %rax, %rax用来检查%rax是负数,零,还是正数),或其中的一个操作数是一个掩码,用来指示哪些位应该被测试。
对比test S, S和cmp $0,S。
当S看作有符号数,且大于0时:
test S, S,SF置0,ZF置0,OF置0
cmp $0,S,SF置0,ZF置0,OF置0
当S看作有符号数,且等于0时:
test S, S,SF置0,ZF置1,OF置0
cmp $0,S,SF置0,ZF置1,OF置0
当S看作有符号数,且小于0时:
test S, S,SF置1,ZF置0,OF置0
cmp $0,S,SF置1,ZF置0,OF置0
当S看作无符号数,且等于0时:
test S, S,ZF置1,CF置0
cmp $0,S,ZF置1,CF置0
当S看作无符号数,且不等于0时:
test S, S,ZF置0,CF置0
cmp $0,S,ZF置0,CF置0
惊奇地发现这两句指令的行为是一模一样的。原因在于cmp在与0作比较时,是不可能发生溢出和进(借)位的,因而不可能影响OF CF位,这和test指令是一样的。
因此test S, S和cmp $0,S是等效的。