VC6.0++函数调用方式有三种:

分别为:

1._stdcall 方式

int _stdcall add1(int i,int j)
{cout<<"_stdcall out"<<endl;return i+j;
}
0040158F      CC            INT3                                     ;  _stdcall 被调方平衡栈
00401590 > >  55            PUSH EBP
00401591   .  8BEC          MOV EBP,ESP
00401593   .  83EC 40       SUB ESP,40
00401596   .  53            PUSH EBX
00401597   .  56            PUSH ESI
00401598   .  57            PUSH EDI
00401599   .  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]
0040159C   .  B9 10000000   MOV ECX,10
004015A1   .  B8 CCCCCCCC   MOV EAX,CCCCCCCC
004015A6   .  F3:AB         REP STOS DWORD PTR ES:[EDI]
004015A8   .  68 CD104000   PUSH testcall.004010CD
004015AD   .  68 1C004700   PUSH OFFSET testcall.??_C@_0N@HMEN@_stdc>;  _stdcall out
004015B2   .  68 A0DE4700   PUSH OFFSET testcall.std::cout
004015B7   .  E8 D8FCFFFF   CALL testcall.00401294
004015BC   .  83C4 08       ADD ESP,8
004015BF   .  8BC8          MOV ECX,EAX
004015C1   .  E8 24FCFFFF   CALL testcall.004011EA
004015C6   .  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
004015C9   .  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]
004015CC   .  5F            POP EDI
004015CD   .  5E            POP ESI
004015CE   .  5B            POP EBX
004015CF   .  83C4 40       ADD ESP,40
004015D2   .  3BEC          CMP EBP,ESP
004015D4   .  E8 D7F50100   CALL testcall.__chkesp
004015D9   .  8BE5          MOV ESP,EBP
004015DB   .  5D            POP EBP
004015DC   .  C2 0800       RETN 8
004015DF      CC            INT3

以上为DEBUG反汇编源码:

2._fastcall 方式

int _fastcall add2(int i, int j)
{cout<<"_fastcall out"<<endl;return i+j;
}
004015FF      CC            INT3                                     ;  _fastcall 被调方 平衡栈
00401600 > >  55            PUSH EBP
00401601   .  8BEC          MOV EBP,ESP
00401603   .  83EC 48       SUB ESP,48
00401606   .  53            PUSH EBX
00401607   .  56            PUSH ESI
00401608   .  57            PUSH EDI
00401609   .  51            PUSH ECX
0040160A   .  8D7D B8       LEA EDI,DWORD PTR SS:[EBP-48]
0040160D   .  B9 12000000   MOV ECX,12
00401612   .  B8 CCCCCCCC   MOV EAX,CCCCCCCC
00401617   .  F3:AB         REP STOS DWORD PTR ES:[EDI]
00401619   .  59            POP ECX
0040161A   .  8955 F8       MOV DWORD PTR SS:[EBP-8],EDX
0040161D   .  894D FC       MOV DWORD PTR SS:[EBP-4],ECX
00401620   .  68 CD104000   PUSH testcall.004010CD
00401625   .  68 2C004700   PUSH OFFSET testcall.??_C@_0O@JLOO@_fast>;  _fastcall out
0040162A   .  68 A0DE4700   PUSH OFFSET testcall.std::cout
0040162F   .  E8 60FCFFFF   CALL testcall.00401294
00401634   .  83C4 08       ADD ESP,8
00401637   .  8BC8          MOV ECX,EAX
00401639   .  E8 ACFBFFFF   CALL testcall.004011EA
0040163E   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00401641   .  0345 F8       ADD EAX,DWORD PTR SS:[EBP-8]
00401644   .  5F            POP EDI
00401645   .  5E            POP ESI
00401646   .  5B            POP EBX
00401647   .  83C4 48       ADD ESP,48
0040164A   .  3BEC          CMP EBP,ESP
0040164C   .  E8 5FF50100   CALL testcall.__chkesp
00401651   .  8BE5          MOV ESP,EBP
00401653   .  5D            POP EBP
00401654   .  C3            RETN

以上为对应的DEBUG反汇编源码

3.cdecl 方式

int _cdecl add3(int i,int j)
{cout<<"_cdecl out"<<endl;return i+j;
}
00401670 > > \55            PUSH EBP                                 ;  保存栈底指针EBP
00401671   .  8BEC          MOV EBP,ESP                              ;  调整当前栈底指针位置到栈顶
00401673   .  83EC 40       SUB ESP,40                               ;  开辟栈空间  作为局部变量的存储空间
00401676   .  53            PUSH EBX                                 ;  保存EBX寄存器
00401677   .  56            PUSH ESI                                 ;  保存ESI寄存器
00401678   .  57            PUSH EDI                                 ;  保存EDI寄存器
00401679   .  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]            ;  取出此函数 可用栈空间首地址
0040167C   .  B9 10000000   MOV ECX,10
00401681   .  B8 CCCCCCCC   MOV EAX,CCCCCCCC
00401686   .  F3:AB         REP STOS DWORD PTR ES:[EDI]
00401688   .  68 CD104000   PUSH testcall.004010CD
0040168D   .  68 3C004700   PUSH OFFSET testcall.??_C@_0L@INPI@_cdec>;  _cdecl out
00401692   .  68 A0DE4700   PUSH OFFSET testcall.std::cout
00401697   .  E8 F8FBFFFF   CALL testcall.00401294
0040169C   .  83C4 08       ADD ESP,8
0040169F   .  8BC8          MOV ECX,EAX
004016A1   .  E8 44FBFFFF   CALL testcall.004011EA
004016A6   .  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ;  将EBP+8 处值 传送到EAX中
004016A9   .  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]             ;  将EBP+C 处值与EAX值 相加
004016AC   .  5F            POP EDI                                  ;  还原EDI 寄存器
004016AD   .  5E            POP ESI                                  ;  还原ESI寄存器
004016AE   .  5B            POP EBX                                  ;  还原EBX寄存器
004016AF   .  83C4 40       ADD ESP,40                               ;  降低栈顶,此时局部变量空间被释放
004016B2   .  3BEC          CMP EBP,ESP                              ;  检测栈平衡
004016B4   .  E8 F7F40100   CALL testcall.__chkesp                   ;  进入栈平衡错误检测函数
004016B9   .  8BE5          MOV ESP,EBP                              ;  还原ESP
004016BB   .  5D            POP EBP
004016BC   .  C3            RETN

以上为对应的DEBUG反汇编源码解释。

小结:

1.默认采用_cdecl方式。

2._fastcall方式 只是前两个参数用寄存器传递,后面的都采用栈传参方式。

C++反汇编-函数调用原理相关推荐

  1. c语言中姓名查找的原理,搜索 C/C++ 函数调用原理

    在 C/C++ 函数调用的整个过程中内存空间进行了什么操作?本文对 C/C++ 函数调用原理进行扼要说明. 一.预备知识 (一) 内存中数据的地址 地址在内存中存放时可能会跨越连续若干个存储单元(一个 ...

  2. 栈中函数调用原理_详解

                 函数调用是程序设计中的重要环节,本文就函数调用的过程进行分析. 一.eip.ebp.esp介绍 EIP,EBP,ESP都是系统的寄存器,里面存储的是些地址,我们系统中栈的 ...

  3. kitten编程猫里的函数定义,函数实现和函数调用原理

    kitten编程猫 函数定义和函数实现: var 我的成语库 = [];function 成语初始化() {我的成语库.splice('' - 1, 1);我的成语库.push(1);我的成语库.pu ...

  4. 关于C语言中的RGB函数调用原理

    三原色光模式(RGB color model),又称RGB颜色模型或红绿蓝颜色模型,是一种加色模型,将红(Red).绿(Green).蓝(Blue)三原色的色光以不同的比例相加,以合成产生各种色彩光. ...

  5. Swift与LLVM-Clang原理与示例

    Swift与LLVM-Clang原理与示例 LLVM 学习 从 简单汇编基础 到 Swift 不简单的 a + 1 作为iOS开发,程序崩溃犹如家常便饭,秉着没有崩溃也要制造崩溃的原则 每天都吃的很饱 ...

  6. C++反汇编代码分析

    C++反汇编代码分析--函数调用 代码如下: #include "stdlib.h" int sum(int a,int b,int m,int n) {   return a+b ...

  7. c++反汇编代码分析--偷调函数

    注:不知道说"偷调函数"说法合不合适,在此也就这样一说了~ 主要有两点: 一.再说C++反汇编函数调用,重点是怎样通过堆栈实现由被调用函数转到调用者 二.在 1 的基础上,在Win ...

  8. 拦截图片代码 精易web浏览器_[原创]用Com HOOK实现拦截WebBrowser的alert函数调用

    [原创]用Com HOOK实现拦截WebBrowser的alert函数调用 [原创]用Com HOOK实现拦截WebBrowser的alert函数调用 原理简单说一下,实际上不只是WebBrowser ...

  9. arm裸机【5】 --- 反汇编介绍

    1.反汇编工具objdump的使用简介 反汇编的原理&为什么要反汇编 反汇编文件的格式和看法 2.初识指令地址 3.展望:反汇编工具帮助我们分析链接脚本 1.反汇编工具objdump的使用简介 ...

最新文章

  1. Linux压缩和解压缩命令集
  2. 读书:儒林外史第一回
  3. 观察者模式重复调用mysql问题,2、观察者模式
  4. 成功解决TypeError: sequence item 0: expected str instance, list found
  5. Shared pool内存块组成结构及4031错误原因分析
  6. C语言实现循环链表Circularly Linked List(附完整源码)
  7. 李猛:从MongoDB迁移到ES后,我们减少了80%的服务器
  8. 【Java】Java 集合相关的博客积累
  9. 在linux系统下java实现pdf导出汉字无法显示_Linux环境下iText生成pdf中文不显示问题...
  10. 淘口令二合一生成php_3淘口令接口的封装 工具类的打造
  11. 一篇关于蓝牙SDP和L2CAP协议的文章
  12. 想要做好SEO优化,你必须懂得SEO的核心因素
  13. OFFICE2003的自动保存功能。
  14. linux终端怎么复制粘贴某一行_超级小白帖:如何在Linux终端中复制粘贴
  15. 浏览器主页被篡改为hao123、360和2345解决办法
  16. 在OpenCV里实现直方图反向投影算法
  17. android 自定义图片裁剪,android 自定义比例裁剪图片(拍照 相册)方式 自定义比例...
  18. 怎样给蔬菜图片抠图?看看这个马路中央的紫茄子
  19. 修改Datagrip 2021.2.4 系统文件插件等目录的位置
  20. 新浪邮箱(@sina.com/@sina.cn):启用IMAP4/SMTP服务+授权码

热门文章

  1. 计算机三级上机题库百度云,全国计算机三级数据库等级考试全套(笔试背诵资料+笔试试题+详细答案+最新数据库技术上机试题题库).doc...
  2. scratch编程——画笔模块画各种同心图案
  3. opus 编码和解码完整demo代码,opus和wav互转(js源码)
  4. 例25:求1+2!+3!+...+20!的和。
  5. hmailserver搭建一个公网可收发的自用邮局
  6. 东田纳西州立大学计算机排名,东田纳西州立大学如何
  7. Thrill: 基于C++的高性能分布式批处理算法
  8. 后缀是lnk是什么文件_后缀为.lnk的文件怎么打开?
  9. Googlenbsp;Calendarnbsp;与amp;nbs…
  10. 炫酷手持滚动弹幕生成小工具微信小程序源码