我对ARM BLX指令有疑问,特别是有关BLX RX指令的问题。在ARM手册中,它指出对于BLX标签,标签应该在32MB范围内。在我的代码中,我将R0寄存器设置为指向address1。我当前地址和地址1(目的地地址)之间的距离约为0x05000000。
当我到达指令时,它崩溃了(address1中的代码是ARM,因此T模式没有问题)。在BLX中使用绝对值时是否有任何限制?我应该使用胶合板吗?
谢谢!
答案 0 :(得分:2)
您可以使用任何地址作为BLX RX格式的RX寄存器。它将执行手臂中描述的操作。
if ConditionPassed(cond) then target = Rm LR = address of instruction after the BLX instruction CPSR T bit = target[0] PC = target AND 0xFFFFFFFE
如果调用的代码,调用或代码都不是拇指模式,那么你可能没问题,请确保在这种情况下你给它的地址的lsbit是零。你需要实际拥有0x05000000的代码,并且需要代码来处理分支链接,这意味着如果它进行更多的bl样式调用,它会维护链接寄存器(r14)。同样,如果你在从其他人调用的函数内进行此blx调用,则需要在进行blx调用之前保留r14并恢复r14,或者在从函数返回时将该值放回到r15(pc)中。
反汇编/ objdump列表的代码示例或片段对于进一步帮助您解决此问题非常有用。包含blx和被调用代码的代码。
答案 1 :(得分:0)
该限制仅适用于PC相关分支(指令中编码的偏移量),而不适用于寄存器分支。
因此崩溃的原因是另外的。你的处理器是什么?你真的在' address1'?它究竟在哪里崩溃?