|
2.转移交换和转移链接交换(BX、BLX)
这些指令用于支持Thumb指令集的ARM芯片,程序可通过这些指令完成处理器从ARM状态到Thumb状态的切换。类似的Thumb指令可使处理器切换回32位ARM指令。
二进制编码
转移交换(带链接选项)指令的二进制编码如图所示
说明
在第一种格式中,寄存器Rm的值是转移目标,Rm的第0位拷贝到CPSR中的T位(它决定是切换到Thumb指令还是继续执行ARM指令),[31:1]位移入PC:
如果Rm[0]是1,则处理器切换执行Thumb指令,并在Rm中的地址处开始执行,但需将最低位清0,使之以半字的边界对齐;
如果Rm[0]是0,则处理器继续执行ARM指令,并在Rm中的地址处开始执行,但需将Rm[1]清0,使之以字的边界对齐。
在第二种格式中,转移指令跳转的目标地址的计算方法是:先对指令中定义的有符号的24位偏移量用符号扩展为32位,并将该32位数左移2位形成字的偏移,然后将它加到程序计数器PC中(相加前程序计数器的内容为转移指令地址加8字节),H位(第24位)也加到目标地址的第1位,使得可以为目标指令选择奇数的半字地址,而这目标指令将总是Thumb指令。一般情况下汇编器将会计算正确的偏移。
转移指令的范围也是±32MB。
如果在格式中将L位置位,那么这2种转移指令具有链接的属性,也将转移指令后下一条指令的地址传送到当前处理器模式的链接寄存器。当ARM指令调用Thumb子程序时,一般用这种指令来保存返回地址,通过BLX指令来实现程序调用和程序状态的切换。如果用BX作为子程序返回机制,调用程序的指令集状态能连同返回地址一起保存,因此可使用同样的返回机制从ARM或Thumb子程序对称地返回到ARM或Thumb的调用程序。
注意:格式(1)指令可以有条件或无条件执行,但格式(2)指令是无条件执行
汇编格式
(1) B{L}X{<cond>} Rm
(2) BLX<target address>
<target
address>一般是汇编代码中的一个标号,表示目标地址;汇编器将产生偏移(它将是目标的字地址和转移指令地址加8的差值),并在适当时设置H位。
举例
无条件跳转:
BX R0 ;转移到R0的地址
;如果R0[0]=1,则进入Thumb状态
调用Thumb子程序:
CODE32 ;以下是ARM代码
…
BLX TSUB ;调用Thumb子程序
…
CODE16 ;开始Thumb代码
TSUB … ;Thumb子程序
BX R14 ;返回到ARM代码
注意事项
一些不支持Thumb指令集的ARM处理器将捕获这些指令,允许软件仿真Thumb指令。
BLX<target
address>始终引起处理器切换到Thumb状态,而且不能转移到当前指令±32MB范围之外的地址,它是无条件执行的。
只有实现V5T ARM体系结构的处理器才支持BLX指令的任意形式。
凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网