ARM64基础 -- x29 和 x30 寄存器详解

ARM64 架构中的 x29 和 x30 寄存器详解

在 ARM64 架构中,x29x30 是两个通用寄存器,但它们有特殊的惯例用途,特别是在函数调用和栈帧管理中。以下是对这两个寄存器的详细讲解。

1. x29 寄存器

别名:FP(Frame Pointer,帧指针)

  • 在 ARM64 中,x29 通常被用作帧指针(FP)。帧指针是一个指向当前栈帧基址的寄存器。
  • 每当函数被调用时,会在栈上分配一个新的栈帧,并将当前的栈顶指针(SP)的值存储到 x29,从而标记当前栈帧的起始位置。
  • 使用帧指针可以方便地访问函数的局部变量、传递的参数和保存的返回地址。帧指针提供了一个固定的参考点,无论栈指针如何移动,帧指针都保持不变,指向栈帧的基址。

使用场景

  • 调试和栈回溯:在调试过程中,帧指针是非常重要的,因为它提供了每个栈帧的基址,使得调试器能够轻松地遍历整个调用栈。
  • 访问局部变量:在函数中,通过 x29 可以计算局部变量和参数的偏移量,方便访问这些数据。
  • 栈帧链表:通过保存每个函数调用的帧指针,函数返回时可以通过 x29 恢复到前一个栈帧,实现栈帧链表的结构。

2. x30 寄存器

别名:LR(Link Register,链接寄存器)

  • x30 通常被用作链接寄存器(LR),即保存函数返回地址的寄存器。
  • 在调用函数时,当前指令的下一个地址(也就是返回地址)会被自动存储到 x30,以便在函数执行完毕后通过 ret 指令返回调用者。
  • 链接寄存器避免了每次函数调用都必须在栈上保存返回地址,提高了函数调用的效率。

使用场景

  • 函数返回地址:当一个函数被调用时,返回地址会被保存到 x30,执行 ret 指令时程序会跳转回这个地址。
  • 嵌套函数调用:对于嵌套的函数调用,通常会将 x30 的值保存到栈中,以防止后续的函数调用覆盖 x30,在函数返回时再从栈中恢复 x30
  • 异常处理:在异常处理或中断处理程序中,x30 也可能用于保存返回地址,确保异常处理完毕后能正确返回。

3. 典型使用流程

当一个函数被调用时,通常会使用以下步骤处理 x29x30

  1. 保存上下文

    • 函数入口时,通常将当前的 x29(旧的帧指针)和 x30(返回地址)同时保存到栈中:
      stp x29, x30, [sp, #-16]!  // 保存旧的帧指针和返回地址,更新 SP
      
    • 更新 x29 为新的帧指针,指向当前栈帧的基址:
      mov x29, sp  // 设置新的帧指针
      
  2. 函数执行

    • 在函数执行过程中,可以使用 x29 访问栈帧中的局部变量和传入的参数,而 x30 保持函数返回地址不变,等待函数结束后跳转。
  3. 恢复上下文

    • 函数即将返回时,需要从栈中恢复 x29x30 的值:
      ldp x29, x30, [sp], #16  // 恢复旧的帧指针和返回地址,更新 SP
      
    • 使用 ret 指令,通过 x30 返回调用者:
      ret  // 返回到 `x30` 中保存的地址
      

4. 总结

  • x29 (FP):用于指向当前栈帧的基址,便于函数内部访问局部变量和参数,帮助调试和栈回溯。
  • x30 (LR):用于存储函数的返回地址,确保函数执行完毕后能正确返回调用者。

通过这些寄存器,ARM64 能够高效管理函数调用和返回,保持程序的结构清晰和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyTorch】深入浅出PyTorch

为什么要学习PyTorch Why learn PyTorch PyTorch日益增长的发展速度与深度学习时代的迫切需求 PyTorch实验模型训练 数据 模型 损失函数 优化器 迭代训练 模型应用 如何学习和掌握PyTorch 勤动手 成体系 构建知识体系 熟悉知识分布 对应查缺补漏 多总结

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:…

在 Spring Boot 中使用 Spring Security + JWT + MySQL 实现基于 Token 的身份认证

文章目录 在 Spring Boot 中使用 Spring Security JWT MySQL 实现基于 Token 的身份认证一、引言二、环境搭建1、第一步:引入依赖2、第二步:配置MySQL数据库 三、实现身份认证三、实现身份认证1、定义实体和数据访问层1.1、实体类定义1.2、数据访问层 …

华为OD机试 - 端口合并(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

Web后端服务平台解析漏洞与修复、文件包含漏洞详解

免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国…

mysql怎样优化count(*) from 表名 where …… or ……这种慢sql

一 问题描述 线上发现一条类似这样的慢sql(查询时长8s): select id,name,(select count(*) from t14 where t14.idt15.id or t14.id2t15.id) as cnt from t15 ; t14的id和id2字段上都有索引,但是因为条件里有or,导致…

电路设计学习(一)

FUSB302BUCX 可编程 USB Type-C 控制器,带 PD(默认 SNK) FUSB302BUCX 是一款由 ON Semiconductor 生产的 USB Type-C 控制器,用于实现 USB Type-C 和 USB Power Delivery (PD) 协议。它主要负责 USB Type-C 端口的检测、CC 引脚…

GESP C++二级样题卷

一、单选题(每题 2 分,共 30 分) 1.目前主流的计算机储存数据最终都是转换成( )数据进行储存。 ​ A.二进制 ​ B.十进制 ​ C. 八进制 ​ D.十六进制 2.已知大写字…

结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142176639 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

量化交易backtrader实践(二)_基础加强篇(3)_策略类实践进阶

通过前面几节的实践,我们已经对股票数据的获取,pandasData数据的格式处理,到bactrader的DATAS结构以及里面的data的数据结构,以及在init和next函数中如何读取和计算都有了比较清晰的认知。我们通过一个最简的回测系统,…

Java 读取特定目录下子文件夹的 json格式文件并解析

一、需求   有一个目录结构,包含多个子文件夹,每个子文件夹中都有一个名为goods.txt的文件,文件内容以 JSON 格式存储。现在需要将所有的goods.txt文件内容读取出来,放在一个List集合中,以便进行后续的处理。 二、使…

Pre-training、Post-training、Continue training的区别

在训练大语言模型时,大家可能会搞混以下几个概念,下面做一个详细的对比区分: 概念Pre-training(预训练)Post-training(后训练)Continue Training(持续训练)定义预训练是…

C# 结合 Javascript 测试获取天气信息

目录 测试效果 范例运行环境 关键代码 C#获取网页数据 前端代码 JavaScript 实现 总结 测试效果 获取一些简单的天气信息,可以丰富我们的应用系统,比如开发一个小桌面,小组件,增加一些实用性的系统功能,本文将…

pip清华源地址

一、pip清华源地址 https://pypi.tuna.tsinghua.edu.cn/simple 二、清华源使用方法 pip install package_name -i https://pypi.tuna.tsinghua.edu.cn/simple 三、将清华源设置为默认源: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/si…

neo4j安装为服务+配置环境变量

目录 neo4j安装为服务 windows services 参照JDK,将neo4j加入到环境变量 neo4j安装为服务 windows services 我的上一篇文章详细写明了如何安装启动neo4j《neo4j安装启动教程对应的jdk配置》,文末的启动neo4j是通过cmd命令行访问bin目录,这…

Git+Jenkins 基本使用(Basic Usage of Git+Jenkins)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Java企业面试题2

1.语言的分代: 第1代:机器语言 机器语言是最底层的计算机编程语言,它是由二进制数构成的一系列指令,直接与计算机硬件交互。每个二进制位模式代表一条特定的指令或数据地址。因为它是直接在硬件上执行的,所以运行效率…

大尺寸卷积核的优缺点

大尺寸卷积核在卷积神经网络中具有一些独特的优缺点,具体如下: 优点: 更大的感受野: 大尺寸卷积核能够捕获更大的上下文信息,拥有更广的感受野。它可以一次性处理更大区域的特征信息,尤其在处理复杂的视觉…

诚邀见证2024九章云极DataCanvas算力包产品发布会!

算力,是驱动全球智能化升级的关键力量,也是智算经济腾飞的主要燃料。 在智算经济腾起之际,我们洞察未来:算力不仅是生产力还将作为社会性普惠AI资源。我们思考未来:算力产品和模式需要何种创新才能够加速算力普惠的进程?我们定义未来:用单位…

react学习笔记一:react介绍

将view规划成一个个的组件,是一个响应式的声明式的设计。 虚拟dom,减少dom操作。vue的虚拟dom是在react的基础上拓展来的。 单向数据流:是一种数据流动的模式。数据流的方向是有上到下的,在react中主要是从父组件流向子组件。 …