ARM指令集可以分为6类,即跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理指令和异常中断产生指令。
跳转指令:
在ARM中有两种方式可以实现程序的跳转:跳转指令和直接向PC寄存器中写入目标地址值。
通过直接向PC寄存器中写入目标地址值可以实现4G的地址空间中任意跳转,称之为长跳转。
ARM的跳转指令可以从当前指令向前或向后的32MB的地址空间跳转。这类跳转指令由以下4种:
- B 跳转指令;
- 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指令是字对齐的,这时会产生不可预测的结果。