ARM指令集——跳转指令篇

ARM指令集可以分为6类,即跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理指令和异常中断产生指令。

跳转指令:

在ARM中有两种方式可以实现程序的跳转:跳转指令和直接向PC寄存器中写入目标地址值。

通过直接向PC寄存器中写入目标地址值可以实现4G的地址空间中任意跳转,称之为长跳转。

ARM的跳转指令可以从当前指令向前或向后的32MB的地址空间跳转。这类跳转指令由以下4种:

  • 跳转指令;
  • BL 带返回的跳转指令;
  • BLX 带返回和状态切换的跳转指令;
  • BX 带状态切换的跳转指令。
下面分别介绍:
1、B及BL
指令的语法格式:
B{L}{<cond>} <target_address>

指令操作的伪代码:
if ConditionPassed(cond) then
if L == 1 then
LR = address of the instruction after the branch instruction
PC = PC + (SignExtend(signed_immed_24) << 2) ; address of ARM is aligned 4Byte
实例:
B Lable ; 程序跳到Lable处执行
BCC Lable ; 当CPSR寄存器中的C条件标志位为1时,程序跳转到标Lable处执行
BL func_1 ; 程序跳转到子程序func_1处执行,同时将当前PC值保存到LR中

2、BLX(1)
指令的语法格式:
BLX <target_address>

指令操作的伪代码:
LR = address of the instruction after the BLX instruction
T Flag =1 ; Thumb指令集
PC = PC + (SignExtend(signed_immed_24) << 2) + (H << 1) ; H是指令编码格式中的H位
3、BLX(2)
指令的语法格式:
BLX {<cond>} <Rm>

指令操作的伪代码:
if ConditionPassed(cond) then
LR = address of the instruction after the BLX instruction
T Flag =Rm(0)
PC = Rm AND 0xFFFFFFFE
指令的使用
当Rm[1:0] = 0b10时,由于ARM指令是字对齐的,这时会产生不可预测的结果。

4、BX指令
指令的语法格式:
BX{<cond>} <Rm>

指令操作的伪代码:
if ConditionPassed(cond) then 
T Flag = Rm[0]
PC = Rm AND 0xFFFFFFFE

指令的使用
当Rm[1:0] = 0b10时,由于ARM指令是字对齐的,这时会产生不可预测的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值