簡體   English   中英

ARMv7a BL指令,計算目標地址

[英]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):

分支目標地址的計算方法如下:

  1. 將24位帶符號(二進制補碼)的符號立即擴展為32位。

  2. 將結果左移兩位。

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

至於為什么,請參閱同一文檔中的2.7.4預取和自修改代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM