[英]ARMv7a BL instruction, calculate target address
我嘗試了解如何在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
從ARM ARM(文檔編號DDI 0100E):
分支目標地址的計算方法如下:
將24位帶符號(二進制補碼)的符號立即擴展為32位。
將結果左移兩位。
將此內容添加到PC的內容中, 其中包含分支指令的地址加8。
至於為什么,請參閱同一文檔中的2.7.4預取和自修改代碼 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.