Board logo

标题: ARM指令如何在thumb和arm模式切换 [打印本页]

作者: look_w    时间: 2017-10-24 21:07     标题: ARM指令如何在thumb和arm模式切换

根据arm spec, 跳转地址最低位( lsb ) 为0表示 arm 指令;最低位为1表示thumb指令。

一、绝对地址跳转进入 thumb模式


如下指令可以切换到thumb模式。






如果已经知道 0x24000 地址存放的是 thumb 指令, 可以直接使用如下方式切换到arm 模式






因此, 无论当前处理器模式是thumb或者arm, 只要0x24000 地址处存放的是 thumb 指令, 就可以通过 BX 指令跳转到 thumb 模式。

二、标号跳转进入thumb 模式


如果不知道链接地址,只知道标号,可以用如下指令跳转。

ldr r6,=labelbx r6上述指令的问题在于,如果linker 知道 label 对应的是一条 arm 指令或者 thumb 指令,该指令能正常工作。如果linker不能正确区别 label 的指令类型,将会导致错误。

指令示例







编译链接后如下





ping 可以正确 bx r0 跳转到 0xd6008158。
但是pong 不能。 因为 pong 通过 bx r0 跳转到 0xd600815c 地址后得到的是一条 arm 地址 0xd6008148 ( lsb=0 )。


GNU linker 帮助开发者解决了这些麻烦。GNU 汇编器 as 定义了 .thumb_func 符号。

如果正确的使用了该符号, GNU assembler/linker 将会正确的生成对应的指令序列。


改写后的指令示例






编译链接后的指令





这样生成的代码正是我们所期待的。 0xd600815c 地址对应的指令 ( lsb=1 ) 已经被正确设置成 thumb 指令。对于 C 函数, GNU Compiler 将会正确处理类似关系。
但是对于 arm assmebly 函数, 必须要通过 使用.thumb_func 符号或者其他被  as 工具定义的符号, 使得 as 工具知道这是一个thumb label.




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0