首页 > 其他分享 >一文搞懂 ARM 64 系列: 寄存器

一文搞懂 ARM 64 系列: 寄存器

时间:2024-06-08 21:55:54浏览次数:24  
标签:FP sp 寄存器 地址 64 viewDidLoad SIMD 搞懂 ARM

ARM 64中包含多种寄存器,下面介绍一些常见的寄存器。

1 通用寄存器

ARM 64包含3164bit寄存器,记为X0~X30

每一个通用寄存器,它的低32bit都可以被访问,记为W0~W30

image

在这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

image

从上图可以看到新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

image

如果一条指令包含寄存器Vn,寄存器Vn同时存储比如432bit数据,这样一条指令就包含了4个数据,也就是所谓的单指令多数据SIMD应用场景。

在矩阵运算中,常常能看到SIMD的应用。

5 Z 寄存器

Z寄存器也就是标量向量寄存器(Scalable Vector Register)。

ARM 64中有32Z寄存器,Z寄存器最低可以有128bit,最高有2048bit。具体长度有处理器实现决定。

如果Z寄存器的长度是128bit,那么它其实就是一个SIMD&FP寄存器。

image

标签:FP,sp,寄存器,地址,64,viewDidLoad,SIMD,搞懂,ARM
From: https://www.cnblogs.com/chaoguo1234/p/18238984

相关文章

  • 8645 归并排序(非递归算法)
    Description用函数实现归并排序(非递归算法),并输出每趟排序的结果输入格式第一行:键盘输入待排序关键的个数n第二行:输入n个待排序关键字,用空格分隔数据输出格式每行输出每趟排序的结果,数据之间用一个空格分隔输入样例105480932671输出样例4508392......
  • Windows系统如何实现对高通ARM处理器的支持探讨
    近年来,随着移动设备和低功耗计算的兴起,ARM架构的处理器越来越受到关注。微软作为操作系统领域的巨头,推出了Windows系统对高通公司开发的ARM架构处理器的支持,这无疑引起了广泛的兴趣与讨论。那么,微软是如何实现对ARM处理器的支持的呢?是否采用了原生支持?是否由于增加了抽象层......
  • minos 2.1 中断虚拟化——ARMv8 异常处理
    首发公号:Rand_cs越往后,交叉的越多,大多都绕不开ARMv8的异常处理,所以必须得先了解了解ARMv8的异常处理流程先说一下术语,从手册中的用词来看,在x86平台,一般将异常和中断统称为中断,在ARM平台,一般将中断和异常统称为异常异常的流程,可以分为3个阶段,“设备”产生异常信号,中......
  • 小端序题目——[LitCTF 2023]debase64
    还挺有价值的,记录一下题目DIEPE文件在Windows操作系统下默认使用小端序IDAmain函数绿框:输入长度要20红框:base64加密黄框:加密后的结果要与关键数据相等  获取数据,我一般喜欢调试看栈,这样就少一次翻转了 取出15个数据:0x46,0xED,0x18,0x96,0x56,0x9E,0xD2,......
  • 玩客云刷armbian+CasaOS+Docker+LED灯控制+QBitTorrent+Cpolar内网穿透+青龙+Home Ass
    一、【玩客云的配置介绍】CPU是晶晨S805这是一款32位处理器的CPU,性能放在现在来看是比较弱鸡的,很多玩法都被这颗CPU的性能局限了。双USB2.0这个同样是被吐槽的地方,严重影响文件的传输速度。千兆网口这点比很多同期的设备强。但刷部分固件后会变成百兆。1GB+8GB存储组合这......
  • 【日记】遇到了一个 “不愿睁眼看世界也没受过社会毒打” 的逆天群友(464 字)
    正文今天坐在柜台玩了一天手机……手机都玩没电了快。下午在劝一个群友睁眼看世界,实在劝不动。他真的太逆天了,我不清楚这么高学历的人,怎么能说出这么天真的话。逆天又离谱。晚上的时间几乎全在做家务。平时晚上都是跳舞来着,没时间也不想动。意外地花了挺长时间。扫了地......
  • 程序猿大战Python——pycharm软件的使用
    基础配置==目标:==了解PyCharm软件的基础配置处理。修改背景颜色:Appearance->Theme修改字体大小:搜索font->Font例如,一起完成背景、字体大小的修改。==总结:==(1)如果要对PyCharm软件进行基础配置,则需要依次进行File->()中处理;==A、Settings==;B、set;(2)想要让PyC......
  • Harmony0S应用开发者高级认证(最新超全!!!)
    收集整理不易请留个赞再走吧qwq祝大家一次考过!!!需要Word文档的朋友可以小窗发给你考证网址 华为开发者官方网站_创新从这里开始云函数打包完成后,需要到AppGalleryConnect创建对应函数的触发器才可以在端侧中调用(错误)每一个自定义组件都有自己的生命周期(正确)基于端......
  • 51.《一篇浅浅的搞懂Android四大组件之一内容提供者和观察者》
    一内容提供者背景:之前提到过内容提供者就是在访问数据的时候那么它因何诞生我们之前的数据访问像SQLite之类访问都是在当前应用程序访问那则么能行而其他应用程序之间的访问就需要这一组件的帮助画的有点粗糙但大致就是这样工作的B通过ContentResolver类访问A中Conte......
  • Spring AOP 原理(摘要: 原创出处 jianshu.com/p/e18fd44964eb 「莫那一鲁道」)
    AOP的设计:每个Bean都会被JDK或者Cglib代理。取决于是否有接口。每个Bean会有多个“方法拦截器”。注意:拦截器分为两层,外层由Spring内核控制流程,内层拦截器是用户设置,也就是AOP。当代理方法被调用时,先经过外层拦截器,外层拦截器根据方法的各种信息判断该方法应该执行......