闲聊ARM内核参数传递机制

之前一直没怎么在意这个问题,直到最近搞了个奇奇怪怪的项目,才发现这部分知识得补上来,记录一下。

ARM有一个标准,叫《Procedure Call Standard for the Arm Architecture》,人话就是ARM架构过程调用标准,它的目标就是为不同编译器生成的代码提供了统一的调用规范,使得单独编译的C程序和汇编程序能够相互调用。

文章里详细说明了寄存器的分类:R0-R3用于参数传递(调用者保存寄存器),R4-R11用于保存局部变量(被调用者保存寄存器),解决了函数调用过程中寄存器值可能被意外覆盖的问题。

同时比较关键也是今天主题,就是参数传递机制的统一,它规定了函数的前四个参数通过寄存器传递,超出部分使用栈传递,返回值通过R0返回。这种标准化避免了不同编译器采用不同传递方式导致的兼容性问题。特别提到在64位架构中,寄存器数量增加到31个,可以支持8个参数通过寄存器传递。

那我们来看看具体示例,以M4为例。

首先定义函数,分别涉及到传2个参数,传5个参数,传结构体,传结构体指针,如下:

 然后来看汇编,

(1)AddTest1,仅传递2个参数,根据规则当然应该直接用寄存器即可,汇编代码如下:

代码首先将参数存放到寄存器R0和R1中, 然后跳到AddTest,该函数的汇编代码如下:

也符合规范里使用R0作为返回值的要求。

(2)AddTest2,传递5个参数,按照规范前4个参数使用寄存器R0-R3,汇编代码如下:

代码首先将第5个参数压到栈里,对应地址0x1ffE4290,然后就其余四个参数放到寄存器R0-R4里,最后跳到函数里执行,具体代码如下:

首先是把R4压栈,保护现场,然后使用R4作为中间寄存器来存放栈里的第5个参数,最后分别加R0-R4,最后以R0承接返回值,如下:

(3)我们再来看看直接传结构体是什么情况,汇编如下:

 这里就需要注意了,首先我们在main里定义了结构体add_type addStruct = {1,2,3},本身就存在栈里,如下:

因此,第一步就是要从栈里把数据取出来,由于该结构体只有三个参数,所以还是用寄存器传递的方式,如下:

在函数里就直接使用寄存器进行相加即可,

 那如果是传递的结构体超过了4个参数,举一反三即可。 

(4)如果是传递指针 ,情况又不太一样,我们来看汇编。

代码直接就该结构体对应的栈地址作为参数通过R0传递过去, 在该函数内部取栈里取数据,如下:

好了,奇奇怪怪的知识又增加了。了解这个有什么用呢,或许大概MCU里有一套固件API,不想和调用者共用栈,以免泄露信息,知道传参的逻辑,才能在固件API运行时有正确的参数值。

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

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

相关文章

万兴喵影Filmora AI Video v14.7.03国际高级版,AI视频剪辑全能工具,一键专业级创作​

[软件名称]: 万兴喵影Filmora AI Video v14.7.03 [软件大小]: 199.4 MB [下载通道]: 夸克盘 | 迅雷盘 软件介绍 🎬《万兴喵影》v14.7.03国际高级版|AI智能剪辑神器,解锁全功能无水印! ✨ 核心优势: ✅ 1000背景音…

暴力风扇方案介绍

炎炎夏日,当普通风扇只能送来 “温柔拂面”,暴力风扇却能吹出 “台风级” 清凉!想知道这些 “风力狂魔” 是如何炼成的?答案藏在电机、电路和芯片的黄金三角组合里。​ 一、电机:暴力风扇的 “心脏起搏器”​ 暴力风扇…

pyqt小问题汇总

文章目录 1、inherit global site-packages2、setGeometry(10,20,30,40)setGeometry(x, y, width, height)1. **x参数**2. **y参数**3. **width参数**4. **height参数** 示例说明与其他方法的对比注意事项示例代码 1、inherit global site-packages 在pycharm 创建项目时&…

提升JavaScript性能的六大关键策略

1、优化代码结构与算法 避免使用嵌套循环,改用更高效的算法如哈希表或二分查找。减少不必要的计算,缓存重复使用的计算结果。使用时间复杂度更低的算法替代高复杂度操作。优化递归调用,避免栈溢出和性能瓶颈。改用迭代或尾递归优化。简化条件…

打造跨平台应用的全能框架:Dioxus

在如今飞速发展的数字世界中,越来越多的开发者开始寻找能够满足跨平台需求的高效框架。而在这些选择中,Dioxus这个全栈应用框架脱颖而出。Dioxus是一款为Web、桌面和移动端开发而设计的全栈框架,采用Rust语言,具备跨平台、一体化的优势。本文将深入介绍Dioxus的独特功能,应…

大事件项目记录5-用户接口开发-更新用户头像

5)更新用户头像。 UserController.java: PatchMapping("updateAvatar")public Result updateAvatar(RequestParam String avatarUrl){userService.updateAvatar(avatarUrl);return Result.success();} UserService.java: UserServ…

Spring Cloud 微服务架构模型

下面是一个完整的 springcloud-eureka-demo 示例项目,包含: Eureka Server 注册中心 Eureka Client 服务提供者(service-provider) Eureka Client 服务消费者(service-consumer) 📁 项目结构…

计算机网络 网络层:控制平面

在本章中,包含网络层的控制平面组件。控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理。5.2节,传统的计算图中最低开销路径的路由选…

力扣第85题-最大矩形

力扣链接:85. 最大矩形 - 力扣(LeetCode) 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 输入:matrix [["1","0","1","…

6-创建和查询

创建&查询 DDL - 表操作 - 查询 查询当前数据库所有表 查询库表之前需要先试用 use 数据库名 进入数据库才可以查询到该数据库的库表, 否则将会出现未选择数据库的报错; 如果数据库中并无数据表, 则会出现 Empty set 的相应结果 SHOW TABLES;切换到 sys 数据库, 并且查询库…

【Java面试】MySQL的聚集索引和非聚集索引的区别?

一、存储结构的本质差异 物理存储的哲学冲突 聚集索引的本质是将数据行的物理存储顺序与索引键值的逻辑顺序强制绑定,这种设计源于计算机科学的局部性原理(Locality Principle)。 为什么选择B树? B树的平衡多路特性(通…

LRU缓存设计与实现详解

LRU缓存设计与实现详解 一、LRU缓存核心概念1.1 LRU策略定义1.2 应用场景1.3 核心操作要求 二、数据结构设计:双向链表哈希表2.1 为什么选择双向链表?2.2 为什么结合哈希表?2.3 节点结构设计(双向链表)2.4 LRU缓存的逻…

RabbitMQ中,basicAck、basicNack和basicReject是三种核心的消息确认机制

channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); 在RabbitMQ中&#xff0…

UNIAPP入门基础

一、开发环境准备 1. 安装 HBuilderX(官方推荐IDE) 下载地址:HBuilderX 官网 版本选择: App开发版:开箱即用,内置 UniApp 插件 标准版:需手动安装 UniApp 插件(运行时会提示) 安装步骤: Windows:双击安装包,勾选“创建桌面快捷方式” macOS:拖拽到 Applications…

前端单点登录

“前端单点登录(SSO, Single Sign-On)”是指在多个系统之间共享用户登录状态,使用户只需登录一次,就可以在多个子系统中使用同一身份访问资源,无需重复登录。 以下是一个典型的前端单点登录方案的介绍和实现思路&…

DiNA:扩张邻域注意力 Transformer

摘要 Transformer 正迅速成为跨模态、跨领域和跨任务中应用最广泛的深度学习架构之一。在计算机视觉领域,除了持续发展的纯 transformer 架构,分层 transformer 也因其优越的性能和在现有框架中易于集成而受到广泛关注。这类模型通常采用局部化的注意力…

对于“随机种子”的作用的理解

深度学习系统的两大组成部分 确定性部分(无法通过种子改变): ✅ 网络结构:层数、神经元数量、连接方式 ✅ 学习率:如您所说,这是开发者明确设置的固定值或调度策略 ✅ 损失函数:MSE、CrossEnt…

C# 委托(调用带引用参数的委托)

调用带引用参数的委托 如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变。 在调用委托列表中的下一个方法时,参数的新值(不是初始值)会传给下一个方法。例如, 如下代码调用了具有引用参数的…

Cisco FMC events无法加载并且cpu high故障- Cisco bug

FMC故障 日志无法加载,并且CPU high 95% 经确认是bug问题,需要重置1个monetdb的进程 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe47671 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwi64429 2.1 备份FMC配置 2.2 重置进程 大约为2…

HarmonyOS 公共事件机制介绍以及多进程之间的通信实现(9000字详解)

HarmonyOS 公共事件机制介绍以及多进程之间的通信 CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力 1. 公共事件的介绍 1.1.1公共事件的分类:公共事件从系统的角度可以分为系统公共事件和自定义公共事件 系统公共事件&#x…