程序的机器级表示 - 控制
条件码
除了16个整数寄存器以外,CPU还维护着一组单个位的条件码寄存器,他们描述了最近的算数或者逻辑操作的属性。常用的有:
CF:进位标志,最近操作使最高位产生了进位,可以检查无符号操作的溢出。
ZF:零标志,最近操作结果为0。
SF:符号标志,最近结果为负数。
OF:溢出标志,最近操作导致补码溢出(正溢出或负溢出)。
比如加法操作,如果a+b=0,则ZF被设置,如果a+b<0,则SF被设置。 有些操作不涉及到条件码寄存器,比如leaq,因为其是进行地址计算的。 有些操作,只是改变条件寄存器,比如cmp,test
cmp A,B 含义是通过算术B-A来设置条件寄存器,结果与SUB类似
test A,B 含义是通过算术B&A来设置条件寄存器,结果与AND类似
访问条件码
条件码有三种访问方式:
根据条件码的某种组合,将一个字节设置为0或者1。(SET指令)。
可以条件的跳转到程序的其他部分
可以有条件的传送数据
SET指令
SET指令可以根据不同的条件寄存器将目标的字节设置为1或0,每个SET命令都有后缀,这些后缀表示的是使用那些条件。 比如:
sete D 其效果是D<-ZF 如果相等/0
setne D 其效果是D<-~ZF 如果不相等/1 在这些后缀中,n表示非:
e或z 表示0 =ZF
ne或nz 表示非0 =~ZF
s 表示负数 =SF寄存
ns 表示非负数 =~SF寄存
g或nle 表示大于
ge或nl 表示大于等于
l或nge 表示小于
le或ng 表示小于等于
a 表示超过, b 表示低于
跳转指令
跳转指令分为两大类:
无条件跳转jmp labeljmp 跳转到寄存器或内存指定的地址
条件跳转 根据j后缀来判断是否需要跳转到指定的labelje label 如果相等 则跳转其余的判断条件与set后缀类似
有条件的数据传送指令
mov指令可以将数据进行传送,但是cmov指令族根据不同的条件寄存器进行数据传送,其后缀与SET命令后缀一样表示的是使用那些条件。 比如:
cmove S,R 其效果是D<-ZF 如果相等/0
cmovne S,R 其效果是D<-~ZF 如果不相等/1
参考资料
版权声明: 本文为 InfoQ 作者【引花眠】的原创文章。
原文链接:【http://xie.infoq.cn/article/b964ed7c7eb51a63f339987ba】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论