簡體   English   中英

當函數調用返回時,壓入堆棧的參數會發生什么變化?

[英]What happens to arguments pushed on the stack when a function call returns?

假設這個 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;
}

調用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`

但是add下的值 4 和 3 仍在堆棧中-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  

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

不是真的,因為堆棧不再覆蓋存儲43的內存。 它們位於堆棧指針之外的內存中。 盡管這些值仍然在內存中曾經是堆棧一部分的位置,但它們現在是未初始化垃圾的一部分。 在堆棧移動后訪問它們,例如通過存儲它們的地址,將是未定義的行為。

他們不應該被清除嗎?

不,清除這些值是不必要的,並且可能會影響程序的運行時效率。

當您調用pop指令時,堆棧頂部的值存儲在指定的寄存器中,並且 SP(堆棧指針)寄存器遞增(在 x86 上堆棧向下增長)。 它不會修改以前位於堆棧頂部的內存位置,因為沒有必要這樣做。

堆棧頂部的任何值都將保留在那里,直到將新值壓入堆棧頂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM