我试图了解 ARMadd
与 shift 是如何实现的,例如
sym.imp.__libc_start_main :
.plt:0x000082bc 00c68fe2 add ip, pc, 0, 12; after execution ip=0x82c4
.plt:0x000082c0 08ca8ce2 add ip, ip, 8, 20; after execution ip=0x102c4
.plt:0x000082c4 48fdbce5 ldr pc, [ip, 0xd48]!
我想知道这条线
.plt:0x000082c0 08ca8ce2 add ip, ip, 8, 20;
它将添加#0x8000
到 ip 寄存器。我的问题是为什么#0x8000
?
我假设它将是:
ip = ip + (8<<20)
所以,0x800000
但它更像是
ip = ip + (8<<(20-8))
这是为什么?我总是必须从班次中减去 8 吗?