我正在尝试编写代码,以强制执行特定的调用约定:
int __cdecl add(int a, int b)
{
return a + b;
}
int main()
{
int c = add(5, 8);
return 0;
}
cdecl
应该强制将所有参数推入堆栈。 Project是在发布模式下构建的,但是禁用了优化功能(否则优化程序将优化整个代码,因为它没有副作用)。但是无论我选择哪种约定,我总是得到以下程序集:
5:
6: int main()
7: {
00007FF640871020 sub rsp,38h
8: int c = add(5, 8);
00007FF640871024 mov edx,8
00007FF640871029 mov ecx,5
00007FF64087102E call add (07FF640871000h)
00007FF640871033 mov dword ptr [c],eax
9: return 0;
00007FF640871037 xor eax,eax
10: }
00007FF640871039 add rsp,38h
00007FF64087103D ret
据我所知,这对应于MS fastcall
的调用约定。
我还尝试为此项目切换编译选项,以默认使用cdecl
,但这并没有改变。
是否有一种方法可以强制执行特定的调用约定? IDE /编译器是VS。