当函数调用返回时,压入堆栈的参数会发生什么?

4 c assembly stack

假设这个 C 代码:

int add(int a, int b){
 int c = a+b;
 return c;
}

int main(){
  int c = add(3,4);
  printf("%d", c);
  return 0;
}

Run Code Online (Sandbox Code Playgroud)

调用add时会发生以下情况:

Push 4 on the stack
Push 3 on the stack
Push the address of `printf` on the stack (return address)
call `add`
// do stuff under add
pop the stack and and goto `printf`
Run Code Online (Sandbox Code Playgroud)

但是下面的值 4 和 3add仍在堆栈中-0x18(%rbp)。他们不应该被清除吗?

00000000000005fa <add>:
 5fa:   55                      push   %rbp
 5fb:   48 89 e5                mov    %rsp,%rbp
 5fe:   89 7d ec                mov    %edi,-0x14(%rbp)
 601:   89 75 e8                mov    %esi,-0x18(%rbp)
 604:   8b 55 ec                mov    -0x14(%rbp),%edx
 607:   8b 45 e8                mov    -0x18(%rbp),%eax
 60a:   01 d0                   add    %edx,%eax
 60c:   89 45 fc                mov    %eax,-0x4(%rbp)
 60f:   8b 45 fc                mov    -0x4(%rbp),%eax
 612:   5d                      pop    %rbp
 613:   c3                      retq   

0000000000000614 <main>:
 614:   55                      push   %rbp
 615:   48 89 e5                mov    %rsp,%rbp
 618:   be 04 00 00 00          mov    $0x4,%esi
 61d:   bf 03 00 00 00          mov    $0x3,%edi
 622:   e8 d3 ff ff ff          callq  5fa <add>
 627:   5d                      pop    %rbp
 628:   c3                      retq  
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

但是 add 下的值 4 和 3 仍在堆栈中

不是真的,因为堆栈不再覆盖存储4和3存储的内存。它们位于堆栈指针之外的内存中。尽管这些值仍然在内存中曾经是堆栈一部分的位置,但它们现在是未初始化垃圾的一部分。在堆栈移动后访问它们,例如通过存储它们的地址,将是未定义的行为。

他们不应该被清除吗?

不,清除这些值是不必要的,并且可能会影响程序的运行时效率。