调用约定和堆栈,调用返回值?

问题描述 投票:0回答:1

有谁知道调用将一个值压入堆栈后会发生什么,它被被调用者弹出,然后返回地址被被调用者弹出?也许需要一些组装?

我认为对于以下代码,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);
}

我使用下图来了解使用堆栈的线程安全方式,并了解返回值可能位于某些约定的寄存器中。

ea 参考:链接

c assembly stack call
1个回答
0
投票

由于您尚未为 fib() 指定

“调用约定”
,因此您的编译器将使用默认调用约定。

C 中的默认调用约定是

cdecl

cdecl
下,调用者负责在函数返回后从堆栈中弹出所有参数。因此,每条
call
指令(对于接受至少一个参数的函数)都后面跟着一个或两个
pop
指令,或者一个
add sp, N
指令。

在其他调用约定(例如

stdcall
)下,由被调用者负责平衡堆栈。这是通过函数末尾的
ret N
指令完成的。

© www.soinside.com 2019 - 2024. All rights reserved.