如何执行调用约定?

时间:2018-06-27 08:21:36

标签: c++ visual-studio calling-convention

我正在尝试编写代码,以强制执行特定的调用约定:

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。

0 个答案:

没有答案