[英]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 仍在堆棧中
不是真的,因為堆棧不再覆蓋存儲4
和3
的內存。 它們位於堆棧指針之外的內存中。 盡管這些值仍然在內存中曾經是堆棧一部分的位置,但它們現在是未初始化垃圾的一部分。 在堆棧移動后訪問它們,例如通過存儲它們的地址,將是未定義的行為。
他們不應該被清除嗎?
不,清除這些值是不必要的,並且可能會影響程序的運行時效率。
當您調用pop
指令時,堆棧頂部的值存儲在指定的寄存器中,並且 SP(堆棧指針)寄存器遞增(在 x86 上堆棧向下增長)。 它不會修改以前位於堆棧頂部的內存位置,因為沒有必要這樣做。
堆棧頂部的任何值都將保留在那里,直到將新值壓入堆棧頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.