ARM BLX指令范围(绝对值)

时间:2011-02-13 17:46:47

标签: embedded arm

我对ARM BLX指令有疑问,特别是有关BLX RX指令的问题。在ARM手册中,它指出对于BLX标签,标签应该在32MB范围内。在我的代码中,我将R0寄存器设置为指向address1。我当前地址和地址1(目的地地址)之间的距离约为0x05000000。

当我到达指令时,它崩溃了(address1中的代码是ARM,因此T模式没有问题)。在BLX中使用绝对值时是否有任何限制?我应该使用胶合板吗?

谢谢!

2 个答案:

答案 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'?它究竟在哪里崩溃?