V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
enchilada2020
V2EX  ›  问与答

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

  •  
  •   enchilada2020 · 2020-02-04 15:42:44 +08:00 · 1029 次点击
    这是一个创建于 1756 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    EBP
    ...
    b
    a
    返回地址
    

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

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

    EBP
    ...
    ESP
    

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

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

    2 条回复    2020-02-05 13:08:42 +08:00
    classyk
        1
    classyk  
       2020-02-04 15:54:29 +08:00 via iPhone   ❤️ 1
    1 并不一定会走 EBP,只是要找一个寄存器来访问堆栈
    2 不要自己强行的定义堆栈传递参数的方式,要知道 cdecl,stdcall,fastcall 传递参数的方式也都有不同。如果是 cpp,还有 thiscall
    3 不要绑定寄存器或堆栈到函数,可能更好理解
    enchilada2020
        2
    enchilada2020  
    OP
       2020-02-05 13:08:42 +08:00 via Android
    理解了 “编译器并不为形参分配空间 而是为形参所对应的实参分配空间 形参实际上只是被调用函数使用实参时的一个名称而已”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:43 · PVG 09:43 · LAX 17:43 · JFK 20:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.