博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall
阅读量:4969 次
发布时间:2019-06-12

本文共 11862 字,大约阅读时间需要 39 分钟。

C++函数调用约定

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

#include "pch.h"#include 
int __cdecl getMaxNumber(int a, int b, int c){ int temp = a > b ? a : b; return temp > c ? temp : c;}int main(){ int iMax = 0; iMax = getMaxNumber(10, 30, 16); printf("iMAx = %d\n", iMax);}

 

.text:00411980 sub_411980      proc near               ; CODE XREF: sub_4112B7↑j.text:00411980.text:00411980 var_CC          = byte ptr -0CCh.text:00411980 var_8           = dword ptr -8.text:00411980.text:00411980                 push    ebp.text:00411981                 mov     ebp, esp.text:00411983                 sub     esp, 0CCh.text:00411989                 push    ebx.text:0041198A                 push    esi.text:0041198B                 push    edi.text:0041198C                 lea     edi, [ebp+var_CC].text:00411992                 mov     ecx, 33h.text:00411997                 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], 0.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, 8.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 
int __stdcall getMaxNumber(int a, int b, int c){ int temp = a > b ? a : b; return temp > c ? temp : c;}int main(){ int iMax = 0; iMax = getMaxNumber(10, 30, 16); printf("iMAx = %d\n", iMax);}

 

 

.text:004119A8                 mov     [ebp+var_8], 0.text:004119AF                 push    16.text:004119B1                 push    30.text:004119B3                 push    10.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, 8.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 -8.text:004117D0 arg_0           = dword ptr  8.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:00411800                 mov     ecx, [ebp+arg_0].text:00411803                 mov     [ebp+var_D0], ecx.text:00411809                 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:00411814.text:00411814 loc_411814:                             ; CODE XREF: sub_4117D0+39↑j.text:00411814                 mov     eax, [ebp+var_D0].text:0041181A                 mov     [ebp+var_8], eax.text:0041181D                 mov     eax, [ebp+var_8].text:00411820                 cmp     eax, [ebp+arg_8].text:00411823                 jle     short loc_411830.text:00411825                 mov     ecx, [ebp+var_8].text:00411828                 mov     [ebp+var_D0], ecx.text:0041182E                 jmp     short loc_411839.text:00411830 ; ---------------------------------------------------------------------------.text:00411830.text:00411830 loc_411830:                             ; CODE XREF: sub_4117D0+53↑j.text:00411830                 mov     edx, [ebp+arg_8].text:00411833                 mov     [ebp+var_D0], edx.text:00411839.text:00411839 loc_411839:                             ; CODE XREF: sub_4117D0+5E↑j.text:00411839                 mov     eax, [ebp+var_D0].text:0041183F                 pop     edi.text:00411840                 pop     esi.text:00411841                 pop     ebx.text:00411842                 add     esp, 0D0h.text:00411848                 cmp     ebp, esp.text:0041184A                 call    sub_41122B.text:0041184F                 mov     esp, ebp.text:00411851                 pop     ebp.text:00411852                 retn    0Ch // 恢复堆栈.text:00411852 sub_4117D0      endp.text:00411852

 

push 参数一 //参数入栈顺序:从右向左依次入栈

push 参数二
push 。。。
push 参数N
call Fun //调用函数,在函数内进行堆栈平衡,retn XX

_fastcall约定:

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

.text:00411980 var_CC          = byte ptr -0CCh.text:00411980 var_8           = dword ptr -8.text:00411980.text:00411980                 push    ebp.text:00411981                 mov     ebp, esp.text:00411983                 sub     esp, 0CCh.text:00411989                 push    ebx.text:0041198A                 push    esi.text:0041198B                 push    edi.text:0041198C                 lea     edi, [ebp+var_CC].text:00411992                 mov     ecx, 33h.text:00411997                 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], 0.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, 8.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 -8.text:004117D0 arg_0           = dword ptr  8.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:00411800                 mov     eax, [ebp+var_8].text:00411803                 cmp     eax, [ebp+var_14].text:00411806                 jle     short loc_411813.text:00411808                 mov     ecx, [ebp+var_8].text:0041180B                 mov     [ebp+var_E8], ecx.text:00411811                 jmp     short loc_41181C.text:00411813 ; ---------------------------------------------------------------------------.text:00411813.text:00411813 loc_411813:                             ; CODE XREF: sub_4117D0+36↑j.text:00411813                 mov     edx, [ebp+var_14].text:00411816                 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:00411822                 mov     [ebp+var_20], eax.text:00411825                 mov     eax, [ebp+var_20].text:00411828                 cmp     eax, [ebp+arg_0].text:0041182B                 jle     short loc_411838.text:0041182D                 mov     ecx, [ebp+var_20].text:00411830                 mov     [ebp+var_E8], ecx.text:00411836                 jmp     short loc_411841.text:00411838 ; ---------------------------------------------------------------------------.text:00411838.text:00411838 loc_411838:                             ; CODE XREF: sub_4117D0+5B↑j.text:00411838                 mov     edx, [ebp+arg_0].text:0041183B                 mov     [ebp+var_E8], edx.text:00411841.text:00411841 loc_411841:                             ; CODE XREF: sub_4117D0+66↑j.text:00411841                 mov     eax, [ebp+var_E8].text:00411847                 pop     edi.text:00411848                 pop     esi.text:00411849                 pop     ebx.text:0041184A                 add     esp, 0E8h.text:00411850                 cmp     ebp, esp.text:00411852                 call    sub_41122B.text:00411857                 mov     esp, ebp.text:00411859                 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 //堆栈平衡

转载于:https://www.cnblogs.com/xiangtingshen/p/11299104.html

你可能感兴趣的文章
130242014034-林伟领-实验一
查看>>
Forbidden You don't have permission to access / on this server.
查看>>
Windows server 2008 R2中安装MySQL !
查看>>
Intellij Idea新建web项目(转)
查看>>
C语言结构体和函数
查看>>
用JAVA编写浏览器内核之实现javascript的document对象与内置方法
查看>>
linux 命令之top
查看>>
洛谷 [P3033] 牛的障碍
查看>>
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
20120227_CET6
查看>>
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
leetcode【67】-Bulb Switcher
查看>>