资讯详情

arm64汇编adrp指令作用和使用举例

文章目录

  • 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... 

标签: adr03arz集成电路ic

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台