相关疑难解决方法(0)

在Thumb代码中使用BX来调用Thumb函数,或者跳转到另一个函数中的Thumb指令

我正在尝试学习在固件修改中有用的技能(我没有源代码)这些问题涉及使用拇指代码中的BX来跳转或调用其他现有的拇指代码.

  1. 如何从我的THUMB代码中将BX用于JUMP到现有固件THUMB代码.
  2. 如何从我的THUMB代码中使用BX来调用现有的THUMB函数(必须先设置LR).

我的理解是cpu查看lsb位(位0)并且我必须确保将其设置1为将cpu状态保持为"拇指状态".所以我想我必须添加1,将lsb位设置为1.

所以...说我想JUMP到0x24000(在一些现有的THUMB代码中间)

LDR R6, =0x24000
ADD R6, #1       @ (set lsb to 1)
BX R6
Run Code Online (Sandbox Code Playgroud)

我觉得这是对的吗?

现在说我想要使用BX调用现有的拇指功能,我希望它返回给我,所以我需要将LR设置为我希望它返回的位置.

让我说我要调用的函数是0x24000有人建议我使用:

ldr r2, =0x24000
mov lr, pc
bx r2
Run Code Online (Sandbox Code Playgroud)

这是我不明白的地方:

  1. R2中的地址没有设置lsb位...所以不会bx r2将模式切换到ARM模式?

  2. LR .. PC有地址(当前指令开始,+ 4),我被告知.在Thumb和Arm中,任何指令地址都必须对齐(16位或32位),因此它不会将LSB位设置为1.只有奇数将lsb位设置为1.

所以在上面的代码中,我将LR设置为(PC),一个也没有lsb位1设置的地址.因此,当我调用的函数来到它的结尾时,并且确实BX LR......嗯......如何才能返回到我的THUMB代码?我肯定错过了什么...

通常BL用于调用函数.手册说BL指令将LR设置为下一行代码......那么这是否意味着(通常使用的)BLTHUMB指令将LR设置为return addr + 1自动?

gcc arm thumb

15
推荐指数
1
解决办法
1万
查看次数

标签 统计

arm ×1

gcc ×1

thumb ×1