函数调用方法背后的原理

编译器实现函数调用时所遵循的一系列规则称为函数的“调用约定(Calling Convention)”,x86-64平台上的编译器随着操作系统的不同而有不同的约定。Windows上采用的是Wx64/Vector的标准,而类unix上采用systemV AMD64 ABI的调用标准。统一的调用约定保证了程序的最大可移植性。

systemV(苹果)

__attribute__((ms_abi))或__attribute__((sysv_abi))或__attribute__((cdecl))或__attribute__((StdCall))

调用约定可以通过在函数前这是来控制(Linux下)

// cdecl调用约定

int __attribute__((cdecl)) add_cdecl(int a, int b) {

    return a + b;

}

// stdcall调用约定

int __attribute__((stdcall)) add_stdcall(int a, int b) {

    return a + b;

}

int main() {

    int sum1 = add_cdecl(1, 2);

    int sum2 = add_stdcall(1, 2);

    return 0;

}

函数调用一个涉及函数的参数,函数的返回值,堆栈的清空与重置,寄存器的设置四个方面。

//栈帧的清空与重置

栈帧中存放有与每个函数调用相关的返回地址,实参,局部变量,返回值,以及暂存器的寄存器等信息。在进程中的虚拟地址中,栈的空间是由高地址向低地址增加的,通过rbp-4/rbp-8等修改地址的偏移值来给地址赋值从而保存代码中的变量的值。

当函数结束的时候,通过调用leave这个指令可以清空栈的内存地址

这个图随时要看要记着

Push rbp //报错调用者函数的rbp(当前函数的栈帧基址)

Move rbp rsp //重新设置一个函数的栈帧基址,rsp代表获取一个新的栈地址,具体值由编译器维护

。。。

。。。

Pop rbp //恢复调用者函数的rbp

Ret  //返回调用者

参数的传递

SysV调用规则是对于整形和指针类型的实参,分别需要特定的寄存器保存参数,分别是rdi,rsi,rdx,cdx,r8,r9,按照函数定义时的参照从左到右依次传值。若一个函数的参数超过了6个,则余下的通过栈内存进行传送。多出来的参数从左到右依次被压入栈中。(30到40行代码)

而浮点数则会存在xmm0~xmm7这8个寄存器中。

Linux上

// cdecl和fastcall

Cdecl通过寄存器传参数,fastcall通过函数压栈传参,传参的方向一般都是从右往左传值。

返回值的约定

sysV约定:当函数产生整数返回值小于64位的时候,通过寄存器rax来存储。大于64位的时候低位通过rax存储,高位通过rdx存储。对于复合类型的返回值,编译器可能直接使用栈内存进行中转。

对于浮点型的返回值。类似参数传递。放到特殊的寄存器中xmm0~xmm7返回

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

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

相关文章

Pinpoint(APM)进阶--插件开发

接上文 pinpoint支持编写插件来扩展监控的覆盖范围 这里重申下pinpoint一个trace的基本构成(最小单元为span) 插件结构 pinpoint插件由type-provider.yml 和实现组成 type-provider.yml 定义给插件使用的ServiceTypes和AnnotationKeys,并…

qt QPalette详解

1、概述 QPalette是Qt框架中用于管理颜色组和角色的一种机制。它允许开发者为应用程序中的不同组件(如窗口、按钮、文本框等)定义一套统一的颜色方案。QPalette通过定义颜色角色(如背景色、前景色、选择色等)和颜色组&#xff08…

什么是FUSE用户态文件系统

零. 文件系统 1. 为什么要有文件系统 文件系统是操作系统中管理文件和目录的一种机制。它提供了组织、存储、检索和更新文件的方法,主要如下: 数据组织:文件系统将数据组织成文件和目录,使用户能够更方便地管理和查找文件。每个…

<HarmonyOS第一课>应用/元服务上架的课后习题

善者,吾善之; 不善者,吾亦善之,德善。 信者,吾信之; 不信者,吾亦信之,德信。 圣人在天下,歙歙焉为天下浑其心,百姓皆注其耳目,圣人皆孩之。 通过&…

从源码到成品应用:互联网医院系统与在线问诊APP的开发全解析

今天将全面解析互联网医院系统和在线问诊APP的开发过程,从源码到成品应用,帮助您理解其中的关键技术和实施策略。 一、系统架构设计 互联网医院系统和在线问诊APP的开发首先需要一个合理的系统架构。通常,系统架构分为前端和后端两个部分。…

2024年【危险化学品生产单位安全生产管理人员】考试内容及危险化学品生产单位安全生产管理人员作业考试题库

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考试内容是安全生产模拟考试一点通生成的,危险化学品生产单位安全生产管理人员证模拟考试题库是根据危险化学品生产单位安全生产管理人员最新版教材汇编出危险化学品生…

企业出海网络:SD-WAN与专线混合组网方案

随着越来越多的国内企业进入海外市场,包括出海电商、游戏、社交网络和区块链等领域,它们通常需要使用海外服务器。同时,这些企业在国内也会拥有自己的机房、IDC或依赖其他云服务提供商的机房。在这种情况下,如何实现国内外之间的高…

vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发

编号:R03-果蔬识别系统 简介:vuespringboot百度AI实现的果蔬识别系统 版本:2025版 视频介绍: vuespringboot百度AI实现的果蔬识别系统前后端java开发,百度识别,带H5移动端,mysql数据库可视化 1 …

深度了解flink Flink 本地运行Standalone模式

环境准备 IDEA 必须git 必须maven 必须jdk 1.8 必须scala 2.12.7 源码下载 如果能访问github,下载github的源码(flink的代码托管网站) git clone https://github.com/apache/flink.git 如果不能访问github,可以通过码云下载(国内的代码托管平台) g…

【C语言】宏封装的实用总结

在C语言的广阔天地中,宏(Macro)犹如一门神秘的内功,掌握它,你将能够以不变应万变,以简洁驾驭复杂。今天,我们将深入探讨C语言宏封装的高级技巧,并通过一系列案例,让你领略…

Latex中Reference的卷号加粗的问题

找到模板中的.bst文件,查找volume,修改如下 添加bold,卷号会加粗,去掉则正常

parted 磁盘分区

目录 磁盘格式磁盘分区文件系统挂载使用扩展 - parted、fdisk、gdisk 区别 磁盘格式 parted /dev/vdcmklabel gpt # 设置磁盘格式为GPT p # 打印磁盘信息此时磁盘格式设置完成! 磁盘分区 开始分区: mkpart data_mysql # 分区名&…

基于Transformer的路径规划 - 第五篇 GPT生成策略_解码方法优化

上一篇:基于Transformer的路径规划 - 第四篇 GPT模型优化 在上一篇中,我尝试优化GPT路径生成模型,但没有成功。在随机生成的测试集上,路径规划成功率只有99%左右。而使用传统的路径规划算法,例如A*,路径规划…

【ROS的TF系统】

系列文章目录 TF系统简介 前面的章节实现了SLAM节点的建图功能: 激光雷达节点—> /scan话题 —>hector_mapping节点—> 地图数据话题/map 本期来实现SLAM节点的定位功能: TF(TransForm)主要描述的是两个坐标系的空间关…

Java中的线程安全问题(如果想知道Java中有关线程安全问题的基本知识,那么只看这一篇就足够了!)

前言:多线程编程已经广泛开始使用,其可以充分利用系统资源来提升效率,但是线程安全问题也随之出现,它直接影响了程序的正确性和稳定性,需要对其进行深入的理解与解决。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解…

奥数与C++小学四年级(第十八题 小球重量)

参考程序代码&#xff1a; #include <iostream> #include <vector>int main() {// 小球的重量std::vector<int> weights {1, 2, 3, 4, 5};// 用来存储可能的结果int a, b, c, d, e, x;// 穷举所有可能的 a, b, c, d, e 的组合for (int i 0; i < weight…

ESP32/ESP8266开发板单向一对多ESP-NOW无线通信

ESP32/ESP8266开发板单向一对多ESP-NOW无线通信 简介读取ESP32/ESP8266接收方Receiver的MAC地址ESP32/ESP8266发送方Sender程序ESP32/ESP8266接收方Receiver程序ESP-NOW通信验证总结 简介 本实验通过ESP-NOW无线通信协议实现多个ESP32/ESP 8266开发板向ESP32开发板发送数据。例…

Unity XR Interaction Toolkit 开发教程(2):导入 SDK【3.0 以上版本】

文章目录 &#x1f4d5;课程总结&#x1f4d5;安装 Unity 编辑器与打包模块&#x1f4d5;导入 OpenXR&#x1f4d5;导入 XR Interaction Toolkit&#x1f4d5;打包发布 获取完整课程以及答疑&#xff0c;工程文件下载&#xff1a; https://www.spatialxr.tech/ 视频试看链接&a…

直流电机在液压泵领域的应用

随着工业自动化的不断发展&#xff0c;液压技术已经成为现代工程中不可或缺的一部分。液压泵作为液压系统的核心部件&#xff0c;其性能直接关系到整个系统的效率和可靠性。近年来&#xff0c;直流电机因其独特的优势而逐渐应用于液压泵领域&#xff0c;为液压系统的提升与改进…

2024-10-29 商业分析-盗取他人游戏MOD牟利-记录

摘要&#xff1a; 2024-10-29 商业分析-盗取他人游戏MOD牟利-记录 事件&#xff1a; 【实锤】《真英雄》盗用本人《风林火山》mod地图售卖牟利&#xff01;_ryan_knight_12吧_百度贴吧 真英雄&#xff1f;&#xff1f;我从未见过如此厚颜无耻之人【ryan_knight_12吧】_百度贴吧…