ARM BL指令计算,从操作码获取目标地址

时间:2018-02-17 13:59:13

标签: arm instructions calculation

如何在ARM中计算目标地址?

01F0D9AC    28 7D CB EB         BL 011ECE54

如何计算地址,所以我们从这些十六进制字节 28 7D CB EB 获得 011ECE54 的地址?

1 个答案:

答案 0 :(得分:1)

ARM指令操作码的规范参考是相关架构的ARM体系结构参考手册。

ARM-v8 ARM你可以查看AA的AArch32 T32编码。

F5.1.25 部分

开始
  

Branch with Link在PC相对地址调用子程序,并将LR设置为返回地址

编码A1显示{cond} {0xB} {imm24}

在下一页上,< label>描述:

  

对于编码A1:要分支到的指令的标签。汇编程序计算出   从BL指令的PC值到该标签的偏移量的必需值,然后选择a   将imm32设置为该偏移量的编码。   允许的偏移量是-33554432到33554428

范围内的4的倍数

伪代码描述:

  

IMM32 = SignExtend(imm24)

if ConditionPassed() then
EncodingSpecificOperations();
if CurrentInstrSet() == InstrSet_A32 then
    LR = PC - 4;
else
    LR = PC<31:1> : '1';
if targetInstrSet == InstrSet_A32 then
    targetAddress = Align(PC,4) + imm32;
else
    targetAddress = PC + imm32;
SelectInstrSet(targetInstrSet); 

你的第一个挑战是解决你的反汇编中的字节顺序,知道'AL',Always或无条件条件代码是0b1110。

然后,您必须从源列表中获取所有8个字节(而不是4个)来计算目标地址,但要注意检查PC如何用于计算返回地址。这在 E1.2.3 通用寄存器和处于AArch32状态的PC中有详细描述