5. 函数调用过程汇编分析

函数调用约定

image.png

__cdecl 调用方式

image.png

__stdcall 调用方式

image.png

__fastcall 调用方式

image.png

函数调用栈帧分析

image.png

补充说明

  1. 不同的编译器实现不一样,上述情况只是VC++6.0的编译实现
  2. 即便是在同一个编译器,开启优化和关闭优化也不一样
  3. 即便是同一个编译器同一种模式,32位和64位下情况也会不一样

fastcall 实例分析

[[gnu::fastcall]] int fun1(int a, int b, int c, int d) {return a * a + b * b + 2 * a * b + c + d;
}
int main() {int c = fun1(3, 4, 5, 6);return 0;
}
#!/bin/bash
set -ex/mnt/e/code/llvm-project/build/bin/clang fastcallTest.c -o fastcallTest -O0 -g -m32 -c
# 编译生成汇编代码
objdump -dS fastcallTest &> fastcallTest.asm
# sudo apt-get install -y build-essential module-assistant  
# sudo apt-get install -y gcc-multilib g++-multilib  

参考 GCC GNU 文档属性描述

fastcall
On x86-32 targets, the fastcall attribute causes the compiler to pass the first argument (if of integral type) in the register ECX and the second argument (if of integral type) in the register EDX. Subsequent and other typed arguments are passed on the stack. The called function pops the arguments off the stack. If the number of arguments is variable all arguments are pushed on the stack.

翻译: 在 x86-32 目标机上,fastcall 属性会导致编译器在寄存器 ECX 中传递第一个参数(如果是 INT 类型),在寄存器 EDX 中传递第二个参数(如果是INT类型)。后面的参数和其他类型的参数会传递到堆栈中。被调用函数将参数从堆栈中弹出。如果参数个数不固定,所有参数都会被推入堆栈。

image.png

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

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

相关文章

光催化专用设备太阳光模拟器装置

什么是光催化材料? 光催化材料是指通过该材料、在光的作用下发生的光化学反应所需的一类半导体催化剂材料。半导体是一种介于导体和绝缘体之间的物质,它有一个特殊的能带结构,即价带和导带之间有一个禁带,禁带的宽度决定了半导体…

linux压缩包形式安装mysql5.7

1. 下载 MySQL 压缩包 在官方网站或者镜像站下载 MySQL 压缩包。mysql-5.7.29-linux-glibc2.12.tar 下载地址: MySQL :: Download MySQL Community Server (Archived Versions) 2. 解压缩文件 使用以下命令解压 MySQL 压缩包: tar xvf mysql-5.7.29…

软考高项论文范文 | 进度管理

2017年5月,受某政府部门的委托,我单位承接了某信息共享与服务系统的建设工作,在本项目中我担任项目经理,负责项目的整体规划、组织实施和管理控制。某政府部门拥有多年积累的大量工作资源,这些信息是其开展各项行业服务…

南南合作里程碑!批量苏州金龙纯电公交正式交付哥斯达黎加

1月17日,哥斯达黎加电力研究所(ICE)收到了中国援助的批量苏州金龙海格纯电公交,该批车是中国应对气候变化南南合作援助哥斯达黎加项目的重要物资之一。中国驻哥斯达黎加特命全权大使汤恒出席交付仪式。 中国驻哥斯达黎加大使汤恒&…

esp8266小车智能wifi小车寒假营实战背篼酥老师

esp8266小车智能wifi小车寒假营实战 10节课 整车效果图如下 第一课 esp8266开发环境搭建和库文件加载 课程如下: 环境搭建 库文件下载链接:见文章末尾 第二课 小车模块组成和例程简介 课程如下: 车身PCB 小车电机 esp8266扩展板 esp8…

Flink实战之DataStream API

接上文:Flink实战之运行架构 Flink的计算功能非常强大,提供的应用API也非常丰富。整体上来说,可以分为DataStreamAPI,DataSet API 和 Table与SQL API三大部分。 其中DataStream API是Flink中主要进行流计算的模块。 DateSet API是…

vue3-组件通信

1. 父传子-defineProps 父组件&#xff1a; <script setup> import { ref } from vueimport SonCom from /components/Son-com.vueconst message ref(parent)</script><template><div></div><SonCom car"沃尔沃" :message"…

ctfshow-反序列化(web267-web270)

目录 web267 web268 web269 web270 总结 web267 页面用的什么框架不知道 看源码看一下 框架就是一种软件工具&#xff0c;它提供了一些基础功能和规范&#xff0c;可以帮助开发者更快地构建应用程序。比如Yii框架和ThinkPHP框架就是两个流行的PHP框架&#xff0c;它们提供…

Golang 中如何实现 Set

在Go编程中&#xff0c;数据结构的选择对解决问题至关重要。本文将探讨如何在 GO 中实现 set 和 bitset 两种数据结构&#xff0c;以及它们在Go中的应用场景。 Go 的数据结构 Go 内置的数据结构并不多。工作中&#xff0c;我们最常用的两种数据结构分别是 slice 和 map&#…

如何本地安装Python Flask并结合内网穿透实现远程开发

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

flutter 实现定时滚动的公告栏的两种不错方式

相同的部分 自定义一个类继承StatefulWidget 所有公告信息存放在list里 第一种 scrollControllerAnimatedContainer 逻辑如下 我们可以发现启动了一个timer计时器计时5秒&#xff0c;hasClients检查其目标对象&#xff08;我们用的是listview&#xff09;是否被渲染&#x…

HarmonyOS鸿蒙应用开发(三、轻量级配置存储dataPreferences)

在应用开发中存储一些配置是很常见的需求。在android中有SharedPreferences&#xff0c;一个轻量级的存储类&#xff0c;用来保存应用的一些常用配置。在HarmonyOS鸿蒙应用开发中&#xff0c;实现类似功能的也叫首选项&#xff0c;dataPreferences。 相关概念 ohos.data.prefe…

【操作系统】实验一 Linux操作系统安装

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Simulink之Signal

Simulink.Signal 指定信号的属性 描述 此类使您能够创建工作区对象,用于分配或验证信号或离散状态的属性,如其数据类型、数字类型、维度等。您可以使用信号对象来: 将值指定给信号源未指定的信号属性(值为-1或auto)。 验证其值由信号源显式指定的信号属性。此类属性的…

2017年认证杯SPSSPRO杯数学建模B题(第二阶段)岁月的印记全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 B题 岁月的印记 原题再现&#xff1a; 对同一个人来说&#xff0c;如果没有过改变面容的疾病、面部外伤或外科手术等经历&#xff0c;年轻和年老时的面容总有很大的相似性。人们在生活中也往往能够分辨出来两张不同年龄段的照片是不是同一个人…

FPGA物理引脚,原理(Pacakge and pinout)-认知3

画FPGA芯片引脚封装图&#xff08;原理&#xff09;&#xff0c;第一是参考开发板(根据一下描述了解总览&#xff09;&#xff0c;第二是研究Datasheet. ASCII Pinout File Zynq-7000 All Programmable SoC Packaging and Pinout(UG585) 1. Pacakge overview 1.1&#xff0…

智能生产系统的数字孪生应用场景

数字孪生引擎技术可以支持智能生产系统的设计、建设以及运营管理。和产品生命周期类似&#xff0c;生产制造系统也有其生命周期。图1中表述为:设计、构建、调试、运营与维护、报废与回收。智能生产系统的典型代表就是智能车间或智能工厂&#xff0c;其设计和建造是为了完成某一…

中仕教育:国考调剂和补录的区别是什么?

国考笔试成绩和进面名单公布之后&#xff0c;考生们就需要关注调剂和补录了&#xff0c;针对二者之间的区别很多考生不太了解&#xff0c;本文为大家解答一下关于国考调剂和补录的区别。 1.补录 补录是在公式环节之后进行的&#xff0c;主要原因是经过面试、体检和考察&#…

【C++】priority_queue模拟实现过程中值得注意的点

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章旨在记录博主在模…

【C++】命名空间(namespace)

文章目录 1. 为什么要有命名空间?2. 命名空间介绍3.命名空间三种使用方式4. 注意 1. 为什么要有命名空间? 在C语言中&#xff0c;局部变量和全局变量如果同名&#xff0c;在使用时可能会造成冲突。这并不是想避免就能避免的&#xff0c;在程序中&#xff0c;不仅仅是变量&…