2011-02-13 296 views
1

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

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

谢谢!

回答

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 

如果没有代码,调用或代码被称为是拇指模式,那么你可能是罚款,确保在这种情况下,你给它是一个零地址,所以LSb。您需要实际拥有0x05000000的代码,并且需要代码来处理分支链接,这意味着如果它进行更多bl样式调用,它将维护链接寄存器(r14)。同样,如果你在一个被其他人调用的函数内进行blx调用,你需要在进行blx调用之前保留r14,并且恢复r14和/或从函数返回时做任何将该值放回r15(pc)的值。

反汇编/ objdump列表的代码示例或代码段对于进一步帮助您解决此问题会很有用。包含blx和正在调用的代码的代码。

0

该限制仅适用于PC相对分支(在指令中编码的偏移量),而不是寄存器分支。

所以崩溃的原因是别的。你的处理器是什么?你真的在'address1'有代码吗?它究竟在哪里崩溃?