美文网首页C语言
C语言函数调用 内存关系

C语言函数调用 内存关系

作者: carolwhite | 来源:发表于2017-06-10 17:03 被阅读138次
Screen Shot 2017-06-10 at 4.37.59 PM.png

该函数内存关系如下。


Screen Shot 2017-06-10 at 4.37.33 PM.png
大致步骤如下

1.先从右到左将b,a的值压栈,将main函数的esp栈顶确定。
2.再执行foo函数之前,先把foo函数执行完后的下一步指令,80483e9(就是函数中return 0)压栈。
3.修改程序计数器eip,然后跳转到foo函数。让ebp栈底寄存器现在指向foo函数,再将main函数栈底的值ebp(main)压栈。此刻,foo函数栈上第一个内存空间保存的是main函数的栈底值。
4.将d,c的值压栈,然后确定foo函数esp栈顶。
5.再执行bar函数之前,先把bar函数执行完后的下一步指令,80483c2(foo的返回指令,返回到main函数)压栈。
6.修改程序计数器eip,然后跳转到bar函数。
7.当bar函数返回了e值之后,会修改程序计数器eip,然后执行80483c2,返回到main函数。然后继续修改程序计数器eip,执行80483e9(return 0)。ebp和esp的值也相应变化。

《C程序设计》一书中对于函数之间调用提出两个注意点:

  • 函数运行期间调用另外一个函数,在运行被调用函数之前,系统需要先完成3件事情:
    1.将所有的实参、返回地址等信息传递给被调用函数保存
    2.为被调用函数局部变量在栈上分配内存
    3.将控制转移到被调用函数入口
  • 被调用函数返回调用函数之前,系统也需要相应的完成3件事情:
    1.在栈中保存被调用函数的计算结果(返回值)
    2.释放在栈中为被调用函数分配的数据区
    3.依照被调用函数保存的返回地址将控制转移到调用函数

相关文章

  • C语言函数调用 内存关系

    该函数内存关系如下。 大致步骤如下 1.先从右到左将b,a的值压栈,将main函数的esp栈顶确定。2.再执行fo...

  • C语言实现内存管理 (一)

    我们都知道 c 语言申请内存释放内存是 alloc / free 。直接调用函数就行,但是某些特定的场景无法调用 ...

  • [转载]C语言函数调用栈

    原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...

  • Runtime之消息发送

    调用对象的方法,在Objective-C中叫做传递消息,先来看一下C语言中的函数调用方式 C语言中的函数调用方式 ...

  • 学了指针没学动态内存一切都白搭!C语言基础教程之内存管理

    C语言内存管理 本文将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在头文件中...

  • 是否还需要在源文件中添加“extern C”?

    c++调用c语言的函数时我们一般在c语言函数声明处用extern "C"包c函数。例如: extern "C"的主...

  • cgo

    cgo cgo是用来在Go语言中调用C语言的工具 Go语言调用C语言 简单C语言函数 在Go语言中需要通过impo...

  • GoLang-逃逸分析

    参考资源一参考资源二参考资源三 对于手动管理内存的语言,比如 C/C++,调用著名的malloc和new函数可以在...

  • C++ new 和 delete 运算符

    在 C 语言中,动态分配内存用 malloc () 函数,释放内存用 free () 函数。如下所示: 在 C++...

  • iOS 理解Block的调用

    Block是C语言的扩充功能。 1.先看看C语言的函数: 直接调用: 使用函数指针调用: 将func赋值给func...

网友评论

    本文标题:C语言函数调用 内存关系

    本文链接:https://www.haomeiwen.com/subject/ecqcqxtx.html