写点什么

程序的机器级表示 - 控制

用户头像
引花眠
关注
发布于: 2020 年 08 月 09 日

条件码

除了16个整数寄存器以外,CPU还维护着一组单个位的条件码寄存器,他们描述了最近的算数或者逻辑操作的属性。常用的有:



  1. CF:进位标志,最近操作使最高位产生了进位,可以检查无符号操作的溢出。

  2. ZF:零标志,最近操作结果为0。

  3. SF:符号标志,最近结果为负数。

  4. OF:溢出标志,最近操作导致补码溢出(正溢出或负溢出)。



比如加法操作,如果a+b=0,则ZF被设置,如果a+b<0,则SF被设置。 有些操作不涉及到条件码寄存器,比如leaq,因为其是进行地址计算的。 有些操作,只是改变条件寄存器,比如cmp,test



  1. cmp A,B 含义是通过算术B-A来设置条件寄存器,结果与SUB类似

  2. test A,B 含义是通过算术B&A来设置条件寄存器,结果与AND类似



访问条件码

条件码有三种访问方式:



  1. 根据条件码的某种组合,将一个字节设置为0或者1。(SET指令)。

  2. 可以条件的跳转到程序的其他部分

  3. 可以有条件的传送数据



SET指令

SET指令可以根据不同的条件寄存器将目标的字节设置为1或0,每个SET命令都有后缀,这些后缀表示的是使用那些条件。 比如:



  1. sete D 其效果是D<-ZF 如果相等/0

  2. setne D 其效果是D<-~ZF 如果不相等/1 在这些后缀中,n表示非:

  3. e或z 表示0 =ZF

  4. ne或nz 表示非0 =~ZF

  5. s 表示负数 =SF寄存

  6. ns 表示非负数 =~SF寄存

  7. g或nle 表示大于

  8. ge或nl 表示大于等于

  9. l或nge 表示小于

  10. le或ng 表示小于等于

  11. a 表示超过, b 表示低于



跳转指令

跳转指令分为两大类:



  1. 无条件跳转jmp labeljmp 跳转到寄存器或内存指定的地址

  2. 条件跳转 根据j后缀来判断是否需要跳转到指定的labelje label 如果相等 则跳转其余的判断条件与set后缀类似



有条件的数据传送指令

mov指令可以将数据进行传送,但是cmov指令族根据不同的条件寄存器进行数据传送,其后缀与SET命令后缀一样表示的是使用那些条件。 比如:



  1. cmove S,R 其效果是D<-ZF 如果相等/0

  2. cmovne S,R 其效果是D<-~ZF 如果不相等/1



参考资料

  1. 百度百科-机器语言

  2. 百度百科-汇编语言

  3. 豆瓣-深入理解计算机系统(原书第3版)



发布于: 2020 年 08 月 09 日阅读数: 68
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
程序的机器级表示-控制