【发布时间】: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