我已经反汇编了 Swap 函数的两种不同变体(两个指针之间的简单值交换)。
1)。__fastcall http://pastebin.com/ux5LMktz
2)。__stdcall(默认情况下,没有显式调用约定修饰符的函数将具有 __stdcall,因为 Windows 的 MS C++ 编译器)http://pastebin.com/eGR6VUjX
据我所知,__fastcall 的实现方式不同,具体取决于编译器,但基本上它将前两个参数(从左到右)放入 ECX 和 EDX 寄存器。并且可能会使用堆栈,但如果参数太长。
但是对于第一个选项的链接,您可以看到,该值被推送到 ECX 注册表中,并且交换函数的两种变体之间没有真正的区别。
并且 __fastcall 变体确实使用:
00AA261F pop ecx
00AA2620 mov dword ptr [ebp-14h],edx
00AA2623 mov dword ptr [ebp-8],ecx
__stdcall 版本中没有使用。
所以它看起来不像更优化(因为 __fasctcall 必须是,根据它的定义)。
我是 ASM 语言和调用约定方面的新手,所以我向您请教一条建议。也许 __fastcall 在我的样本中确实更快,但我没有看到它,是吗?
谢谢!