如何在ARM中计算目标地址?
01F0D9AC 28 7D CB EB BL 011ECE54
如何计算地址,所以我们从这些十六进制字节 28 7D CB EB 获得 011ECE54 的地址?
答案 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中有详细描述