在使用高级语言例如java,C++,python来编写代码时,我们使用最多的莫过于分支跳转控制语句,例如if..else, switch..case, for()等,本节我们看看这些分支跳转语句如何在X86汇编语言下呈现。
程序其实由一系列控制流组成,当代码运行时如果某个条件满足,它会执行既定代码,如果不满足或者另一个条件满足,它又会执行另一部分代码。在控制跳转指令中,最常用的就是jmp指令,它让控制流直接跳转到具体设定的位置去执行那里的代码。这种跳转由于无需判断先决条件,因此也叫无条件跳转。
问题在于程序在逻辑设计上通常需要满足固定条件的跳转,例如提到的if..else就属于这种类型。在汇编语言层面就需要使用标志位来进行跳转前的条件判断。在汇编语言层面可以实现多达三十多种的条件跳转方式。我们先看几个例子:
jz addr #当标志寄存器上的ZF位设置成1时跳转到addr指定的地址
jnz addr #当标志位ZF为0时跳转到地址addr
je addr #经常跟在cmp指令后,cmp指令用于比对两个操作数是否相等,如果相等就将ZF标志位设置成1,于是je就跳转到地址addr
jne addr #使用cmp比对两个操作数,如果两个数值不相等则跳转到地址addr
jg addr #使用cmp比对两个有符号的操作数,如果第一个操作数比第二个大,那么跳转到地址addr
jng addr #使用cmp比对两个有符号的操作数,如果第一个不大于第二个则跳转到地址addr。
ja,jae 分别对应jg和jge,不同在于这两条指