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

愛在花開的季節  金牌会员 | 2024-6-9 21:40:34 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 789|帖子 789|积分 2367

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寄存器的作用。
  1. // ARMAssemble`-[ViewController viewDidLoad]:
  2. 0x104e94000 <+0>:  sub    sp, sp, #0x30
  3. 0x104e94004 <+4>:  stp    x29, x30, [sp, #0x20]
  4. 0x104e94008 <+8>:  add    x29, sp, #0x20
  5. ...
复制代码
上面代码是一个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代表的含义:
  1. (lldb) p/x $x30
  2. (unsigned long) 0x00000001c43df260
  3. (lldb) image lookup -a $x30
  4.       Address: UIKitCore[0x0000000189353260] (UIKitCore.__TEXT.__text + 3665488)
  5.       Summary: UIKitCore`-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled] + 84
复制代码
从输出看到,这个地点位于函数-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled]中,正是这个函数调用了-[UIViewController viewDidLoad]。寄存器X30存储的地点0x1c43df260正是viewDidLoad函数返回后,要执行的指令地点:
  1. // UIKitCore`-[UIViewController _sendViewDidLoadWithAppearanceProxyObjectTaggingEnabled]:
  2. ...
  3. 0x1c43df25c <+80>:  bl     0x18a7b7e80 ; objc_msgSend$viewDidLoad
  4. // X30 的地址指向这行代码
  5. 0x1c43df260 <+84>:  mov    x0, x19
复制代码
上面代码第1行调用函数-[UIViewController viewDidLoad]。
代码第2行就是函数-[UIViewController viewDidLoad]返回后要执行的指令,其地点正好是0x1c43df260。
2 SP

SP是栈顶指针寄存器,类似Intel 64中的RSP寄存器。
3 PC

PC寄存器存储当前要执行的指令地点,类似Intel 64中的RIP寄存器。
  1. // ARMAssemble`-[ViewController viewDidLoad]:
  2. ->  0x104e94000 <+0>:  sub    sp, sp, #0x30
  3.     0x104e94004 <+4>:  stp    x29, x30, [sp, #0x20]
  4.     ...
复制代码
上面代码第1行,正要执行0x104e94000地点处指令,打印寄存器PC的值,也正好是0x104e94000:
  1. (lldb) p/x $PC
  2. (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寄存器。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表