我正在分析一个胖的Macho-O二进制文件,它里面有ADRP和ADD指令。
我在说这些指令: >
__text:00000001002E050C ADRP X8, #some_function@PAGE
__text:00000001002E0510 ADD X8, X8, #some_function@PAGEOFF
ADRP指令的字节为“ 08 00 00 90”。
ADD指令的字节为“ 08 61 0D 91”
如何从2条指令中获取值?
这是我的程序,用于计算some_function的地址:
它应该对21位偏移量进行符号扩展,将其左移12位,然后加上将其清零12个低位的代码到PC。 >执行指令后,值00000001002E0358应该在X8中,因为这是我们要计算的函数的地址。
我的程序输出为: >
我在做什么错?
结论:我读错了ARM手册。
AArch64官方手册
最终代码:
int instr = 0x90000008;
//int instr = 0x80000090;
int value = 0x1fffff & instr;
int mask = 0x100000;
if(mask & instr)
{
value += 0xffe00000;
}
printf("value : %08x\n", value);
value = value << 12;
printf("value : %08x\n", value);
int instr2 = 0x910d6108;
//int instr2 = 0x08610d91;
value += (instr2 & 0xfff); //get the last 12 bits from instr2
printf("value : %08x\n", value);
#1 楼
对于第一条指令(0x90000008
),它与以下PC相对寻址指令的操作码相匹配。 immhi = 0,Rd = 8(X8)。指令解码为0x90000008 = 0b10010000000000000000000000001000
。这将跳转到指令指针所在的当前页面,加0 << 12,并存储在寄存器ADRP X8, #0
中,这样您将具有下一条指令X8
匹配X8 = page_address_of(0x00000001002E050C) + 0<<12 = 0x00000001002E0000
,所以我们有sf = 1(64位变体),op = 0(添加),S = 0(非饱和),shift = 0(LSL#0),imm12 = 0x358,Rn = 8(X8),Rd = 8(X8)。这样您就可以0x910d6108
评论
您如何解码0x90000008指令?
–探索者
17年5月25日在14:34
在哪里可以找到有关解码ARM指令的信息?
–探索者
17年5月25日在14:55
那将是《 ARMv8体系结构参考手册》。
–伊恩·库克(Ian Cook)
17年5月25日在17:35
非常感谢你!找到正确的手册,现在编写代码进行计算,我将发布解决方案。
–探索者
17年5月25日在18:05