arm 体系架构-过程调用标准AAPCS

一、什么是AAPCS?

旧时,ARM 过程调用标准叫做 APCS (ARM Procedure Call Standard),Thumb的过程调用标准为 TPCS。如今这两种叫法已经废弃,统一称作 AAPCS (Procedure Call Standard for the ARM Architecture)。

AAPCS 是 ARM ABI(Application Binary Interface) 接口文档的一份,它定义了:

  1. 对寄存器使用的限制。
  2. 使用栈的惯例。
  3. 在函数调用之间传递/返回参数。
  4. 可以被"回溯"的基于栈的结构的格式,用来提供从失败点到程序入口函数的列表,包括函数参数。

当前 ARM 官方已经通过 github 来维护相关文档,想获取最新的文档可以访问GitHub - ARM-software/abi-aa: Application Binary Interface for the Arm® Architecture

二、寄存器

调用者保存寄存器(caller saved registers)与被调用者保存寄存器(cellee-saved registers)

试想一下,在调用一个函数时,无论是调用者还是被调用者,都可能更新寄存器的值。假设调用者在%edx中存了一个整数值100,而被调用者也使用这个寄存器,并更新成了1000,于是悲剧就发生了。当过程调用完毕返回后,调用者再使用%edx的时候,值已经从100变成了1000,这几乎必将导致程序会错误的执行下去。因此,函数调用的前后系统应该保持不变。

对此,有三种方案 :
  1. 在函数调用前,将所有被调用者所使用的寄存器都保存一遍。(通过栈)
  2. 在函数调用时,将所有用到的寄存器的值都先保留再使用(通过栈保存),并且在结束时恢复。
  3. 约定调用者保存,与被调用者保存,各保存各的。arm采用的这种方案,如下图所示:

https://www.zhihu.com/question/301000788

调用者保存寄存器(caller saved registers):R0~R3、R12、R14链接寄存器、程序状态寄存器PSR;

  • 函数调用后还需使用的寄存器数值,需在调用前将其保存(到内存中 如栈);
  • 函数调用后无需使用的寄存器数值则无需保存;
  • 函数可以任意使用(修改)这些寄存器;

被调用者保存寄存器(cellee-saved registers):R4~R11;

  • 被调用的子程序或函数需确保这些寄存器在函数结束时不会发生变化(与进入函数前相同);
  • 若函数需要使用这些寄存器,则应将其保存(入栈),并在函数结束前将其恢复为初始值;

若处理器具有浮点单元,则其中的寄存器也有类似需求;

S0~S15:调用者保存寄存器;

S16~S31:被调用者保存寄存器;

三、参数传递&返回

参数传递:

  1. 参数不超过4个时使用寄存器R0~R3传递,否则超出部分则使用堆栈传递;
  2. 多字大小的输入参数通过多个连续的寄存器传递(如:R0+R1);
  3. 若系统中不包含浮点运算的硬件部件,浮点参数通过相应的规则转换为整数参数后传递;

参数返回:

  1. 32位以下的基本数据类型,通过寄存器R0返回;
  2. 返回结果为64位时,通过寄存器R0与R1返回;
  3. 返回结果为浮点数时,通过浮点运算不见的寄存器返回;
  4. 对于位数更多的结果,需要通过栈传递

四、使用栈惯例

sp指向最后一个压入的值,数据栈由高地址向低地址生长)类型,即满递减堆栈
在这里插入图片描述

  • 压栈PUSH:先让SP指针自减(空出内存),然后再存入数据
  • 出栈POP:先读出SP指向的数据,然后再自减

ref:

ARM体系结构学习笔记:过程调用标准AAPC、 ARM32调用约定、ARM64调用约定_arm64 传参 结构体-CSDN博客

ARM软件逆向工程入门 01 - ARM调用约定(Calling Convention)_armv7函数调用约定-CSDN博客

ARM学习(17)ARM函数调用规则_arm bl call 调用函数-CSDN博客

ARM 过程调用标准 AAPCS 以及堆栈使用-CSDN博客

应用程序二进制接口(ABI) --- AAPCS(函数调用/中断上下文保护) - 流水灯 - 博客园

arm异常处理分析_arm指令异常-CSDN博客

ARM架构过程调用标准AAPCS-CSDN博客

FreeRTOS-ARM架构与程序的本质_freertos内核-CSDN博客

c语言函数调用规范-基于arm 分析_aapcs-CSDN博客

ARM体系结构学习笔记:过程调用标准AAPC、 ARM32调用约定、ARM64调用约定_arm64 传参 结构体-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes运行大数据组件-运行spark

部署组件 ● spark-historyserver ● spark-client 配置文件 kind: ConfigMap apiVersion: v1 metadata:name: spark data:spark-defaults.conf: |-spark.eventLog.enabled truespark.eventLog.dir hdfs://192.168.199.56:8020/eventLogsspark.ev…

STM32FreeRTOS 使用QSPI驱动nandFlash

STM32FreeRTOS 使用QSPI驱动nandFlash 不清楚为什么STM32同时打开3个以上的音频文件时会出现播放问题,所以更换方案。因为SRAM的内存空间过小,用于存储音频文件不适合,所以使用大小为128MByte的nandFlash。 nandFlash使用华邦的W25N01GVZEI…

Nature Communications|综述|无线胶囊内窥镜机器人的最新研究进展和未来发展方向(健康监测/柔性传感/可吞服电子)

浙江大学杨华勇(Huayong Yang)院士和韩冬( Dong Han)特聘研究员团队,在期刊《Nature Communications》上发布了一篇题为“Robotic wireless capsule endoscopy: recent advances and upcoming technologies”的综述论文,博士生曹青(Qing Cao)为论文第一作者。综述内容如…

群控系统服务端开发模式-应用开发-安装及提交仓库

整个应用采用的是现有的流行模式,前后分离。应用架构前端采用vue-element-admin,API接口采用的是thinkphp6,数据库采用的是MySQL5.7.36,而事件处理我采用的是分布式队列rabbitMQ。 首先安装及调整API接口系统业务架构逻辑。根据《…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器(做梦),你的导师让你学习部署并且训练不同尺寸的大模型,并且写一个说明文档。你意识到,你最需要学习的就是关于分布式训练的知识,因为你可是第一次接触这么多卡…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(一)认识和了解Build.cs

目录 引言 一、创建一个C插件TextureReader插件 二、Build.cs文件 三、ModuleRules 四、TextureReader插件的构造 4.1ReadOnlyTargetRules的作用 4.2TextureReaderd的构造调用 4.3设置当前类的预编译头文件的使用模式 4.4PublicIncludePaths.AddRange与PrivateInclude…

揭秘世界技能大赛健康与社会照护项目,对智慧养老专业建设的启示

一、世界技能大赛(世赛):职业技能的巅峰对决 被誉为“职业技能奥林匹克”的世界技能大赛是全球最高水平的职业技能竞赛,代表着各行业职业技能发展的国际先进水平。赛事涵盖六大领域:建筑与工程技术、创意艺术与时尚、…

【Unity】鼠标点击获取世界坐标位置:物体移动至鼠标点击的位置

需求说明 鼠标点击3D场景时,可以获取其所在的世界坐标; 鼠标点击3D物体时,可以获取该物体; 鼠标点击3D物体时,可以让玩家移动至该物体; 成果展示 Scene部分 关于仓库栏的设置,物体如何进入…

搭建支持国密GmSSL的Nginx环境

准备 1、服务器准备:本文搭建使用的服务器是CentOS 7.6 2、安装包准备:需要GmSSL、国密Nginx,可通过互联网下载或者从 https://download.csdn.net/download/m0_46665077/89936158 下载国密GmSSL安装包和国密Nginx安装包。 服务器安装依赖包…

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion论文阅读笔记

AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion 论文阅读笔记 这是ECCV2024的论文,作者单位是是港中文和上海AI Lab 文章提出了一个叫AutoDIR的方法,包括两个关键阶段,一个是BIQA,基于vision-language…

如何查看磁盘的类型?(固态硬盘 or 机械硬盘)

按一下电脑的win键 直接打字搜索:【碎片整理和优化驱动器】 , 然后按一下【回车】或者 鼠标点击选择即可 如下位置:【媒体类型】显示的即是:【固态硬盘】or【机械硬盘】

解决pycharm无法添加conda环境的问题【Conda Environment下没有Existing environment】

解决pycharm无法添加conda environment 问题【Conda Environment下不显示Existing environment】 问题: 第一次下载好pycharm准备编写代码,在Anoconda Prompt建立好环境后,打开pycharm导入环境,却发现在【Conda Environment】处…

使用AIM对SAP PO核心指标的自动化巡检监控

一、背景 由于SAP PO系统维护成本较高,各类型异常报错等都需要人员进行时刻监控和响应,遂由AIM平台进行自动化巡检SAP PO的各指标,然后告警通知用户,节省维护成本和提高工作效率 二、核心指标监控 SAP PO失败消息 适用于S…

基于Python的A*算法实现路径规划

目录 一、A*算法 二、算法具体步骤 三、算法基本程序流程 四、算法代码实现 五、运行结果 一、A*算法 A*(A-Star)算法是P.E.Hart、N.J.Nilsson和B.Raphael等人在1986年综合Dijkstra算法和BFS算法的优点而提出来的一种非常有效的启发式路径搜索算法…

和鲸科技 CEO 范向伟受邀揭牌启动南京大学 2024 级大学生人工智能素养大赛

2024 年 10 月 26 日,南京大学第十九届读书节在仙林校区图书馆举行开幕仪式。中国科学院院士、南京大学校长谈哲敏,校党委常委、副校长索文斌,原副校长、关工委主任闵铁军出席仪式,南京大学相关学院和职能部处负责人,以…

有序序列合并(c语言)

代码实例 int main() {int n 0;int m 0;scanf("%d %d", &n, &m);//n输入第一个升序数组中的元素个数//m输入第二个升序数组中的元素个数//创建数组//arr1为n对应的数组int arr1[1000];//arr2为m对应的数组int arr2[1000];//arr3为数组1与数组2结合后的数组…

Java审计对比工具JaVers使用

最近有个需求,需要将页面的内容生成excel或者word文档,而且每次的修改都需要生成新的版本,同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象,同时存储到数据库一条新数据,对应数据表一…

知识图谱:连接实体与关系的语义网络

知识图谱作为人工智能领域的核心技术之一,是一种通过三元组(实体关系属性)形式,结构化表达实体间关系的语义网络。这种网络不仅嵌入了丰富的语义和逻辑,还遵循一定的规则,使其成为人类进行推理、预测和分类…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明:PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…

法律智能助手:开源NLP系统助力法律文件高效审查与检索

一、系统概述 思通数科AI平台是一款融合了自然语言处理和多标签分类技术的开源智能文档分类工具,特别适用于法律行业。平台采用深度学习的BERT模型来进行特征提取与关系抽取,实现了精准的文档分类和检索。用户可以在线训练和标注数据,使系统…