ps:先做草稿,以后有时间再整理并贴图,:)

主要是利用栈底寄存器(ebp)、栈顶寄存器(esp)跟eax寄存器(存储返回值)来实现。

假设P调用Q:

P()

{

  Q(1,2);

}

(跟实际情况可能有点差异,主要还是用来了解函数调用的过程)

1.调用前准备,将Q的参数放到栈中(非push)

mov $1, (%esp)

mov $2, 4(%esp)

2.调用call 0x12345678 (Q的地址)

首先将函数的返回地址(call语句后的那条指令的地址)进栈,

然后跳到0x12345678执行Q的代码。

3.将旧的ebp进栈(用于退出Q时还原)

push %ebp

4.设置新的栈底

mov %esp, %ebp

5.为Q分配栈空间(栈是向下生长的)

sub $24, %esp    (16 * k + 8,用于对齐)

6.执行Q的相关代码。局部变量/参数是根据esp、ebp跟偏移量来进行存取的。

7.函数离开前将返回值赋值给%eax。

8.调用leave,相当于:

mov %ebp, %esp (还原栈顶)

pop %ebp (还原栈底)

9.处理返回值并接着P接着的代码继续执行。

贴多一张Linux运行时存储器映像的图

.text   代码段

.rodata   存储字符串常量

.data  存储已初始化的全局/静态变量

.bss    存储为初始化/初始化为0的全局/静态变量(在可执行文件中只占一个占位符,程序加载的时候才分配空间)

ELF文件中有.rel.text/.rel.data段,用于重定位。

C语言中函数调用过程(如何管理栈空间)的更多相关文章

  1. 从一个新手容易混淆的例子简单分析C语言中函数调用过程

    某天,王尼玛写了段C程序: #include <stdio.h> void input() { int i; ]; ; i < ; i++) { array[i] = i; } } ...

  2. 深入理解 C 语言的函数调用过程

    来源: wjlkoorey 链接:http://blog.chinaunix.net/uid-23069658-id-3981406.html 本文主要从进程栈空间的层面复习一下C语言中函数调用的具体 ...

  3. 深入理解C语言的函数调用过程

    本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解.     先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include stdio. ...

  4. c语言中函数调用的本质从汇编角度分析

    今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...

  5. 深入理解C语言的函数调用过程 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4240084.html 原文地址:深入理解C语言的函数调用过程 作者:wjlkoorey258     本文 ...

  6. C语言的函数调用过程(栈帧的创建与销毁)

    从汇编的角度解析函数调用过程 看看下面这个简单函数的调用过程: int Add(int x,int y) { ; sum = x + y; return sum; } int main () { ; ...

  7. ARM系统中函数调用过程中的参数传递-转

    在 嵌入式软件编程中,经常会用到函数调用,之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器R0传递第一个参数,R1传递到第 二个..一直到R3传递第四个参数.但是实际上有时可 ...

  8. C语言的函数调用过程

    从汇编的角度解析函数调用过程 看看下面这个简单函数的调用过程: int Add(int x,int y) { ; sum = x + y; return sum; } int main () { ; ...

  9. c函数调用过程原理及函数栈帧分析

    转载自地址:http://blog.csdn.net/zsy2020314/article/details/9429707       今天突然想分析一下函数在相互调用过程中栈帧的变化,还是想尽量以比 ...

随机推荐

  1. 使用maven进行Javadoc下载

    project -> maven -> Download Sources and Download JavaDocs

  2. AC日记——中山市选[2009]小明的游戏 bzoj 2464

    2464 思路: 最短路: 代码: #include <cstdio> #include <cstring> #include <iostream> #includ ...

  3. STL模板整理 map

    map容器: 继上一篇 ,Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能 ...

  4. 求第N个回文数 模板

    备忘. /*看到n可以取到2*10^9.说明普通方法一个个暴力计算肯定会超时的,那打表呢?打表我们要先写个打表的代码,这里不提供.打完表观察数据,我们会发现数据其实是有规律的.完全不需要暴力的把所有数 ...

  5. Nmap——主机、端口扫描工具

    nmap 其基本功能有三个,一是探测一组主机是否在线:其次是扫描主机端口,嗅探所提供的网络服务:还可以推断主机所用的操作系统 . 这是百度给的介绍:http://baike.baidu.com/lin ...

  6. java 时间格式化中的模式字母

    java日期格式化中的模式字母有特定的意义,由于没有注意,今天在做工程的时候导致出现了奇怪的日期: 错误写法如下: 然而得到了错误的结果: 正确写法如下: 这样就得到了正确的结果 mm指的是分钟,MM ...

  7. DP(悬线法)【P1169】 [ZJOI2007]棋盘制作

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p1169 棋盘制作 题目大意 给定一个01棋盘,求其中01交错的最大正方形与矩形. 解题思路: 动态规划---悬线法 以下内 ...

  8. rsync用于同步目录

    rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输.rsync中一项与其他大部分类似程序或协定中所未见的重要特性是 ...

  9. 1.3(Spring MVC学习笔记)数据绑定

    一.数据绑定介绍 用户发送过来的数据,只有传递到服务器端的参数上才会起作用. 比如用户输入的用户名和密码要和后台方法中代表用户名和密码的变量关联起来, 从而才能使用用户传递的数据进行一些操作,这样数据 ...

  10. Jquery中的ajax应用(第九章PPT)

    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1&q ...