https://www.cnblogs.com/xiangtingshen/p/11014514.html

C++函数调用约定
_cdecl约定:
参数:从右向左依次入栈
堆栈平衡:调用方平衡

#include "pch.h"
#include <iostream> int __cdecl getMaxNumber(int a, int b, int c)
{
int temp = a > b ? a : b;
return temp > c ? temp : c;
} int main()
{
int iMax = ;
iMax = getMaxNumber(, , );
printf("iMAx = %d\n", iMax);
}
.text: sub_411980      proc near               ; CODE XREF: sub_4112B7↑j
.text:
.text: var_CC = byte ptr -0CCh
.text: var_8 = dword ptr -
.text:
.text: push ebp
.text: mov ebp, esp
.text: sub esp, 0CCh
.text: push ebx
.text:0041198A push esi
.text:0041198B push edi
.text:0041198C lea edi, [ebp+var_CC]
.text: mov ecx, 33h
.text: mov eax, 0CCCCCCCCh
.text:0041199C rep stosd
.text:0041199E mov ecx, offset unk_41C009
.text:004119A3 call sub_411221
.text:004119A8 mov [ebp+var_8],
.text:004119AF push 16 // 从右到左入栈
.text:004119B1 push 30
.text:004119B3 push 10
.text:004119B5 call sub_411087
.text:004119BA add esp, 0Ch // 平衡堆栈
.text:004119BD mov [ebp+var_8], eax
.text:004119C0 mov eax, [ebp+var_8]
.text:004119C3 push eax
.text:004119C4 push offset aImaxD ; "iMAx = %d\n"
.text:004119C9 call sub_41104B
.text:004119CE add esp,
.text:004119D1 xor eax, eax
.text:004119D3 pop edi
.text:004119D4 pop esi
.text:004119D5 pop ebx
.text:004119D6 add esp, 0CCh
.text:004119DC cmp ebp, esp
.text:004119DE call sub_41122B
.text:004119E3 mov esp, ebp
.text:004119E5 pop ebp
.text:004119E6 retn
.text:004119E6 sub_411980 endp

函数内部

push 参数一 //参数入栈顺序:从右向左依次入栈
push 参数二
push 。。。
push 参数N
call Fun //调用函数
add esp,XX //堆栈平衡

_stdcall约定:
参数:从右向左依次入栈
堆栈平衡:被调用方自己平衡

#include "pch.h"
#include <iostream> int __stdcall getMaxNumber(int a, int b, int c)
{
int temp = a > b ? a : b;
return temp > c ? temp : c;
} int main()
{
int iMax = ;
iMax = getMaxNumber(, , );
printf("iMAx = %d\n", iMax);
}
.text:004119A8                 mov     [ebp+var_8],
.text:004119AF push
.text:004119B1 push
.text:004119B3 push
.text:004119B5 call sub_411393
.text:004119BA mov [ebp+var_8], eax
.text:004119BD mov eax, [ebp+var_8]
.text:004119C0 push eax
.text:004119C1 push offset aImaxD ; "iMAx = %d\n"
.text:004119C6 call sub_41104B // 在函数内部恢复堆栈
.text:004119CB add esp,
.text:004119CE xor eax, eax
.text:004119D0 pop edi
.text:004119D1 pop esi
.text:004119D2 pop ebx
.text:004119D3 add esp, 0CCh
.text:004119D9 cmp ebp, esp
.text:004119DB call sub_41122B
.text:004119E0 mov esp, ebp
.text:004119E2 pop ebp
.text:004119E3 retn
.text:004119E3 sub_411980 endp

函数

text:004117D0 var_D0          = dword ptr -0D0h
.text:004117D0 var_8 = dword ptr -
.text:004117D0 arg_0 = dword ptr
.text:004117D0 arg_4 = dword ptr 0Ch
.text:004117D0 arg_8 = dword ptr 10h
.text:004117D0
.text:004117D0 push ebp
.text:004117D1 mov ebp, esp
.text:004117D3 sub esp, 0D0h
.text:004117D9 push ebx
.text:004117DA push esi
.text:004117DB push edi
.text:004117DC lea edi, [ebp+var_D0]
.text:004117E2 mov ecx, 34h
.text:004117E7 mov eax, 0CCCCCCCCh
.text:004117EC rep stosd
.text:004117EE mov ecx, offset unk_41C009
.text:004117F3 call sub_411221
.text:004117F8 mov eax, [ebp+arg_0]
.text:004117FB cmp eax, [ebp+arg_4]
.text:004117FE jle short loc_41180B
.text: mov ecx, [ebp+arg_0]
.text: mov [ebp+var_D0], ecx
.text: jmp short loc_411814
.text:0041180B ; ---------------------------------------------------------------------------
.text:0041180B
.text:0041180B loc_41180B: ; CODE XREF: sub_4117D0+2E↑j
.text:0041180B mov edx, [ebp+arg_4]
.text:0041180E mov [ebp+var_D0], edx
.text:
.text: loc_411814: ; CODE XREF: sub_4117D0+39↑j
.text: mov eax, [ebp+var_D0]
.text:0041181A mov [ebp+var_8], eax
.text:0041181D mov eax, [ebp+var_8]
.text: cmp eax, [ebp+arg_8]
.text: jle short loc_411830
.text: mov ecx, [ebp+var_8]
.text: mov [ebp+var_D0], ecx
.text:0041182E jmp short loc_411839
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_411830: ; CODE XREF: sub_4117D0+53↑j
.text: mov edx, [ebp+arg_8]
.text: mov [ebp+var_D0], edx
.text:
.text: loc_411839: ; CODE XREF: sub_4117D0+5E↑j
.text: mov eax, [ebp+var_D0]
.text:0041183F pop edi
.text: pop esi
.text: pop ebx
.text: add esp, 0D0h
.text: cmp ebp, esp
.text:0041184A call sub_41122B
.text:0041184F mov esp, ebp
.text: pop ebp
.text: retn 0Ch // 恢复堆栈
.text: sub_4117D0 endp
.text:

push 参数一 //参数入栈顺序:从右向左依次入栈
push 参数二
push 。。。
push 参数N
call Fun //调用函数,在函数内进行堆栈平衡,retn XX

_fastcall约定:
参数:从右向左依次入栈,当参数不大于二的时候一般把参数放到edx,ecx里面,大于二的时候参数放在堆栈里面
堆栈平衡:被调用方自己平衡

.text: var_CC          = byte ptr -0CCh
.text: var_8 = dword ptr -
.text:
.text: push ebp
.text: mov ebp, esp
.text: sub esp, 0CCh
.text: push ebx
.text:0041198A push esi
.text:0041198B push edi
.text:0041198C lea edi, [ebp+var_CC]
.text: mov ecx, 33h
.text: mov eax, 0CCCCCCCCh
.text:0041199C rep stosd
.text:0041199E mov ecx, offset unk_41C009
.text:004119A3 call sub_411221
.text:004119A8 mov [ebp+var_8],
.text:004119AF push 16
.text:004119B1 mov edx, 30
.text:004119B6 mov
ecx, 10
.text:004119BB call sub_411398
.text:004119C0 mov [ebp+var_8], eax
.text:004119C3 mov eax, [ebp+var_8]
.text:004119C6 push eax
.text:004119C7 push offset aImaxD ; "iMAx = %d\n"
.text:004119CC call sub_41104B
.text:004119D1 add esp,
.text:004119D4 xor eax, eax
.text:004119D6 pop edi
.text:004119D7 pop esi
.text:004119D8 pop ebx
.text:004119D9 add esp, 0CCh
.text:004119DF cmp ebp, esp
.text:004119E1 call sub_41122B
.text:004119E6 mov esp, ebp
.text:004119E8 pop ebp
.text:004119E9 retn
.text:004119E9 sub_411980 endp

函数内部

text:004117D0 sub_4117D0      proc near               ; CODE XREF: .text:00411087↑j
.text:004117D0 ; .text:00411393↑j ...
.text:004117D0
.text:004117D0 var_E8 = dword ptr -0E8h
.text:004117D0 var_20 = dword ptr -20h
.text:004117D0 var_14 = dword ptr -14h
.text:004117D0 var_8 = dword ptr -
.text:004117D0 arg_0 = dword ptr
.text:004117D0
.text:004117D0 push ebp
.text:004117D1 mov ebp, esp
.text:004117D3 sub esp, 0E8h
.text:004117D9 push ebx
.text:004117DA push esi
.text:004117DB push edi
.text:004117DC push ecx
.text:004117DD lea edi, [ebp+var_E8]
.text:004117E3 mov ecx, 3Ah
.text:004117E8 mov eax, 0CCCCCCCCh
.text:004117ED rep stosd
.text:004117EF pop ecx
.text:004117F0 mov [ebp+var_14], edx
.text:004117F3 mov [ebp+var_8], ecx
.text:004117F6 mov ecx, offset unk_41C009
.text:004117FB call sub_411221
.text: mov eax, [ebp+var_8]
.text: cmp eax, [ebp+var_14]
.text: jle short loc_411813
.text: mov ecx, [ebp+var_8]
.text:0041180B mov [ebp+var_E8], ecx
.text: jmp short loc_41181C
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_411813: ; CODE XREF: sub_4117D0+36↑j
.text: mov edx, [ebp+var_14]
.text: mov [ebp+var_E8], edx
.text:0041181C
.text:0041181C loc_41181C: ; CODE XREF: sub_4117D0+41↑j
.text:0041181C mov eax, [ebp+var_E8]
.text: mov [ebp+var_20], eax
.text: mov eax, [ebp+var_20]
.text: cmp eax, [ebp+arg_0]
.text:0041182B jle short loc_411838
.text:0041182D mov ecx, [ebp+var_20]
.text: mov [ebp+var_E8], ecx
.text: jmp short loc_411841
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_411838: ; CODE XREF: sub_4117D0+5B↑j
.text: mov edx, [ebp+arg_0]
.text:0041183B mov [ebp+var_E8], edx
.text:
.text: loc_411841: ; CODE XREF: sub_4117D0+66↑j
.text: mov eax, [ebp+var_E8]
.text: pop edi
.text: pop esi
.text: pop ebx
.text:0041184A add esp, 0E8h
.text: cmp ebp, esp
.text: call sub_41122B
.text: mov esp, ebp
.text: pop ebp
.text:0041185A retn 4
.text:0041185A sub_4117D0 endp

push 参数一 //参数入栈顺序:从右向左依次入栈
push 参数二
push 。。。
push edx
push ecx //寄存器传递
call Fun //调用函数,在函数内进行堆栈平衡,retn XX

naked约定:
参数:从右向左依次入栈
堆栈平衡:调用方平衡

push 参数一 //参数入栈顺序:从右向左依次入栈
push 参数二
push 。。。
push 参数N
call Fun //调用函数
add esp,XX //堆栈平衡

C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall的更多相关文章

  1. stdcall, cdecl, pascal 区别(转载)

    转载自:http://www.cnblogs.com/lidabo/archive/2012/11/21/2781484.html stdcall, cdecl, pascal 区别 这三个参数都是告 ...

  2. Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别

    Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别 通常来说函数调用要用到的两条基本的指令:”CALL”指令和”RET”指令.”CALL”指令将当前的指令指针(这个指 ...

  3. 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别

    函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别 首先,__thiscall是关于类的一种调用方式,它与其他调用方式的最大区别是:    __thiscall ...

  4. (转)函数调用方式与extern "C"

    原文:http://patmusing.blog.163.com/blog/static/13583496020103233446784/ (VC编译器下) 1. CALLBACK,WINAPI和AF ...

  5. 函数调用方式__stdcall、__cdel

    函数调用方式关系对比如下: 关键字 调用规则 参数传递方向 返回 参数寄存器 堆栈的清除 __cdecl C语言 从右向左 EAX 无 调用者 __stdcall Win32标准  从右向左 EAX ...

  6. 64位只有一种调用约定stdcall

    procedure TForm2.Button1Click(Sender: TObject); function EnumWindowsProc(Ahwnd: hwnd; AlParam: lPara ...

  7. JavaScript中七种函数调用方式及对应 this 的含义

    this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感觉到琢磨不透.要真正理解JavaScript的函数机制,就非常有必要搞清楚this到底是怎么回事. 函数调 ...

  8. 前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)

    原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...

  9. 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来

    源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...

随机推荐

  1. SpringCloud——eureka集群

    目的: 第一种普通方式 第二种方式骚操作 Eureka自我保护机制 Eureka集群搭建 说的通俗易懂一点就是,同一个项目部署在多个服务器上. 当注册中心扛不住高并发的时候,这时候 要用集群来扛: 今 ...

  2. java之hibernate之关联映射之多对一单向关联

    1.在之前学习了单表的crud操作.在实际应用中,大都是多表关联操作,这篇会学习如何处理多表之间的关系. 2.考察书籍表和书籍分类表的关系.书籍表和书籍分类表之间是多对一的关系.数据库的表设计为: 3 ...

  3. docker-compose的一些服务一直是restarting

    1.查看日志 docker logs jenkins(镜像名字) 1.1 可能权限问题 1.2可能内存问题

  4. Python学习文档指引

    Python文档资源: 形式 角色 #注释 文件中的文档 dir函数 对象中可用属性的列表 文档字符串:__doc__ 附加在对象上的文件中的文档 PyDoc:help函数 对象的交互帮助 PyDoc ...

  5. JS 中Json常用操作

    转自: https://www.jianshu.com/p/6501b0f3124f 直接定义json var json = {"name": "小明", &q ...

  6. Linux多IP配置

    # ifconfig eth0:1 172.168.1.222

  7. Xen们和Open Stack们

    1.虚拟化技术:XEN.KVM.ESXI 2.虚拟化管理:Eucalyptus, OpenNebula, OpenStack, OpenQRM, XenServer, Oracle VM, Cloud ...

  8. UEditor 在 Layer 模态框中无法使用问题

    问题: 解决方法: 在 使用  ueditor 的页面顶部加入js代码: window.UEDITOR_HOME_URL = "__STATIC__/path/to/ueditor/&quo ...

  9. redhat6.7环境下oracle11gR2 RAC静默安装

    (一)基础环境 虚拟机环境 :vmware workstation 12 操作系统    : redhat6.7 - 64bit 数据库版本 :11.2.0.4 (二)安装前的环境准备 (2.1)配置 ...

  10. SQL SERVER-Extendevent捕获执行慢的语句

    USE MASTER; GO /* Conditionally drop the session if it already exists */ IF EXISTS (SELECT * FROM sy ...