跳转指令之:跳转指令B及带连接的跳转指令BL
3.指令操作的伪代码
指令操作的伪代码如下面程序段所示。
IfconditionPassed{cond}then
IfL==1then
LR=addressoftheinstructionafterthebranchinstruftion
PC=PC+(SignExtend(signed_immed_24)2)
4.指令的使用
BL指令用于实现子程序调用。子程序的返回可以通过将LR寄存器的值复制到PC寄存器来实现。下面三种指令可以实现子程序返回。
·MOVPC,r14。
·当子程序在入口处使用了压栈指令:
STMFDr13!,{registers>,r14},
可以使用指令。
LDMFDr13!,{registers>,PC}
将子程序返回地址放入PC中。
ARM汇编器通过以下步骤计算指令编码中的signed_immed_24。
(1)将PC寄存器的值作为本跳转指令的基地址值。
(2)从跳转的目标地址中减去上面所说的跳转的基地址,生成字节偏移量。由于ARM指令是字对齐的,该字节偏移量为4的倍数。
(3)当上面生成的字节偏移量超过-33554432~+33554430时,不同的汇编器使用不同的代码产生策略。
(4)否则,将指令编码字中的signed_immed_24设置成上述字节偏移量的bits[25∶2]。
注意 | 在一些RISC体系结构的处理器中,存在延时跳转(delayedbranch)模式,即在程序执行跳转指令跳转到目标地址之前,程序会执行跳转指令之后的指令。但在ARM体系中,没有这种延时跳转机制。 |
5.指令举例
(1)程序跳转到LABLE标号处。
ADDr1,r2,#4
ADDr3,r2,#8
SUBr3,r3,r1
LABLE
SUBr1,r2,#8
(2)跳转到绝对地址0x1234处。
B0x1234
(3)跳转到子程序func处执行,同时将当前PC值保存到LR中。
BLfunc
(4)条件跳转:当CPSR寄存器中的C条件标志位为1时,程序跳转到标号LABLE处执行。
BCCLABLE
(5)通过跳转指令建立一个无限循环。
LOOP
ADDr1,r2,#4
ADDr3,r2,#8
SUBr3,r3,r1
BLOOP
(6)通过使用跳转使程序体循环10次。
MOVr0,#10
LOOP
SUBSr0,#1
BNELOOP
(7)条件子程序调用示例。
……
CMPr0,#5;如果r05
BLLTSUB1;则调用
BLGESUB2;否则调用SUB2
注意 | 只有SUB1不改变条件码,本例才能正确执行,因为如果BLLT执行了转移,将返回到BLGE指令。如果条件码被SUB1子程序改变,则SUB2可能又会被执行,从而达不到指令的预期效果。 |
评论