马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
在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程序。用格式(3a)的指令代替上面的第2步就可实现BLX指令。格式(3a)只在V5T结构中有效。它使用与上面的BL指令同样的第1步: (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> ;格式(3a)
目标为ARM代码 B{L}X Rm ;格式(4)
目标位ARM或Thumb代码 转移链接产生两条格式(3)指令。格式(3)指令必须成对出现而不能单独使用。同样,BLX产生一条格式(3)指令和一条指令(3a)指令。汇编器根据当前指令地址、目标指令标识符的地址以及对流水线行为的微调,计算出应插入指令中相应的偏移量。若转移目标不在寻址范围内,则给出错误信息。 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网 |