一文搞懂 ARM 64 系列: 寄存器
ARM 64中包含多种寄存器,下面介绍一些常见的寄存器。
1 通用寄存器
ARM 64包含31个64bit寄存器,记为X0~X30。
每一个通用寄存器,它的低32bit都可以被访问,记为W0~W30。

在这31个通用寄存器中,有2个寄存器比较特殊。
X29寄存器被作为栈帧寄存器,也被称为FP(Frame Pointer Register)。
X30寄存器被作为函数返回地址寄存器,也被称为LR(Link Register)。
下面从一个例子来看X29寄存器与X30寄存器的作用。
// ARMAssemble`-[ViewController viewDidLoad]:
0x104e94000 <+0>: sub sp, sp, #0x30
0x104e94004 <+4>: stp x29, x30, [sp, #0x20]
0x104e94008 <+8>: add x29, sp, #0x20
...
上面代码是一个VC viewDidLoad汇编方法的开头部分。
代码第1行将栈寄存器SP的值减少0x30,也就是开辟了0x30的栈空间。
代码第2行将寄存器X29与寄存器X30存入(sp + 0x20)指向的地址。
代码第3行将(SP + 0x20)这个地址值写入寄存器X29,形成新的栈帧FP。

从上图可以看到新FP存储在寄存器X29,而上一个栈帧FP的值被存入到地址(SP + 0x20)。这样,随着函数一层一层调用,栈帧也被串联起来。
对于寄存器X30,可以使用image lookup -a命令查看其存储的地址0x1c43df260代表的含义:
(lldb) p/x $x30
(unsigned long) 0x00000001c43df260
(lldb) image lookup -a $x30
Address: UIKitCore[0x0000000189353260] (UIKitCore.__TEXT.__text + 3665488)
Summary: UIKitCore`-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled] + 84
从输出看到,这个地址位于函数-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled]中,正是这个函数调用了-[UIViewController viewDidLoad]。寄存器X30存储的地址0x1c43df260正是viewDidLoad函数返回后,要执行的指令地址:
// UIKitCore`-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled]:
...
0x1c43df25c <+80>: bl 0x18a7b7e80 ; objc_msgSend$viewDidLoad
// X30 的地址指向这行代码
0x1c43df260 <+84>: mov x0, x19
上面代码第1行调用函数-[UIViewController viewDidLoad]。
代码第2行就是函数-[UIViewController viewDidLoad]返回后要执行的指令,其地址正好是0x1c43df260。
2 SP
SP是栈顶指针寄存器,类似Intel 64中的RSP寄存器。
3 PC
PC寄存器存储当前要执行的指令地址,类似Intel 64中的RIP寄存器。
// ARMAssemble`-[ViewController viewDidLoad]:
-> 0x104e94000 <+0>: sub sp, sp, #0x30
0x104e94004 <+4>: stp x29, x30, [sp, #0x20]
...
上面代码第1行,正要执行0x104e94000地址处指令,打印寄存器PC的值,也正好是0x104e94000:
(lldb) p/x $PC
(unsigned long) 0x0000000104e94000
4 SIMD&FP 寄存器
SIMD是单指令多数据的缩写(Signle Instruction,Multiple Data),FP代表浮点数(Float Point)。
SIMD&FP寄存器有32个,记为V0~V31,每一个寄存器都是128bit。
当访问SIMD&FP寄存器的全部128bit时,它们也可以被记为Q0~Q31。
当访问SIMD&FP寄存器的低64bit时,它们被记为D0~D31,此时也是被当成浮点数寄存器使用。
当访问SIMD&FP寄存器的低32bit时,它们被记为S0~S31。
当访问SIMD&FP寄存器的低16bit时,它们被记为H0~H31。
当访问SIMD&FP寄存器的低8bit时,它们被记为B0~B31。

如果一条指令包含寄存器Vn,寄存器Vn同时存储比如4个32bit数据,这样一条指令就包含了4个数据,也就是所谓的单指令多数据SIMD应用场景。
在矩阵运算中,常常能看到SIMD的应用。
5 Z 寄存器
Z寄存器也就是标量向量寄存器(Scalable Vector Register)。
ARM 64中有32个Z寄存器,Z寄存器最低可以有128bit,最高有2048bit。具体长度有处理器实现决定。
如果Z寄存器的长度是128bit,那么它其实就是一个SIMD&FP寄存器。

一文搞懂 ARM 64 系列: 寄存器的更多相关文章
- 一文搞懂vim复制粘贴
转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...
- 一文搞懂所有Java集合面试题
Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...
- 一文搞懂指标采集利器 Telegraf
作者| 姜闻名 来源|尔达 Erda 公众号 导读:为了让大家更好的了解 MSP 中 APM 系统的设计实现,我们决定编写一个<详聊微服务观测>系列文章,深入 APM 系统的产品.架构 ...
- 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质
一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...
- 基础篇|一文搞懂RNN(循环神经网络)
基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...
- 一文搞懂 Prometheus 的直方图
原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ...
- Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!
本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...
- 三文搞懂学会Docker容器技术(中)
接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
- 一文搞懂 js 中的各种 for 循环的不同之处
一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...
随机推荐
- 1小时打造HaaS版小小蛮驴智能车
简介: 2020年云栖大会上,阿里云发布了一款机器人"小蛮驴",瞬间激起千层浪,无人车,智能物流,机器人等一些概念又火热了一把. 借"小蛮驴"的东风以及火热的H ...
- 排查指南 | 两个案例学会从埋点排查 iOS 离线包
简介: 首次打开离线包白屏以及报错"-1009"等该如何处理呢? 离线包原理 以一次启动离线包的流程为例,离线包的加载流程分为两种场景,第一种是离线包下载好的场景,流程如图1 ...
- WPF dotnet 6 开启 PM v2 的 DPI 感知 导致触摸线程访问 UI 属性抛异常
本文记录一个 WPF 在 dotnet 6 的一个已知问题,且此问题我已修复提交给官方仓库.这是一个只有在 dotnet 6 框架下,非 dotnet 5 也非 .NET Core 3.1 也非 .N ...
- gitlab-ce-15.9.4安装
如果需要汉化版本,请根据汉化来选择版本 汉化包下载地址:https://gitlab.com/xhang/gitlab/ 1.依赖包安装 yum -y install policycoreutils- ...
- 全网最详细SpringCloud-高级篇
SpringCloud-高级篇 高级篇包含微服务保护(流量控制,系统保护,熔断降级,服务授权).分布式事务.多级缓存.Redis集群.可靠消息服务 学习安排 技术分类 1.微服务保护 ①初识Senti ...
- C语言程序设计-笔记5-数据类型和表达式
C语言程序设计-笔记5-数据类型和表达式 例6-1 大小写英文字母转换.输入一样字符,将其中的大写字母转换为相应的小写字母后输出,小写字母转换为相应的大写字母后输出,其他字符按原样输出. #incl ...
- 习题8 #第8章 Verilog有限状态机设计-2 #Verilog #Quartus #modelsim
2. 设计一个"1001"串行数据检测器,其输入.输出如下: 输入x:000 101 010 010 011 101 001 110 101 输出z:000 000 000 010 ...
- Ollama开发指南
安装必备工具 确保已安装以下软件的正确版本: CMake 3.24 或更高版本 Go 1.22 或更高版本 GCC 11.4.0 或更高版本 使用 Homebrew 安装这些工具(适用于macOS和L ...
- 四、Doris物化视图
使用场景: 在实际的业务场景中,通常存在两种场景并存的分析需求:对固定维度的聚合分析 和 对原始明细数据任意维度的分析. 例如,在销售场景中,每条订单数据包含这几个维度信息(item_id, sol ...
- VMware虚拟机安装Centos-7.9
VMware虚拟机安装Centos-7.9 创作不易,点赞关注一下吧 1.安装VMware Workstation Pro 大家根据自己的实际情况安装合适版本的VMware Workstation P ...