我正在尝试学习在固件修改中有用的技能(我没有源代码)这些问题涉及使用拇指代码中的BX来跳转或调用其他现有的拇指代码.
我的理解是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)
这是我不明白的地方:
R2中的地址没有设置lsb位...所以不会bx r2将模式切换到ARM模式?
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自动?