栈、栈帧和函数调用约定解析
创始人
2025-05-28 18:16:17

目录

一.栈

二.栈帧

三.函数调用约定

1._cdecl (C调用约定)

2._stdcall(微软制定的标准调用约定)

3.x86 fastcall约定

4.x64 fastcall约定

5.linux下的函数调用


一.栈

内容后续补充...

这两篇文章挺不错的:

第一篇介绍了栈的运行原理以及push和pop指令的执行过程

汇编语言——寄存器(内存访问 ss栈段寄存器)

第二篇介绍了程序内存布局:

第5篇:C/C++ 内存布局与程序栈

通过程序内存布局可以得知,栈是从高地址向低地址增长的

简述一下push和pop指令的作用,以32位为例:

push eax:          //push指令实际上是先开辟空间(也就是调整栈指针)然后再将值压入栈中

esp=esp-4        //

mov [esp],eax

pop eax :           //pop指令先将栈顶的值取出来,然后调整栈指针

mov eax,[esp]   //

esp=esp+4

二.栈帧

后续补充...

三.函数调用约定

1._cdecl (C调用约定)

特点:

(1)调用方按照从右到左的顺序将函数参数压入栈中

(2)被调函数完成操作后,由调用方负责清除栈中参数

(3)无论有多少个参数,最左边的(第一个)参数总能轻易找到(在栈顶)

所以适用于参数数量可变的函数(如printf)

例子:

假设有一函数: void fun(int x, int y, int z);

当调用这个函数并且传参如下时:

fun(1,2,3);

主调函数中对应的汇编指令为:

push 3        //esp=esp-4

push 2        //esp=esp-4

push 1        //esp=esp-4

call fun       //调用函数后,清除参数进行栈平衡,所以esp=esp+12

add esp,12

 

被调函数对应汇编指令:

push ebp

mov ebp,esp

......

mov esp,ebp

pop ebp

ret

还有另一种形式(GNU编译器,gcc/g++利用这种技巧):

sub esp,12                //主调函数预先分配栈空间

mov [esp+8],3          //依次将参数入栈

mov [esp+4],2          //注意此时是根据与栈指针的偏移值入栈,并没有移动栈指针

mov [esp],1

call fun

add esp,12                //清除参数,栈平衡

无论是哪一种方式,栈顶的值都是最左边的(第一个)参数\

2._stdcall(微软制定的标准调用约定)

注意这里的标准是微软为自己制定的调用约定所起的名称,并非是真的"标准"

特点:

(1)与_cdecl一样,都是按照从右到左的顺序将参数入栈

(2)区别:函数执行结束时,由被调函数删除栈中的参数

(3)当函数参数个数固定不变时可以使用这种调用方式

仍采用_cdecl中介绍的例子:

主调函数对应汇编指令:

push 3        //esp=esp-4

push 2        //esp=esp-4

push 1        //esp=esp-4

call fun      

被调函数对应汇编指令:

push ebp               //保存原始帧指针

mov ebp,esp         //开辟新的栈帧

......                        //具体操作

mov esp,ebp        //恢复栈指针

pop ebp                //恢复帧指针

ret 12                    //即esp=esp+12,再ret   先调整栈指针,再取栈顶返回地址返回

//主函数中没有了add esp,12 这条指令,而是在fun函数结尾使用 ret 12(3*4=12)指令  

//ret 后跟的值与参数的大小之和一致

3.x86 fastcall约定

这是stdcall约定的一个变体,规定函数第1,2个参数分别由ecx,edx传参,其余参数传参方式和stdcall相同,并且也是由被调函数清除栈中参数

例子:

主调函数对应汇编指令:

push 3        //此时只有一个参数是压入栈的

mov edx,2

mov ecx,1

call fun      

被调函数对应汇编指令和_stdcall中的相同:

push ebp              

mov ebp,esp        

......                       

mov esp,ebp       

pop ebp               

ret 4                //只有一个参数是压入栈的,所以清除参数只需要清除一个int类型的空间

 

也就是说,只是传参时使用了ecx,edx这两个寄存器,其他参数依次入栈

4.x64 fastcall约定

与x32 fastcall类似,前4参数则先放入ecx、edx、r8、r9寄存器,剩余参数从右到左依次入栈,这里就不再赘述

5.linux下的函数调用

以上主要是windows下的函数调用约定,简单介绍一下linux下的函数调用约定

(1)x32 使用栈传递参数,参数从右到左入栈

(2)x64 _fastcall方式: 函数参数的 前 6 个参数是从左至右依次存放于 RDI,RSI,RDX,RCX,R8,R9 寄存器里面,剩下的参数通过栈传递,从右至左顺序入栈

相关内容

热门资讯

【文心一言】什么是文心一言,如... 文心一言什么是文心一言怎么获得内测资格接下来就给大家展示一下文学创作商业文案创作数理逻辑推算中文理解...
第31篇:Java流和文件操作... 目录 1、读取控制台输入流 1.1 从控制台读取多字符输入流 1.2 从控制台读取字符串流 2、读写...
Linux/Debian/Ub... 文章目录前言相关资源下载OpenCVCUDA下载CUDNN下载编译错误异常 前言 本文用来记录在l...
虚拟数字人和GPT-4的结合,... 最近,ChatGPT一直在互联网上狂飙,从 去年11月底推出到月活过亿&...
第三章 Liunx的常用命令 文章目录一、Liunx常用命令查看内存 free -m回到根目录 直接 cd 回车回到上一级目录 c...
素人做课会踩的3大坑,你中了几... 素人做课会踩的3大坑,你中了几个?大坑:盲目模仿别人做课的...
element输入框el-in... element输入框el-input之格式控制 (1)限制输入的长度&#...
oracle19c迁移手册 windows10- 查看当前用户所有的表:select table_name fro...
docker-compose搭... # 关闭防火墙 systemctl stop firewalld.service # 永久关闭防火墙...
【2023最新Activiti... 1.流程实例 1.1 什么是流程实例 流程实例(ProcessInstance)代表流程定义的执行实...
基于ggdensity包的等高... 简介 科研过程中,需要绘制某个后验密度/其他的形状。在发表论文中常常使用等高线来满足该...
Leetcode 105. 从... 题目: 给定两个整数数组 preorder 和 inorder ,其中 ...
点亮LED 目录 一、LED 硬件控制方式 二、LED 应用程序 1、定义宏 2、main函数 ①、打开文件  ...
随想008:烂摊子 我看到过很多离谱的现象。比如: 程序 代码重复、命名随意、逻辑混乱、甚至对齐都不一致&...
2023长沙到广州的火车时刻表... 今天给各位分享2023长沙到广州的火车时刻表,从长沙到广州高铁最新...的知识,其中也会对长沙到广州...
车载DVD一体机导航升级教程(... 本篇文章极速百科给大家谈谈车载DVD一体机导航升级教程(凯立德)(超详细),以及汽车凯立德导航用u盘...
圈内sp是什么意思(sp圈里是... 今天给各位分享圈内sp是什么意思的知识,其中也会对sp圈里是什么样的进行解释,如果能碰巧解决你现在面...
鸡蛋撞地球(鸡蛋撞地球怎么制作... 本篇文章极速百科给大家谈谈鸡蛋撞地球,以及鸡蛋撞地球怎么制作对应的知识点,希望对各位有所帮助,不要忘...
Vue2基础语法速通2 目录计算属性计算属性的简写监视属性深层次监视watch 和 computed 区别绑定 class ...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
Web前端:Angular和R...   在编程领域,Angular 和 React 对于前端开发人员来说是目前最流行的两款...
【Git】SourceTree... 本系列文章前言   之前一直用的TeamFoundation,近期要代码迁移到Gite...
五官是指哪些(五官是指哪些器官... 今天给各位分享五官是指哪些的知识,其中也会对五官是指哪些器官进行解释,如果能碰巧解决你现在面临的问题...
北京汽车交易市场有哪些(北京车... 本篇文章极速百科给大家谈谈北京汽车交易市场有哪些,以及北京车市场在哪里对应的知识点,希望对各位有所帮...
微信吃喝玩乐在哪里搜(微信中吃... 本篇文章极速百科给大家谈谈微信吃喝玩乐在哪里搜,以及微信中吃喝玩乐在哪儿对应的知识点,希望对各位有所...
马勒滤清器怎么样(马勒滤清器产... 今天给各位分享马勒滤清器怎么样的知识,其中也会对马勒滤清器产品目录进行解释,如果能碰巧解决你现在面临...
Java服务器-NIO模型-J... Java服务器 NIO概览 NIO模型 每个客户端关联的套接字都注册到服务器的选择器(...
Vault配置中心产品调研实施... Vault配置中心产品调研实施方案 一、需求描述 nacos作为配置中文,数据都是明文...
镜头校正软件的新标杆DxO P... 镜头校正软件的新标杆DxO PhotoLab 6 的光学校正功能基于 DxO 专用实验室 20 年的...
CNI 网络流量 5.2 Ci... 文章目录Pod 间同节点 pod跨节点 pod in vxlan小结 环境: fedo...