C语言函数不同个数、大小形参对执行速度的影响:以Cortex-M3为例从汇编角度分析原因

news2024/11/15 20:40:49

0 资料&工具

Cortex M3权威指南(中文).pdf
keil5(用于仿真查看汇编代码、栈变化)

1 C语言函数不同个数、大小形参对执行速度的影响:以Cortex-M3为例从汇编角度分析原因

C语言中有条不成文的规定:不建议函数的形参数量超过4个。为什么会有这样的规定呢,本文以Cortex-M3为例,分析C语言函数不同个数、大小形参对执行速度的影响。

1.1 理论分析

ARM架构的处理器使用R0-R3寄存器传递函数参数,假如有4个参数,则按照顺序依次将参数4写入R3、参数3写入R2、参数2写入R1、参数1写入R0。这是因为访问寄存器的速度要比访问内存(堆栈)要快。如果参数数量超过4个,或者参数太大不足以通过4个寄存器传递参数,则超出部分的参数将通过堆栈传递。使用堆栈传递参数时,参数按照从右往左的顺序压入堆栈,即第一个参数(超出寄存器的部分)会先被压入堆栈。

1.2 举例分析

1.2.1 函数参数个数不超过4个且参数大小均小于寄存器大小(32bit)

示例程序:

typedef unsigned long long int u64;
typedef unsigned int u32;

u32 fun1(u32 p1, u32 p2, u32 p3, u32 p4)
{
    return p1 + p2 + p3 + p4;
}

u32 fun2(u32 p1, u32 p2, u32 p3, u32 p4, u32 p5)
{
    return p1 + p2 + p3 + p4 + p5;
}

u64 fun3(u64 p1, u64 p2, u64 p3)
{
    return p1 + p2 + p3;
}


/**
 *   主函数
 */
int main(void)
{
    fun1(1, 2, 3, 4);
}

对应的汇编代码:
在这里插入图片描述
在跳转fun1函数前依次将参数4-1压入R3-R0,没有使用到堆栈。

1.2.2 函数参数个数超过4个但总大小不超过4x32bit

示例程序:

typedef unsigned long long int u64;
typedef unsigned int u32;

u32 fun1(u32 p1, u32 p2, u32 p3, u32 p4)
{
    return p1 + p2 + p3 + p4;
}

u32 fun2(u32 p1, u32 p2, u32 p3, u32 p4, u32 p5)
{
    return p1 + p2 + p3 + p4 + p5;
}

u64 fun3(u64 p1, u64 p2, u64 p3)
{
    return p1 + p2 + p3;
}


/**
 *   主函数
 */
int main(void)
{
    fun2(1, 2, 3, 4, 5);
}

对应的汇编代码:
在这里插入图片描述
这里关注一下进入mian函数的压栈指令(PUSH),PUSH之后堆栈指针的值为0x200003F8
操作如下:
(1)将参数5保存到R0
(2)将参数4保存到R3
(3)将参数3保存到R2
(4)将参数2保存到R1
(4)将参数5的值保存到堆栈
(5)将参数1保存到R0
我们再将函数参数大小fun2修改为u16,这样下来函数参数总大小为5x16=80bit没超过4x32=128bit,看看是否同样需要使用堆栈传递形参。对应代码如下:

typedef unsigned long long int u64;
typedef unsigned short int u16;
typedef unsigned int u32;

u32 fun1(u16 p1, u16 p2, u16 p3, u16 p4)
{
    return p1 + p2 + p3 + p4;
}

u32 fun2(u16 p1, u16 p2, u16 p3, u16 p4, u16 p5)
{
    return p1 + p2 + p3 + p4 + p5;
}

u64 fun3(u64 p1, u64 p2, u64 p3)
{
    return p1 + p2 + p3;
}


/**
 *   主函数
 */
int main(void)
{
	  fun2(1, 2, 3, 4, 5);
}

对应的汇编代码如下:
在这里插入图片描述
可以看到同样需要使用到堆栈传递参数。

1.2.3 函数参数大小超过4x32bit但参数个数不超过4个

示例程序:

typedef unsigned long long int u64;
typedef unsigned int u32;

u32 fun1(u32 p1, u32 p2, u32 p3, u32 p4)
{
    return p1 + p2 + p3 + p4;
}

u32 fun2(u32 p1, u32 p2, u32 p3, u32 p4, u32 p5)
{
    return p1 + p2 + p3 + p4 + p5;
}

u64 fun3(u64 p1, u64 p2, u64 p3)
{
    return p1 + p2 + p3;
}


/**
 *   主函数
 */
int main(void)
{
    fun3(0x1ffffffff, 0x2ffffffff, 0x3ffffffff);
}

对应的汇编代码:
在这里插入图片描述
这里关注一下进入mian函数的压栈指令(PUSH),PUSH之后堆栈指针的值为0x200003F4
操作如下:
(1)将R1设置为0xffffffff
(2)将R0设置为0x03
(3)将R2的值设置为0xffffffff
(4)将R3的值设置为0x02
(5)将R0和R1依次压入堆栈
(6)将R0设置为0xffffffff
(7)将R1设置为0x1
此时R0、R1组成参数1:0x1ffffffff,R2、R3组成参数2:0x2fffffff,加上堆栈中的0x3ffffff便组成了函数的3个参数值。

2 结论

(1)当函数形参数量大于4个或函数形参总大小超过4x32bit(R0-R3寄存器总大小)则会使用堆栈来传递形参,降低函数执行效率。
(2)当我们调用的函数形参数量超过4个时,建议使用指针传递参数。

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

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

相关文章

C8T6超绝模块--LED

C8T6超绝模块–LED 大纲 怎样点亮LED结构体分析代码流程 具体案例 怎样点亮LED 首先不同的芯片的接法不一样,需要自己查看自己的芯片的原理图,我使用的是C8T6,使用的PC13接入的LED 注意看:怎么才能使LED灯亮呢? …

flux 文生图大模型 自有数据集 lora微调训练案例

参考: https://github.com/ostris/ai-toolkit 目前 Flux 出现了 3 个训练工具 SimpleTuner https://github.com/bghira/SimpleTuner X-LABS 的https://github.com/XLabs-AI/x-flux ai-toolkit https://github.com/ostris/ai-toolkit 待支持:https://github.com/kohya-ss/sd-s…

RK3588平台开发系列讲解(显示篇)MIPI详解

文章目录 一、DSI和CSI二、初识MIPI2.1、框架2.2、参数2.3、接口三、设备树下CSI的配置沉淀、分享、成长,让自己和他人都能有所收获!😄 一、DSI和CSI DSI( Display Serial Interface ) :位于处理器和显示模组之间的显示串行接口CSI( Camera Serial Interface ) : 位于…

Linux 安装nodejs环境

文章目录 Node.js简介Node.js的核心特性Node.js的生态系统Node.js的模块系统 部署下载Node.js预编译二进制包上传到Linux服务器并解压配置环境变量验证安装 部署在下边,我先对nodejs进行一些介绍,大家了解一下 Node.js简介 Node.js是一个基于Chrome V8…

计算机毕业设计Spark+PyTorch知识图谱房源推荐系统 房价预测系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习

《SparkPyTorch知识图谱房源推荐系统》开题报告 一、选题背景与意义 1.1 选题背景 随着互联网的快速发展和大数据技术的广泛应用,房地产行业特别是房屋租赁市场迎来了前所未有的变革。房源信息的海量增长使得用户在寻找合适的房源时面临巨大挑战。传统的房源推荐…

集成电路学习:什么是IDE集成开发环境

IDE:集成开发环境 IDE,全称“Integrated Development Environment”,即集成开发环境,是一种用于提供程序开发环境的应用程序。它集成了代码编写、分析、编译、调试等多种功能于一体的开发软件服务套,为开发者提供了一个…

集成电路学习:什么是MPU微处理器

一、MPU:微处理器 MPU,全称Microprocessor Unit,即微处理器单元,是计算机系统中的核心部件之一。MPU是一种集成了中央处理器(CPU)、内存、外设控制器和总线接口等功能的芯片,为电子设备提供强大…

Linux驱动(五):Linux2.6驱动编写之设备树

目录 前言一、设备树是个啥?二、设备树编写语法规则1.文件类型2.设备树源文件(DTS)结构3.设备树源文件(DTS)解析 三、设备树API函数1.在内核中获取设备树节点(三种)2.获取设备树节点的属性 四、…

2024 World Conference of Computer and Information Security(WCCIS 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网:https://ais.cn/u/vEbMBz提交检索:EI Compendex、IEEE Xplore、Scopus截稿日期:2024年9月4日2024年9月27-29日 广西桂…

Rust模块std::thread

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust到底值不值得学,之一 -CSDN博客 Rust到底值不值得学,之二-CSDN博客 Rust多线程编程概述-CSDN博客 12.…

合碳智能 × Milvus:探索化学合成新境界——逆合成路线设计

合碳智能(C12.ai)成立于2022年,致力于运用AI和具身智能技术,为药物研发实验室提供新一代智能化解决方案,推动实验室从自动化迈向智能化,突破传统实验模式与人员的依赖,解决效率和成本的瓶颈&…

1. GIS开发工程师岗位职责、技术要求和常见面试题

本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

Leetcode每日刷题之76.最小覆盖子串(C++)

1.题目解析 本题的题目是给定两个字符串 s 和 t ,找出在 s 中的某个最小子串保证该子串中包含所以 t 中出现的字母即可,并且该结果是唯一答案,找不到结果就直接返回空串即可 2.算法原理 关于本题的核心思路就是"滑动窗口"&#xff…

【Python 千题 —— 算法篇】首字母大写

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在文本格式化和处理过程中,常常需要将字符串的首字母大写。这在各种场景中都有实际应用,例如在标题格式化、用户输入校验、生成显示友好的文本等场景中。…

CC6链漏洞

CC6链漏洞 一 cc链简介 CC链是Apache Commons Collections反序列化漏洞利用链的简称,它涉及将可以执行命令的函数(如Runtime.getRuntime().exec("calc.exe"))序列化为对象流并转化为文件流存储在文件中,然后通过反序列…

深度学习5从0到1理解RNN(包括LTSM,GRU等):内容丰富(上)

循环神经网络(Recurrent Neural Network, RNN) 是一种经典的深度学习网络结构,具有广泛的应用。其中,槽填充(Slot Filling)(即识别自然语言中的特定信息) 是其中一个应用场景&#x…

香橙派开启vnc

1连接香橙派 2. 更新系统 在SSH会话中,首先更新系统软件包列表并升级现有软件包: sudo apt update sudo apt upgrade3. 安装VNC服务器 安装VNC服务器软件,这里以x11vnc为例: sudo apt install x11vnc 出现如图输入如下代码即可…

Python爬虫:通过js逆向获取某瓜视频的下载链接

爬虫:通过js逆向获取某瓜视频的下载链接 1. 前言2. 获取script标签下的视频加密数据3. 第一步:获取解密后的视频下载链接4. 第二步:模拟生成加密的webid值 1. 前言 就小编了解,某瓜视频这个网站对应视频下载链接加密处理至少经过三个版本。之前在CSDN发布了一篇关于…

船舶机械设备5G智能工厂物联数字孪生平台,推进制造业数字化转型

船舶机械设备5G智能工厂物联数字孪生平台,推进制造业数字化转型。在当今数字化浪潮推动下,船舶制造业正经历着前所未有的变革。为了应对市场的快速变化,提升生产效率,降低成本,并增强国际竞争力,船舶机械设…

Docker 详解及详细配置讲解

Docker 简介 2008 年LXC(LinuX Contiainer)发布,但是没有行业标准,兼容性非常差 docker2013年首次发布,由Docker, Inc开发 什么是 Docker Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术&#xf…