KMpAn8Obw1QhPoEP
V2EX  ›  问与答

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

  •  
  •   KMpAn8Obw1QhPoEP · Feb 4, 2020 · 1391 views
    This topic created in 2301 days ago, the information mentioned may be changed or developed.

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

    [前提] 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 replies    2020-02-05 13:08:42 +08:00
    classyk
        1
    classyk  
       Feb 4, 2020 via iPhone   ❤️ 1
    1 并不一定会走 EBP,只是要找一个寄存器来访问堆栈
    2 不要自己强行的定义堆栈传递参数的方式,要知道 cdecl,stdcall,fastcall 传递参数的方式也都有不同。如果是 cpp,还有 thiscall
    3 不要绑定寄存器或堆栈到函数,可能更好理解
    KMpAn8Obw1QhPoEP
        2
    KMpAn8Obw1QhPoEP  
    OP
       Feb 5, 2020 via Android
    理解了 “编译器并不为形参分配空间 而是为形参所对应的实参分配空间 形参实际上只是被调用函数使用实参时的一个名称而已”
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2792 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 15:21 · PVG 23:21 · LAX 08:21 · JFK 11:21
    ♥ Do have faith in what you're doing.