Thumb指令集之: ARM和Thumb的混合编程
+ PC = PC + (SignExtend(signed_immed_24)<<2) + (H<<1)
第二种格式BLX指令。
If ConditionPass{cond} then
LR = address of the instruction after the branch instruftion
T Flag=Rm[0]
PC=Rm AND 0xfffffffe
Thumb状态下带返回链接的跳转指令BLX(1)提供了一种在Thumb状态下无条件调用ARM子程序的方法,当从子程序返回时,通常使用下面的方式之一:
· BX LR
· 加载PC的LDR或LDM指令。
BLX指令不可条件执行,可以实现在大约±4MB的地址空间范围内跳转,实现方法是将一条BLX指令编译成两条16位的Thumb指令,从而实现上述跳转。对编译后的两条指令说明如下。
① H=10的跳转指令。该跳转包含跳转偏移量的高位部分。
② H=01的跳转指令。该跳转包含跳转偏移量的低位部分。
指令的语法格式
BL <target_address>
<target_address>
指定程序跳转的目标地址。指令通过下面的方法计算目标地址。
· 将H=10的BL指令的offset_11域左移12位。
· 将结果符号扩展为32位。
· 将得到的值加到PC寄存器中。
· 与H=11的BL指令的offset_11域相加。
因此BL指令可以实现在大约±4MB的地址空间范围内跳转。
指令操作的伪代码为:
if H==10 then
LR=PC+(SignExtend(offset_11)<<12)
Else if H==11 then
PC=LR+(offset_11<<11)
LR=(address of next instruction)|1
Else if H==01 then
PC=(LR+(offset_11<<1)) AND 0xFFFFFFFC
LR=(address of next instruction)|1
Else if H==01 then
PC=(LR+(offset_11<<1)) AND 0Xfffffffc
LR=(address of next instruction)|1
T Flag=0
另外Thumb状态下包含另一种格式的BLX指令,该BLX(2)指令用于ARM和Thumb子程序间的相互调用。程序状态字的T标志位根据目的寄存器的bit[0]位而改变。
指令的语法格式为:
BLX <Rm>
其中<Rm>为目标地址寄存器,r0~r14寄存器均可以作为目标地址寄存器。
| 注意 | 如果在此指令中使用r15作为目的寄存器,指令的执行结果不可预知。 |
此指令只在ARMv5版本以上指令集中被支持。
指令操作的伪代码为:
LR = (address of the instruction after this BLX)|1
T Flag = Rm[0]
PC = Rm[31:1]<<1
(3)汇编伪指令
汇编编译器可以产生ARM代码也可以产生Thumb代码。使用--thumb或--16选项指示编译器产生Thumb代码。由于所有支持Thumb代码的ARM处理器都从ARM状态开始执行,所以必须人为地使用BX或BLX指令,使处理器状态切换到Thumb状态并使用下面的伪操作使编译器产生Thumb代码。
· CODE16
· CODE32
CODE32伪操作指示汇编器后面的指令为32位的ARM指令。
ARM和CODE32伪操作的意义相同。
当汇编器对源程序进行编译时,如果需要,将会在程序中插入空指令,以保证内存单元字对齐。
语法格式如下。
ARM
CODE32
使用在同时包含ARM指令和Thumb指令的源文件中。当需要从ARM指令序列切换到Thumb指令序列时,使用伪操作ARM(或CODE32);当需要从Thumb指令序列切换到ARM指令序列时使用Thumb伪操作。ARM(或CODE32)伪操作只是指示汇编器后面的指令类型是ARM指令。该伪操作本身并不进行程序状态的切换,要进行状态切换,可以使用BX指令操作。
CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。
语法格式如下。
CODE16
若在汇编源程序中同时包含ARM指令和Thumb指令时,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令。
(4)编程实例
PRESERVE8
AREA AddReg,CODE,READONLY ;段名为AddReg,属性为READONLY
ENTRY ;程序入口
; SECTION 1
main
ADR r0, ThumbProg + 1 ;确定跳转地址
;并将bit[0]置1
;使程序切换到thumb状态
BX r0 ;程序跳转并执行状态切换
; SECTION 2
CODE16 ;Thumb代码指示伪操作
ThumbProg
MOV r2, #2 ;r2 = 2
MOV r3, #3 ;r2 = 3
ADD r2, r2, r3 ;r2 = r2 + r3
ADR r0, ARMProg
BX r0 ;程序跳转并执行状态切换
; SECTION 3
CODE32 ;ARM代码指示伪操作
ARMProg
MOV r4, #4
MOV r5, #5
ADD r4, r4, r5
; SECTION 4
stop MOV r0, #0x18 ;设置semihosting软中断号
LDR r1, =0x20026 ;ADP_Stopped_ApplicationExit
Thumb指令集 ARM 混合编程 Veneer AAPCS 相关文章:
- Thumb指令集之: Thumb指令的特点及实现(08-30)
- Thumb指令集之: Thumb跳转指令(08-30)
- Thumb指令集之: Thumb指令应用(08-30)
- Thumb指令集与ARM指令集的区别(11-21)
- Thumb指令集之: Thumb指令应用(09-30)
- Thumb指令集之: 多寄存器数据传送指令(09-30)