文章目录
- adrp作用
- 计算规则例1
- 计算规则例2
- adrp的使用举例
adrp作用
adrp 寄存器,寄存器的功能是使用它pc按照一定的规则计算寄存器的立即数.
计算规则例1
adrp x8,1
adrp指令是赋值寄存器.赋值规则如下: 先把pc寄存器中的数值首先按照16进制表示,然后在后三位清零adrp 右侧立即数,左移3位,即末尾 3个0 .然后加上两个结果. 例如上面的例子 pc = 0x0000000104ff6754 然后把pc后3位清零 得到0x0000000104ff6000 adrp x8,1 右侧立即数为1,左移3位,得到 0x1000 然后让0x0000000104ff6000 0x1000 = 0x0000000104ff7000 再把0x0000000104ff7000 赋值给 x8
下面是lldb的调试结果得到 x8 = 0x0000000104ff7000,与上述分析结果相同
(lldb) re read pc pc = 0x0000000104ff6754 arm64Demo`test1 20 at ViewController.m (lldb) si (lldb) re read x8 x8 = 0x0000000104ff7000 "tifier:forLocalNotification:withResponseInfo:completionHandler:"
计算规则例2
adrp x9,0x22
pc = 0x0000000104ff6754 把pc 后3位清零 = 0x0000000104ff6000 然后把0x22左移3位 = 0x22000 0x0000000104ff6000 0x22000 = 0x105018000 然后把0x105018000赋值给x9
adrp的使用举例
下面的c代码赋值字符串.
char * str = "123456";
xcode翻译以下4行汇编代码 前三行的作用是先把x8中存入"123456"的地址 第四行的作用是将函数栈中的栈底指针放在栈底x29(fp) -0x10的地址存入"123456"的地址值
0x104d36740 < 16>: stur w8, [x29, #-0x4] 0x104d36744 < 20>: adrp x8, 1 0x104d36748 < 24>: add x8, x8, #0x600 ; =0x600 0x104d3674c < 28>: stur x8, [x29, #-0x10]
下面是lldb可以看到调试过程x计算出字符串的0地址值x0000000104d37600,然后存放在栈里
(lldb) si (lldb) re read x8 x8 = 0x0000000104d37000 "ication:withResponseInfo:completionHandler:" (lldb) si (lldb) re read x8 x8 = 0x0000000104d37600 "123456" (lldb) si (lldb) x $x29-0x10 0x16b0cce40: 00 76 d3 04 01 00 00 00 65 00 3d ba 03 00 00 00 .v...e.=... 0x16b0cce50: b0 ce 0c 6b 01 00 00 00 0c 67 d3 04 01 00 00 00 ...k...g...