一文搞懂 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 ...
随机推荐
- 力扣1076(MySQL)-员工项目Ⅱ(简单)
题目: 编写一个SQL查询,报告所有雇员最多的项目. 查询结果格式如下所示: 解题思路: 方法一:将两个表联结,以project_id进行分组,统计员工数降序排序,然后筛选出第一条数据. 1 sel ...
- 力扣550(MySQL)-游戏玩法分析Ⅳ(中等)
题目: 需求:编写一个 SQL 查询,报告在首次登录的第二天再次登录的玩家的分数,四舍五入到小数点后两位.换句话说,您需要计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数. 查询结 ...
- 力扣306(java)-累加数(中等)
题目: 累加数 是一个字符串,组成它的数字可以形成累加序列. 一个有效的 累加序列 必须 至少 包含 3 个数.除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和. 给你一个只包含数 ...
- 力扣461(java)-汉明距离(简单)
题目: 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目. 给你两个整数 x 和 y,计算并返回它们之间的汉明距离. 示例 1: 输入:x = 1, y = 4输出:2解释:1 ...
- 优化搜索排序结果从而“ 提升CTR、CVR业务指标”
简介: 搭建搜索功能不难,难的是如何提高搜索质量,帮助用户快速找到心中所想的内容或商品,那么搜索结果的相关性排序则是影响用户体验最关键的一环,本文通过阿里云开放搜索电商行业解决方案和大家聊一聊如何优化 ...
- KubeCon 2020 演讲集锦|《阿里巴巴云原生技术与实践 13 讲》开放下载
2020 年 7 月 30 日至 8 月 1 日,由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 Cloud Native + Open S ...
- Serverless Kubernetes 落地实践
简介:如何通过原生 Kubernetes 提供 Serverless 能力?如何借力丰富的云原生社区生态?本文将给大家介绍一下我们在 Serverless Kubernetes 上的落地实践. 作者 ...
- 来电科技:基于Flink+Hologres的实时数仓演进之路
简介: 本文将会讲述共享充电宝开创企业来电科技如何基于Flink+Hologres构建统一数据服务加速的实时数仓 作者:陈健新,来电科技数据仓库开发工程师,目前专注于负责来电科技大数据平台离线和实时架 ...
- 使用 Flink Hudi 构建流式数据湖
简介: 本文介绍了 Flink Hudi 通过流计算对原有基于 mini-batch 的增量计算模型的不断优化演进. 本文介绍了 Flink Hudi 通过流计算对原有基于 mini-batch 的 ...
- 什么是 ELF 文件(文件格式)
ELF 是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件. 是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interface,ABI) ...