adrp作用
adrp 寄存器,立即数,作用是把pc寄存器跟立即数按照一定规则计算后赋值给寄存器.
计算规则举例1
adrp x8,1
adrp指令是给寄存器赋值.赋值的规则是: 先把pc寄存器里的数值先按照16进制表示,后3位清零,再把adrp 右边的立即数,左移3位,也就是在末尾+3个0 .然后让2个结果相加. 例如上面的例子 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行汇编代码 前3行作用是先把x8中存入"123456"的地址 第4行作用是把函数栈中的栈底指针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调试过程,可以看到x8被计算出字符串的地址值0x0000000104d37600,然后存入到栈中
(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......
|