问一个暴露基本功的问题:关于 C 语言函数调用的底层细节

2020-02-04 15:42:44 +08:00
 enchilada2020

菜鸡目前在补基本功 问题描述如下:

[前提] IA-32 指令系统 忽略类型

[问题] 假设 函数f() 调用 函数g(a, b) 那么实际上在内存中的栈结构为

EBP
...
b
a
返回地址

至此为止都是 函数f() 的栈帧

接着是 函数g(a, b) 的栈帧

EBP
...
ESP

那么问题来了。。。是不是可以理解为「函数g(a, b) 的入口参数a, b的内存空间是在 函数f() 中分配的」 换言之 「a, b 保存在 函数f() 的栈帧中」?

已经彻底蒙圈 欢迎指教解惑 在此先谢过各位啦

985 次点击
所在节点    问与答
2 条回复
classyk
2020-02-04 15:54:29 +08:00
1 并不一定会走 EBP,只是要找一个寄存器来访问堆栈
2 不要自己强行的定义堆栈传递参数的方式,要知道 cdecl,stdcall,fastcall 传递参数的方式也都有不同。如果是 cpp,还有 thiscall
3 不要绑定寄存器或堆栈到函数,可能更好理解
enchilada2020
2020-02-05 13:08:42 +08:00
理解了 “编译器并不为形参分配空间 而是为形参所对应的实参分配空间 形参实际上只是被调用函数使用实参时的一个名称而已”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/642089

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX