Как обеспечить соблюдение соглашения о вызовах? - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь написать код, который обеспечивает соблюдение определенных правил вызова:

int __cdecl add(int a, int b) 
{
    return a + b;
}

int main() 
{
    int c = add(5, 8);
    return 0;
}

cdecl должен принудительно проталкивать все параметры через стек. Проект построен в режиме релиза, но с отключенной оптимизацией (в противном случае оптимизатор оптимизировал бы весь код, так как не имеет побочных эффектов). Но независимо от того, какое соглашение я выберу, я всегда получаю следующую сборку:

 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.

...