gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:09:54 25 4
gpt4 key购买 nike

假设这个 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

最佳答案

But values 4 and 3 under add are still on the stack



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

Are they not supposed to be cleared?



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

关于c - 当函数调用返回时,压入堆栈的参数会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59536518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com