【问题标题】:ARM BLX Instruction Range (absolute)ARM BLX 指令范围(绝对)
【发布时间】:2011-02-14 19:11:17
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: embedded arm


    【解决方案1】:

    您可以使用任何地址作为 BLX RX 形式的 RX 寄存器。它将执行 arm arm 中描述的动作。

    如果 ConditionPassed(cond) 然后 目标=RM LR = BLX 指令之后的指令地址 CPSR T 位 = 目标 [0] PC = 目标和 0xFFFFFFFE

    如果代码、调用或被调用的代码都不是拇指模式,那么您可能没问题,请确保在这种情况下您提供的地址的 lsbit 为零。您实际上需要在 0x05000000 处拥有代码,并且需要旨在处理分支链接的代码,这意味着如果它进行更多 bl 样式调用,它会维护链接寄存器 (r14)。同样,如果您在从其他人调用的函数中进行此 blx 调用,则需要在进行 blx 调用之前保留 r14 并恢复 r14,或者在从函数返回时执行任何操作以将该值放回 r15 (pc)。

    反汇编/objdump 列表的代码示例或 sn-ps 将有助于进一步帮助您解决此问题。包含 blx 的代码和被调用的代码。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 2014-06-30
        • 2014-10-26
        • 2014-11-24
        • 1970-01-01
        • 2016-01-13
        相关资源
        最近更新 更多