当前位置:网站首页>函数调用方式_stdcall 、 _cdecl 、_thiscall
函数调用方式_stdcall 、 _cdecl 、_thiscall
2022-07-30 15:38:00 【陈子青 - See】
目录
前言
了解函数调用约定对逆向反汇编的分析会提供极大帮助。
__stdcall
__stdcall的全称是standard call。是C++的标准调用方式。
函数参数的入栈顺序为从右到左入栈。函数返回时使用retn x指令,其中x为调整堆栈的字节数。这种方式叫做自动清栈。即被调用的函数的参数个数是固定的,调用者必须严格按照定义传递参数,一个不多,一个不少。
堆栈平衡方式: __stdcall自动清栈
返回指令:_stdcall使用retn x
编译后函数的修饰名: 假设有函数int add(int a, int b), __stdcall编译后的函数名为[email protected]


__cdecl
__cdecl的全称是C Declaration,即C语言默认的函数调用方式。
函数参数的入栈顺序为从右到左入栈。函数返回时作用ret指令。由调用者手动清栈。被调用的函数支持可变参数。调用者根据调用时传入参数的个数,手动平衡堆栈。
堆栈平衡方式 __cdecl手动清栈。
返回指令:__cdecl使用ret
编译后函数的修饰名: 假设有函数int add(int a, int b), __cdecl编译后的函数名为_foo。

__thiscall
thiscall是调用类内部成员函数时传递的参数 . 其本质是类对象的第一个成员变量的地址.
this指针一般使用寄存器ECX传递
参数的传递方式:函数参数的入栈顺序为从右到左入栈
堆栈平衡:调用者平衡堆栈(外平栈)
【__thiscall只能够用在类的成员函数上,如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定,this指针在所有参数被压栈后压入栈堆】
对参数个数不确定的,调用者清理堆栈,否则函数自己清理堆栈。


__fastcall
通过的ECX和EDX寄存器传参,其余参数从右向左入栈,由调用者清理堆栈。(很少见)

边栏推荐
猜你喜欢

hcip--ospf综合实验

Back waves are coming!Ali produced the "second generation" container technical manual and brain map, which is too fragrant

Placement Rules 使用文档

Pytorch 训练技巧

Golang分布式应用定时任务如何实现

谷歌工程师『代码补全』工具;『Transformers NLP』随书代码;FastAPI开发模板;PyTorch模型加速工具;前沿论文 | ShowMeAI资讯日报

解析字符串拼接的两种情况

FME realizes the method of converting CAD with attribute to SHP data

LeetCode-283-移动零

影像信息提取DEM
随机推荐
静态网页和动态网页的不同之处;该如何选择服务器呢
L2-007 家庭房产(vector、set、map的使用)
MySql 和 PostgreSQL 数据库 根据一张表update另一张表数据
tiup help
TensorFlow custom training function
在 Chrome 浏览器中安装 JSON 显示插件
rhce笔记2
动态规划 --- 状态压缩DP 详细解释
Flask introductory learning tutorial
(Popular Science) What is Fractional NFT (Fractional NFT)
解析字符串拼接的两种情况
科研中一些常用软件清单
二、判断 & 循环
一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?
数据库-SQL
Placement Rules usage documentation
TiUP terms and core concepts
【嵌入式】适用于Cortex-M3(STM32F10x)的IQmath库
如何快速拷贝整个网站所有网页
字符串加千分位符与递归数组求和