В соглашении вызова CDECL я могу повторно использовать аргументы, которые я вставлял в стек?

В соглашении о вызове GCC cdecl, могу ли я полагаться на аргументы, которые я вставлял в стек, чтобы они были одинаковыми после того, как звонок вернулся? Даже при смешивании ASM и C и оптимизации (-O2)?

1 ответ

Одним словом: Нет.

Рассмотрим этот код:

__cdecl int foo(int a, int b)
{
 a = 5;
 b = 6;
 return a + b;
}
int main()
{
 return foo(1, 2);
}

Это создало этот выход asm (скомпилированный с -O0):

movl $5, 8(%***)
movl $6, 12(%***)
movl 8(%***), %edx
movl 12(%***), %eax
addl %edx, %eax
popl %***
ret

Таким образом, вполне возможно, что функция __cdecl топает по значениям стека.

Это даже не считается возможностью встраивания или другой магии оптимизации, где, в первую очередь, не все может быть в стеке.

licensed under cc by-sa 3.0 with attribution.