Я пытаюсь написать код, который обеспечивает соблюдение определенных правил вызова:
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.