|
在ARM指令集中已介绍过多种形式的转移指令和转移链接指令以及用于ARM和Thumb状态切换的跳转指令。
ARM指令有一个大的偏移域,这不可能在16位Thumb指令格式中表示。为此Thumb指令集有多种方法实现其子功能。
Thumb转移指令二进制编码如图所示。
转移指令的典型用法有:
短距离条件转移指令可用于控制循环的退出。
中等距离的无条件转移指令用于实现goto功能。
长距离的转移指令用于子程序调用。
Thumb指令集对每种情况采用不同的指令模式,分别如图所示。前2种转移格式是条件域和偏移长度的折中。第一种格式中条件域与ARM指令相同。前2种格式的偏移值都左移一位,以实现半字对齐,并符号扩展到32位。格式中,Thumb采用2种这样格式的指令组合成22位半字偏移并符号扩展为32位,使指令转移范围为±4MB。这是因为专一指令链接子程序通常需要一个大的范围,很难用16位指令格式实现。为了使者2条指令相互独立,使它们之间也能响应中断等,所以将链接寄存器LR作为暂存器使用。LR在这2条指令执行完后会被覆盖,因此LR中不能装有有效内容。这个指令对的操作为:
(H=0) LR<-PC+(偏移量左移12后符号扩展至32位);
(H=1) PC<-LR+(偏移量左移1位);LR<-oldPC+3
这里,oldPC是第2条指令的地址;加3使产生的地址指向下一条指令并且使最低位置位以指示这是一个Thumb程序。用格式(
(BL,H=0) LR<-PC+(偏移量左移12后符号扩展至32位);
(BLX) PC<-LR+(偏移量左移1位)&0xFFFFFFFC;LR<- oldPC+3,清Thumb指示位。
应注意,该形式的指令转移的目标是ARM指令,偏移地址只需要10位,而且必须对PC值的位1进行清0操作。格式(4)直接对应ARM指令B{L}X,不同之处是,BLX指令中R14值为后续指令地址加1,以指示是被Thumb代码调用。指令中H置1时,选择高8个寄存器(R8~R15)。
汇编格式
B <cond><lable> ;格式(1) 目标位Thumb代码
B <lable> ;格式(2) 目标为Thumb代码
BL <lable> ;格式(3) 目标为Thumb代码
BLX <lable> ;格式(
B{L}X Rm ;格式(4) 目标位ARM或Thumb代码
转移链接产生两条格式(3)指令。格式(3)指令必须成对出现而不能单独使用。同样,BLX产生一条格式(3)指令和一条指令(
凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网