В соглашении о вызовах 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(%ebp)
movl    $6, 12(%ebp)
movl    8(%ebp), %edx
movl    12(%ebp), %eax
addl    %edx, %eax
popl    %ebp
ret

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

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

Другие вопросы по тегам