有人知道在调用将值推送到堆栈后会发生什么吗?被调用者会弹出该值,然后被调用者会弹出返回地址?也许会用到汇编代码?
我认为对于以下代码,fib 的返回值随后被用作传递给 plus 函数的参数。我感到困惑的是 fib 返回值被弹出到寄存器中,然后不知何故该值最终被推送到堆栈框架以供下一次调用。
int fib(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;
return fib(n - 1) + fib(n - 2);
}
int main() {
return fib(3);
}
我正在使用下图来了解使用堆栈的线程安全方法,并了解返回值可能在某些约定的寄存器中。
参考:链接
C 中有许多调用约定,最显著的是
cdecl
和stdcall
。在 下
cdecl
,调用者负责在函数返回后从堆栈中弹出所有参数。因此,每条call
指令(对于接受至少一个参数的函数)后面都会跟着一条或两条pop
指令,或者一条add sp, N
指令。在 下
stdcall
,被调用者负责平衡堆栈。这是通过ret N
函数末尾的指令完成的。组装由 Peter Cordes 在评论中提供:https://godbolt.org/z/jb31fhPza
由于您没有为指定“调用约定”
fib()
,您的编译器将使用默认调用约定,如果您使用的是 x86,则可能为cdecl
,但您最好使用您的编译器进行检查。