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. Microsoft的考验――查找第二大的数

    #include<stdio.h> int main() { int n,m,t,max,max1; scanf("%d",&n); while(n--) { ...

  2. [洛谷U72177]火星人plus

    题目大意:给你一个$1\sim n(n\leqslant 10^5)$的排列,设$a$为它在$1\sim n$的全排列中的排名,求在$1\sim n$的全排列中第$a+m$个排列. 题解:康托展开以及 ...

  3. flutter AnimationBuilder

    class BuilderPage extends StatefulWidget { @override State<StatefulWidget> createState() { // ...

  4. kubernetes第四章--架构

  5. jvm调优相关

    查找占用cpu过高的线程,并排查原因 1.查找jvm进程 (1)jps -l (2)ps -ef|grep java 这一步骤可以得到进程号,假如进程号为9527 2.查找该jvm进程中占用cpu比较 ...

  6. Jenkins的语法之pipeline

    如果不处理,pipeline:stages中任一stage失败,都会致使其以下stage都失败,那么处理方式为: 1.stage在可能出错的地方添加try catch语句 如:try{} catch( ...

  7. flutter报错--ProcessException: Process... gradlew.bat ...exited abnormally

    在 VScode 中 debug flutter 是遇到如下问题: ProcessException: Process "G:\demo\flutter\hello_word\android ...

  8. React Native 开发豆瓣评分(六)添加字体图标

    添加依赖 yarn add react-native-vector-icons Link 依赖 react-native link react-native-vector-icons 使用默认字体图标 ...

  9. 利用ABAP 740的新关键字REDUCE完成一个实际工作任务

    ABAP 740从2013年发布至今已经过去很长的时间了,下面这张图来自SAP社区博客: ABAP News for Release 7.40 – What is ABAP 7.40? 图中的ABAP ...

  10. Python学习日记(十六) time模块和random模块

    time模块 python表示时间的三种方式:时间戳.元祖(struct_time).格式化时间字符串 三种格式之间的转换: 1.时间戳 就是从1970年1月1日0点0分0秒开始按秒计算的偏移量,时间 ...