Armv8 - ADRP指令

ADRP指令

  • 作用

    • 将当前指令所在页的基地址加/减去字节差,并写入目标寄存器
      • 字节差:与目标地址页基地址的间隔字节数,其为PAGE_SIZE的整数倍
      • 此时的字节差就是指令所操作的立即数
    • 该指令通常配合add指令来向目标寄存器写入完整的地址
    • 最后通过br、blr实现长跳转

  • 字节码对应关系

    • Adrp指令字节码案例
      • 0x90 0xFF 0xFF 0xE1
    • 对应二进制
      • 1001 0000 1111 1111 1111 1111 1110 0001
    • 寄存器位 4-0
      • 0 0001 -> 表示x1寄存器
      • 如果是 0 0000 -> 则表示x0寄存器
      • 以此类推
        • 0 0010 -> x2
        • 0 0011 -> x3
        • n nnnn -> x...
    • 立即数位(高19位) 23-5
      • 1111 1111 1111 1111 111
    • adr指令位 28-24
      • 10000
      • 至于为什么是adr指令位而不是adrp指令位,是因为我发现两者是相同的
      • adr与adrp的差异在于第31位是否为1
    • 立即数位(低2位) 30-29
      • 00
    • 64位操作位 31
      • 1
      • 当该位为1时表示adrp指令,当为0时表示adr指令
  • 对照表

    复制代码
     1    00      10000  1111 1111 1111 1111 111   00001
    |31| 30-29  | 28-24 | 23-5                    | 4-0 |
    |sf| immlo  |       | immhi                   | rd  |

ADRP指令操作数的推导过程

  • 在armv8指令手册中是这么写的
    • SignExtend(immhi:immlo:Zeros(12), 64);
  • 字面理解就是
    • 有符号扩展(操作数高位:操作数低位:12个0,总长64位)
  • 根据上述案例配合表达式进行计算
    • 拼接结果
      • = 1111 1111 1111 1111 111 00 0000 0000 0000
      • = 0x1 FFFF C000
    • 符号扩展步骤及结果
      • = 0x1 FFFF C000 << 31 >>31
      • = 0xFFFF FFFF FFFF C000
      • = -16384
    • 也就是说,要在当前指令所在页基地址基础上减去16384字节
    • -16384/PAGE_SIZE = -4, 也就是4页的大小
相关推荐
Coder个人博客6 小时前
Linux6.19-ARM64 mm mmu子模块深入分析
大数据·linux·车载系统·系统架构·系统安全·鸿蒙系统
Doro再努力9 小时前
Vim 快速上手实操手册:从入门到生产环境实战
linux·编辑器·vim
wypywyp9 小时前
8. ubuntu 虚拟机 linux 服务器 TCP/IP 概念辨析
linux·服务器·ubuntu
Doro再努力9 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
senijusene9 小时前
Linux软件编程:IO编程,标准IO(1)
linux·运维·服务器
忧郁的橙子.9 小时前
02-本地部署Ollama、Python
linux·运维·服务器
醇氧9 小时前
【linux】查看发行版信息
linux·运维·服务器
No8g攻城狮10 小时前
【Linux】Windows11 安装 WSL2 并运行 Ubuntu 22.04 详细操作步骤
linux·运维·ubuntu
XiaoFan01210 小时前
免密批量抓取日志并集中输出
java·linux·服务器
souyuanzhanvip10 小时前
ServerBox v1.0.1316 跨平台 Linux 服务器管理工具
linux·运维·服务器