文档章节

函数调用约定

梦想游戏人
 梦想游戏人
发布于 2015/06/15 20:56
字数 637
阅读 61
收藏 3
点赞 0
评论 0

..

参数传递顺序

1.从右到左依次入栈:__stdcall,__cdecl,__thiscall,__fastcall

2.从左到右依次入栈:__pascal



主要说明__stdcall __cdecl 区别 

1...__stdcall 被调用的 函数本身负责堆栈平衡

2...__cdecl   调用函数 者负责 该函数的 堆栈平衡


///////**********************    __stdcall    函数本身负责堆栈平衡 *********************////////////////

int  __stdcall a(int v1,int xx)
{
		return 5;
}

int main()
{
	int t=a(5,1);
	return 0;
}

/**/
--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------
int  __stdcall a(int v1,int xx)
{
001713C0  push        ebp  
001713C1  mov         ebp,esp  
001713C3  sub         esp,0C0h  
001713C9  push        ebx  
001713CA  push        esi  
001713CB  push        edi  
001713CC  lea         edi,[ebp-0C0h]  
001713D2  mov         ecx,30h  
001713D7  mov         eax,0CCCCCCCCh  
001713DC  rep stos    dword ptr es:[edi]  
		return 5;
001713DE  mov         eax,5  
}
001713E3  pop         edi  
001713E4  pop         esi  
001713E5  pop         ebx  
001713E6  mov         esp,ebp  
001713E8  pop         ebp  
001713E9  ret         8  /*堆栈平衡 函数参数占用8字节*/

--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------
int main()
{
00171400  push        ebp  
00171401  mov         ebp,esp  
00171403  sub         esp,0CCh  
00171409  push        ebx  
0017140A  push        esi  
0017140B  push        edi  
0017140C  lea         edi,[ebp-0CCh]  
00171412  mov         ecx,33h  
00171417  mov         eax,0CCCCCCCCh  
0017141C  rep stos    dword ptr es:[edi]  
	int t=a(5,1);
0017141E  push        1  
00171420  push        5  
00171422  call        a (01711E0h)  /* 调用函数a*/
00171427  mov         dword ptr [t],eax  /*返回值位于寄存器eax*/

	return 0;
0017142A  xor         eax,eax  
}
0017142C  pop         edi  
0017142D  pop         esi  
0017142E  pop         ebx  
0017142F  add         esp,0CCh  
00171435  cmp         ebp,esp  
00171437  call        __RTC_CheckEsp (017113Bh)  
0017143C  mov         esp,ebp  
0017143E  pop         ebp  
0017143F  ret





///////**********************    __cdecl    调用函数者 负责堆栈平衡 *********************////////////////

int  __cdecl a(int v1,int xx)
{
		return 5;
}

int main()
{
	int t=a(5,1);

	return 0;
}




/*
反汇编

*/

--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------

int  __cdecl a(int v1,int xx)
{
00F313C0  push        ebp  
00F313C1  mov         ebp,esp  
00F313C3  sub         esp,0C0h  
00F313C9  push        ebx  
00F313CA  push        esi  
00F313CB  push        edi  
00F313CC  lea         edi,[ebp-0C0h]  
00F313D2  mov         ecx,30h  
00F313D7  mov         eax,0CCCCCCCCh  
00F313DC  rep stos    dword ptr es:[edi]  
		return 5;
00F313DE  mov         eax,5  
}
00F313E3  pop         edi  
00F313E4  pop         esi  
00F313E5  pop         ebx  
00F313E6  mov         esp,ebp  
00F313E8  pop         ebp  
00F313E9  ret  

--- c:\users\hekun\desktop\cppp\cppp\源.cpp -------------------------------------

int main()
{
00F31400  push        ebp  
00F31401  mov         ebp,esp  
00F31403  sub         esp,0CCh  
00F31409  push        ebx  
00F3140A  push        esi  
00F3140B  push        edi  
00F3140C  lea         edi,[ebp-0CCh]  
00F31412  mov         ecx,33h  
00F31417  mov         eax,0CCCCCCCCh  
00F3141C  rep stos    dword ptr es:[edi]  
	int t=a(5,1);
00F3141E  push        1  
00F31420  push        5  
00F31422  call        a (0F311E5h)  /* 调用函数 a  */
00F31427  add         esp,8     /* 由于是 __cdecl 调用方式 所以调用者 main 负责堆栈平衡,函数a 返回后 立即堆栈平衡(占用8字节)  变参函数只能是这种调用,因为只有调用者才知道 参数实际大小*/
00F3142A  mov         dword ptr [t],eax  

	return 0;
00F3142D  xor         eax,eax  
}
00F3142F  pop         edi  
00F31430  pop         esi  
00F31431  pop         ebx  
00F31432  add         esp,0CCh  
00F31438  cmp         ebp,esp  
00F3143A  call        __RTC_CheckEsp (0F3113Bh)  
00F3143F  mov         esp,ebp  
00F31441  pop         ebp  
00F31442  ret



__fastcall 调用  前参数 最大8字节 一次放入寄存器 ecx和edx  其余参数 放入栈中


© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 34
博文 409
码字总数 116555
作品 0
成都
WIN32编程必知:__stdcall,__cdecl,__fastcall,thiscall,n

被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(fastcall的前面部分由ecx,edx传), 函数调用在返回前要清理堆栈,但由调用者还是被调用者清理不一定。 1、_stdcall是Pascal程...

guoliang
2014/04/03
0
0
__cdecl __stdcall

1.如果函数func是cdecl(默认调用方式),调用时情况如下 int main() { //参数从右到左压栈 push 4 push 3 push 2 push 1 call func add esp 0x10 //调用者恢复堆栈指针esp,4个参数的大小是0...

ryany
2011/03/21
0
0
_cdecl、_stdcall、_fastcall和_thiscall整理

cdecl、stdcall、fastcall和thiscall整理 1._cdecl是C Declaration的缩写,表示C语言默认的函数调用方法:所有参数 从右到左依次入栈,这些参数由调用者清除,称为手动清栈(由调用者把参数弹...

西昆仑
2011/11/17
0
1
带你玩转Visual Studio——调用约定与(动态)库

上一篇文章带你玩转Visual Studio——调用约定cdecl、stdcall和fastcall中已经讲述了cdecl、stdcall和fastcall几种调用约定的主要区别。这一章将进一步深入了解不同调用约定对编译后函数修饰...

spencer.luo
2017/12/25
0
0
__declspec(dllimport)和__declspec(dllexport)的区别,以及有关c/c++调用约定

DLL可以使用两种方法将公共符号导入到应用程序中或从 DLL 导出函数: 生成 DLL 时使用模块定义 (.DEF) 文件。 在主应用程序的函数定义中使用 declspec(dllimport) 或 declspec(dllexport) 关...

AlphaJay
2010/08/20
0
0
带你玩转Visual Studio——调用约定__cdecl、__stdcall和__fastcall

有一定C++开发经验的人一定对"cdecl、stdcall、fastcall"肯定不陌生吧!但你真正理解了吗?是的,我曾在这采了无数个坑,栽了无数个跟头,终于忍无可忍要把它总结一下(虽然我已经有能力解决大...

spencer.luo
2017/12/25
0
0
Windbg查看调用堆栈(k*)

https://www.52pojie.cn/thread-664189-1-1.html 无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈。学会windbg调用堆栈命令,以及理解堆栈中的各个参数的意义...

nothingfinal
2017/11/18
0
0
外部函数接口--LibFFI

“FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码。而 “Libffi” 库只提供了最底层的、与架构相关的、完整的”FFI”,因此在它之上必...

红薯
2013/11/15
4K
0
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)

关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是cdecl方式,而windows API则是std...

AlphaJay
2010/08/20
0
1
【转】[C/C++]函数参数的入栈顺序

#include <iostream> include <cstdio> void foo(int x, int y, int* z){printf("x = %d at [0x%x]n", x, &x);printf("y = %d at [0x%x]n", y, &y);printf("z = 0x%x at [0x%x]n", z, &z);}i......

貉子
2014/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
10
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部