函数调用约定
时间:2022-07-23
本文章向大家介绍函数调用约定,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本篇原创作者:Rj45
背景
在前面的文章中,可以发现无论是x86架构还是x64架构的程序,其内部的函数在被调用时候, 都是首先将函数参数压入栈中(而且是从右向左),然后调用函数,最后还需要调整栈帧。
Add(10,20)
(x64架构的程序在使用寄存器传参的时候无需调整栈帧)
这种将函数参数顺序压入栈中以及进行栈帧调整的现象叫做函数调用约定。
函数调用约定
1、类型 函数调用约定有三种类型,分别为:
__cdecl
__stdcall
__fastcall
2、区别 _cdecl:是C或C++默认的函数调用方式,函数参数从右向左入栈,主调函数负责栈平衡。_stdcall:是Windows API默认方式,函数参数从右向左入栈,被调函数负责栈平衡。__fastcall:是一种快速调用方式,将参数优先从寄存器传入ecx和edx,剩下的参数再从右向左入栈,被调用函数恢复栈顶指针。
栈平衡
栈平衡,也叫esp定律或者堆栈平衡。其意思是,向堆栈中压入下一行程序的地址,当在进入子程序后进行反向运动的时候,可以恢复到原程执行的下一条指令地址位置。
样例分析
https://www.cnblogs.com/-qing-/p/10674223.html
https://jingyan.baidu.com/article/574c521958be5f6c8c9dc111.html
下期预告
got表和plt表在程序执行过程中的作用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu20.04修改ip地址的方法示例
- Linux 逻辑卷管理(LVM)使用方法总结
- Linux 下载安装VSCode 使用编程输出当前时间的方法
- 详解Linux获取线程的PID(TID、LWP)的几种方式
- Linux文件基本属性知识点总结
- Linux MySQL忘记root密码解决方案
- 如何使用iostat查看linux硬盘IO性能
- linux搭建NFS文件共享服务器的步骤详解
- Windows和Linux实现远程桌面连接
- Ubuntu19.10开启ssh服务(详细过程)
- Ubuntu 18.04更换apt-get源的方法
- 浅谈Linux环境变量文件介绍
- linux创建线程之pthread_create的具体使用
- Ubuntu20.04安装搜狗输入法的详细步骤
- linux系统安装msf的过程详解