Adrp/adr

  1. adr x9, #0x40
  2. adrp x9, 1356
  3. adrp x8, #_g@PAGE
    add x8, x8, #_g@PAGEOFF
    地址都是怎么计算出来呢
  1. adr xn, #imm => xn = $pc + imm
  2. adrp xn, #addr => xn = ($pc & (~(uint64_t)0xfff)) + addr << 12

注:$pc 为当前指令的地址

adrp 取出的是一个 64 位地址所在页的页偏移(@PAGE),随后再加上地址在页内的偏移量(@PAGEOFF),这一块如果有不清楚的地方可以看我之前写的一篇文章( https://juejin.im/post/5d67bbb7f265da03a53a4bce#heading-11 ):

3 个赞