C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall
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的更多相关文章
- stdcall, cdecl, pascal 区别(转载)
转载自:http://www.cnblogs.com/lidabo/archive/2012/11/21/2781484.html stdcall, cdecl, pascal 区别 这三个参数都是告 ...
- Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别
Atitit 函数调用的原理与本质attilax总结 stdcall cdecl区别 通常来说函数调用要用到的两条基本的指令:”CALL”指令和”RET”指令.”CALL”指令将当前的指令指针(这个指 ...
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别 首先,__thiscall是关于类的一种调用方式,它与其他调用方式的最大区别是: __thiscall ...
- (转)函数调用方式与extern "C"
原文:http://patmusing.blog.163.com/blog/static/13583496020103233446784/ (VC编译器下) 1. CALLBACK,WINAPI和AF ...
- 函数调用方式__stdcall、__cdel
函数调用方式关系对比如下: 关键字 调用规则 参数传递方向 返回 参数寄存器 堆栈的清除 __cdecl C语言 从右向左 EAX 无 调用者 __stdcall Win32标准 从右向左 EAX ...
- 64位只有一种调用约定stdcall
procedure TForm2.Button1Click(Sender: TObject); function EnumWindowsProc(Ahwnd: hwnd; AlParam: lPara ...
- JavaScript中七种函数调用方式及对应 this 的含义
this 在 JavaScript 开发中占有相当重要的地位,不过很多人对this这个东西都感觉到琢磨不透.要真正理解JavaScript的函数机制,就非常有必要搞清楚this到底是怎么回事. 函数调 ...
- 前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来
源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...
随机推荐
- AX2009取销售订单的税额
直接用以下方法即可: Tax::calcTaxAmount(salesLine.TaxGroup, salesLine.TaxItemGroup, systemDateGet(), salesL ...
- [LOJ2541] [PKUWC2018] 猎人杀
题目链接 LOJ:https://loj.ac/problem/2541 Solution 很巧妙的思路. 注意到运行的过程中概率的分母在不停的变化,这样会让我们很不好算,我们考虑这样转化:假设所有人 ...
- Spring Boot,Spring Security实现OAuth2 + JWT认证
阅读此文,希望是对JWT以及OAuth2有一定了解的童鞋. JWT认证,提供了对称加密以及非对称的实现. 内容源码点我 涉及到源码中两个服务 spring-boot-oauth-jwt-server ...
- 如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀)
原文:如何更精准地设置 C# / .NET Core 项目的输出路径?(包括添加和删除各种前后缀) 我们都知道可以通过在 Visual Studio 中设置输出路径(OutputPath)来更改项目输 ...
- vue刷新页面出现闪烁
在容器里添加v-cloak <div class="box" id="call-no-list" v-cloak></div> 然后在c ...
- Centos Consul集群及Acl配置
一,准备工作 准备四台centos服务器,三台用于consul server 高可用集群,一台用于consul client作服务注册及健康检查.架构如下图所示 二,在四台服务器上安装consul 1 ...
- 使用requests简单的页面爬取
首先安装requests库和准备User Agent 安装requests直接使用pip安装即可 pip install requests 准备User Agent,直接在百度搜索"UA查询 ...
- vue-cli 3.0 安装
一.安装vue-cli 脚手架命令 npm install -g vue-cli 适用于vue-cli 2.0 npm install -g @vue/cli 适用于vue-cli 3.0 卸载命 ...
- Core Animation笔记(变换)
1.仿射变换 CGAffineTransformMakeScale : CGAffineTransformMakeTranslation CGAffineTransformMakeRotation(C ...
- js中的call()、apply()、bind()
js中的一个核心概念就是对this的理解,关于this前面也有说过,不过在有些情况下,还是需要手动去改变this的指向,这里总结一下,js中关于this操作的三种方法 call() apply() b ...