分享
017-x86环境 常见的六种参数调用约定传递与平栈【瑞客论坛 www.ruike1.com】.txt
下载文档

ID:3403885

大小:10.34KB

页数:6页

格式:TXT

时间:2024-04-28

收藏 分享赚钱
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
瑞客论坛 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 |

此文档下载收益归作者所有

下载文档
你可能关注的文档
收起
展开