【问题标题】:ARMv7a BL instruction, calculate target addressARMv7a BL指令,计算目标地址
【发布时间】:2016-02-23 12:51:25
【问题描述】:

我试图了解如何在 BL 指令 ARMv7a 中计算目标地址。

我创建了一个简单的示例程序并对其进行编译和链接。目标文件(elf)具有以下说明。

...
  14:   e3400000    movt    r0, #0
  18:   eb00000f    bl  5c <test>
  1c:   e50b0008    str r0, [fp, #-8]
...

0000005c <test>:
  5c:   e52db004    push    {fp}        ; (str fp, [sp, #-4]!)
  60:   e28db000    add fp, sp, #0

如果我理解 BL 正确,我应该得到 5c 作为目标地址。

从参考手册中我找到了以下描述:

imm32 = SignExtend(imm24:'00', 32);
targetAddress = PC + imm32;

其中 imm24 是指令的右 24 位。在我的例子中是 0x000000f。

如果我这样计算目标地址,我不会得到 5c。

// PC = 0x18 (where we find the BL instruction)
uint32_t imm24 = 0x00000f;
uint32_t imm32 = imm24 << 2;
// imm32 = 0x3c
uint32_t targetAddress = PC + imm32;
// targetAddress = 0x18 + 0x3c = 0x54

我错过了什么吗?

我使用了带有以下标志的 arm-none-eabi 交叉编译器:

CFLAGS=-Wall -O0 -march=armv7-a -mtune=cortex-a7 -marm

【问题讨论】:

  • 你可能错过了what's actually in the PC register...
  • 什么,存在阅读手册并能正确提问的人吗? :-O
  • @Jester 这个问题你不喜欢什么?我是 ARM 和汇编的新手,即使我正在阅读手册,也可能会错过一些东西。
  • 这是一种恭维,您为此获得了 +1 ... 抱歉,如果不清楚。在assembly 标签中,人们阅读手册并来这里询问是否不清楚,展示他们所做的事情并正确提出问题的情况并不常见。废话得到了大量的赞成票,而你只有一个。生活是不公平的。
  • 也许我应该更好地阅读 cmets。哈哈。不过,我有时会问一些奇怪的问题。谢谢:D

标签: assembly arm


【解决方案1】:

来自 ARM ARM(文档编号 DDI 0100E):

分支目标地址计算公式:

  1. 将 24 位有符号(二进制补码)立即符号扩展为 32 位。

  2. 将结果左移两位。

  3. 将此添加到PC的内容中,其中包含分支指令的地址加8。

至于为什么会这样,请看同一个文档中的2.7.4 预取和自修改代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2021-09-14
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    相关资源
    最近更新 更多