В соглашении о вызовах 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 может растоптать значения стека.
Это даже не считая возможности встраивания или другой магии оптимизации, когда вещи могут не попасть в стек в первую очередь.