瑞客论坛 www.ruike1.com
017-x86环境
常见的六种参数调用约定传递与平栈【瑞客论坛
www.ruike1.com】
017
x86
环境
常见
参数
调用
约定
传递
论坛
www
017-x86环境 常见的六种参数调用约定传递与平栈
2021在线班
郁金香灬老师 QQ 150330575
交流群:158280115
学习目标:
_cdecl //x86 push 传参数
_stdcall //x86 push 传参数
_fastcall //x64 ecx,edx
__vectorcall //vs2015 ecx,edx
_thiscall //以后讲 //类成员函数才能用
_clrcall //仅在 C++/CLI 有效
整数和浮点数传递方式不一样,今天先讨论整数的情况
_cdecl
_stdcall
_fastcall Microsoft 专用
__vectorcall Microsoft 专用
_clrcall Microsoft 专用
// 调用约定.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
//VS环境默认的调用约定
//add esp,参数数量*4
//add rsp,参数数量*8
int _cdecl call_cdecl(int a, int b)
{
return a + b;
}
//ret 参数数量*4 //x86
//ret 参数数量*8 //x64
int _stdcall call_std(int a, int b)
{
return a + b;
}
//快速
int _fastcall call_fast(int a, int b)
{
return a + b;
}
// thiscall 类成员函数独有
/*
int __thiscall call_vector(int a, int b)
{
return a + b;
}
*/
// __vectorcall (/ Gv)
int __vectorcall call_vector(int a, int b)
{
return a + b;
}
int __clrcall test()
{
return 1;
}
int main()
{
int a = 333;
int b = 123;
printf(" call_cdecl()=%d行号=%d\r\n", call_cdecl(0x111,0x222),__LINE__);
printf(" call_std()=%d行号=%d\r\n", call_std(0x11B, 0xB11), __LINE__);
printf(" call_fast()=%d行号=%d\r\n", call_fast(0x11C, 0xC11), __LINE__);
printf(" call_vector()=%d行号=%d\r\n", call_vector(0x11D,0xD11), __LINE__);
return 1;
}
作业: 测试vectorcall和fastcall 超过6个参数时 参数的传递情况.
int call06(int a,int a2,int a3,int a4,int a5,int a6)
{
return a6+6;
}
00411B00 | 55 | push ebp | a017.cpp:48
00411B01 | 8BEC | mov ebp,esp |
00411B03 | 81EC D8000000 | sub esp,D8 |
00411B09 | 53 | push ebx |
00411B0A | 56 | push esi |
00411B0B | 57 | push edi |
00411B0C | 8DBD 28FFFFFF | lea edi,dword ptr ss:[ebp-D8] |
00411B12 | B9 36000000 | mov ecx,36 | 36:'6'
00411B17 | B8 CCCCCCCC | mov eax,CCCCCCCC |
00411B1C | F3:AB | rep stosd |
00411B1E | B9 27C04100 | mov ecx,a017.41C027 | __vectorcall 调用约定
00411B23 | E8 F9F6FFFF | call <a017..@__CheckForDebuggerJustMyCode@> |
00411B28 | C745 F8 4D010000 | mov dword ptr ss:[ebp-8],14D | a017.cpp:49
00411B2F | C745 EC 7B000000 | mov dword ptr ss:[ebp-14],7B | a017.cpp:50, 7B:'{'
00411B36 | A1 00A04100 | mov eax,dword ptr ds:[<long `main'::`1'::__LINE__Var>] | a017.cpp:51
00411B3B | 83C0 03 | add eax,3 |
00411B3E | 50 | push eax |
00411B3F | 68 110A0000 | push A11 |
00411B44 | 68 1A010000 | push 11A |
00411B49 | E8 FFF7FFFF | call <a017.call_cdecl_> |
00411B4E | 83C4 08 | add esp,8 |
00411B51 | 50 | push eax |
00411B52 | 68 507B4100 | push a017.417B50 |
00411B57 | E8 EFF4FFFF | call <a017._m_printf> |
00411B5C | 83C4 0C | add esp,C |
00411B5F | A1 00A04100 | mov eax,dword ptr ds:[<long `main'::`1'::__LINE__Var>] | a017.cpp:53
00411B64 | 83C0 05 | add eax,5 |
00411B67 | 50 | push eax |
00411B68 | 68 110B0000 | push B11 |
00411B6D | 68 1B010000 | push 11B |
00411B72 | E8 9AF7FFFF | call a017.411311 | _stdcall
00411B77 | 50 | push eax |
00411B78 | 68 707B4100 | push a017.417B70 |
00411B7D | E8 C9F4FFFF | call <a017._m_printf> |
00411B82 | 83C4 0C | add esp,C |
00411B85 | A1 00A04100 | mov eax,dword ptr ds:[<long `main'::`1'::__LINE__Var>] | a017.cpp:55
00411B8A | 83C0 07 | add eax,7 |
00411B8D | 50 | push eax |
00411B8E | BA 110C0000 | mov edx,C11 | edx:__enc$textbss$end+357
00411B93 | B9 1C010000 | mov ecx,11C |
00411B98 | E8 71F5FFFF | call <a017.call_fast> |
00411B9D | 50 | push eax |
00411B9E | 68 8C7B4100 | push a017.417B8C |
00411BA3 | E8 A3F4FFFF | call <a017._m_printf> |
00411BA8 | 83C4 0C | add esp,C |
00411BAB | A1 00A04100 | mov eax,dword ptr ds:[<long `main'::`1'::__LINE__Var>] | a017.cpp:57
00411BB0 | 83C0 09 | add eax,9 |
00411BB3 | 50 | push eax |
00411BB4 | BA 110D0000 | mov edx,D11 | edx:__enc$textbss$end+357
00411BB9 | B9 1D010000 | mov ecx,11D |
00411BBE | E8 BCF7FFFF | call a017.41137F | _vector_call
00411BC3 | 50 | push eax |
00411BC4 | 68 AC7B4100 | push a017.417BAC |
00411BC9 | E8 7DF4FFFF | call <a017._m_printf> |
00411BCE | 83C4 0C | add esp,C |
00411BD1 | 6A 06 | push 6 | a017.cpp:59
00411BD3 | 6A 02 | push 2 |
00411BD5 | 68 23010000 | push 123 |
00411BDA | E8 4BF7FFFF | call a017.41132A |
00411BDF | 83C4 0C | add esp,C |
00411BE2 | 50 | push eax |
00411BE3 | 68 CC7B4100 | push a017.417BCC |
00411BE8 | E8 5EF4FFFF | call <a017._m_printf> |
00411BED | 83C4 08 | add esp,8 |
00411BF0 | 8BF4 | mov esi,esp | a017.cpp:60
00411BF2 | FF15 6CB14100 | call dword ptr ds:[<&getchar>] |
00411BF8 | 3BF4 | cmp esi,esp |
00411BFA | E8 2CF6FFFF | call a017.41122B |
00411BFF | B8 01000000 | mov eax,1 | a017.cpp:61
00411C04 | 5F | pop edi | a017.cpp:62
00411C05 | 5E | pop esi |
00411C06 | 5B | pop ebx |
00411C07 | 81C4 D8000000 | add esp,D8 |
00411C0D | 3BEC | cmp ebp,esp |
00411C0F | E8 17F6FFFF | call a017.41122B |
00411C14 | 8BE5 | mov esp,ebp |
00411C16 | 5D | pop ebp |
00411C17 | C3 | ret |
00411C18 | CC | int3 |
00411C19 | CC | int3 |
00411C1A | CC | int3 |