手臂BL指令计算,从Opcodes获取目标地址



如何计算目标地址?

01F0D9AC    28 7D CB EB         BL 011ECE54

如何计算地址,因此我们从这些HEX字节 28 7D CB EB

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

从ARM-V8 ARM中,您可以查找aarch32 t32编码bl。

f5.1.25

带有链接的分支机构调用PC相关地址的子例程,然后将LR设置为返回地址

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

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

用于编码A1:要分支到的指令的标签。汇编器计算从BL指令的PC值到此标签的偏移值的要求值,然后选择一个编码将IMM32设置为该偏移的编码。允许的偏移量是–33554432至33554428

在范围内4的倍数

伪代码描述:

inm32 = 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'',始终或无条件,条件代码为0b1110。

然后,您必须从源列表中获取所有8个字节(而不是4个字节(才能计算目标地址,但要注意如何使用PC来计算返回地址。这在 e1.2.3 中详细描述了通用寄存器和PC,在Aarch32 State

最新更新