
1.2.1 条件执行与跳转类指令定义
ARM的CPSR寄存器中包含N/Z/C/V四种条件码标识。其中N表示在结果是有符号的二进制补码情况下,如果结果为负数,则N=1,如果结果为非负数,则N=0;Z用来指示计算结果是否为0;C用来表示进位情况;V用来指示加减法指令的计算过程中是否发生了溢出。
如图1-3所示,条件码占据32位指令编码中的高4位。4位域段可编码出16种域值,每个值都由CPSR中的N/Z/C/V域段来确定当前指令是否需要执行。ARM的条件码具体含义见表1-1。

· 图1-3 ARM条件码域段
表1-1 ARM条件码

通过表格可以发现,16种条件码是成对出现的,二进制编码为奇数的条件码是二进制编码为偶数的条件取反后的结果,这样可以实现高效的逻辑操作,节省跳转指令和跳转语句,提升代码效率,节省指令空间。在下面的例子中,要实现的逻辑为:当r1等于0时,将r3加1的结果值赋给r2,否则将r4加1的结果值赋给r2。

如果不使用条件码,编译出来的汇编程序如下:

如果使用条件码,编译出的汇编程序如下:

可以看到使用条件码后,汇编程序变得非常精简,节省了指令空间,并提升了指令执行效率。
跳转类指令用于改变程序的执行顺序。ARM一般按照存储器的地址顺序执行指令,如果需要跳转到另一块程序区域执行程序,则需要使用跳转指令。
ARM v8架构中的跳转(分支)指令分为条件跳转指令和无条件跳转指令(立即数/寄存器)。以无条件跳转指令(立即数)为例,指令编码如图1-4所示。其中L表示跳转指令是否会将下一条指令的地址写入R14中,这一般用于子程序的调用。跳转指令的跳转范围为+/-128MB。

· 图1-4 无条件跳转指令(立即数)编码
下面为一个条件跳转的例子。对r1赋初值,然后进入LOOP循环,当循环了8次之后,BNE条件不成立,则不发生跳转,跳出循环,执行后续程序。

BLX指令可切换ARM架构CPU的工作状态到Thumb状态。当程序使用Thumb指令集时,可使用该指令。同样在跳转的同时将程序的下一条指令地址写入X30中,子程序的返回可以通过将寄存器X30赋给PC完成。