从c语言函数调用看程序的栈机制

  

预备知识:

①栈:计算机系统中是指一块采用栈式管理的内存区域,栈的增长方向是从高地址空间向低地址空间增长

②汇编指令call:将返回地址入栈,并跳转到被调用过程的起始处

③汇编指令ret:从栈中弹出返回地址,并跳转到这个位置

  IA32(x86)通过程序栈来支持过程调用。机器用栈来传递过程参数(函数参数)、存储返回信息、保存寄存器。为单个过程分配的那部分栈称为栈帧。下图描绘了栈帧的通用结构。栈帧的最顶端以两个指针界定,寄存器%ebp为帧指针,%esp为栈指针。%ebp指向栈帧的开始处,%esp指向栈顶元素。

时间: 2024-12-27 21:39:26

从c语言函数调用看程序的栈机制的相关文章

如果是初学C语言请看完 一些成功人士的心得

转自程先的专栏     今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了所有的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的1和0进行编码的:是他们发现了我们可以利用一个预先编写好的程序控制机器,并使之完成我们期望它完成的动作.建议大家在心里默念三遍他们的名字,以示仰慕.当然,如果让你们带着现在的知识回到他们的那个时代,那么就没有什么图灵奖了. C语言程序设计是我们的专业基础课,但是C语言本身却是

C语言函数调用约定

在C语言中,假设我们有这样的一个函数: int function(int a,int b) 调用时只要用result = function(1,2)这样的方式就可以使用这个函数.但是,当高级语言被编译成计算机可以识别的机器码时,有一个问题就凸现出来:在CPU中,计算机没有办法知道一个函数调用需要多少个.什么样的参数,也没有硬件可以保存这些参数.也就是说,计算机不知道怎么给这个函数传递参数,传递参数的工作必须由函数调用者和函数本身来协调.为此,计算机提供了一种被称为栈的数据结构来支持参数传递. 栈

[转载]如果是初学C语言请看完一些成功人士的心得

如果是初学C语言请看完一些成功人士的心得 转自程先的专栏     今天,我能够自称是一个混IT的人,并能以此谋生,将来大家能一次谋生,都要感谢两个人:克劳德.香农和约翰.冯.诺依曼,是他们发现了所有的数字化信息,不论是一段程序,一封email,一部电影都是用一连串的1和0进行编码的:是他们发现了我们可以利用一个预先编写好的程序控制机器,并使之完成我们期望它完成的动作.建议大家在心里默念三遍他们的名字,以示仰慕.当然,如果让你们带着现在的知识回到他们的那个时代,那么就没有什么图灵奖了. C语言程序

C语言函数调用栈(三)

6 调用栈实例分析 本节通过代码实例分析函数调用过程中栈帧的布局.形成和消亡. 6.1 栈帧的布局 示例代码如下: 1 //StackReg.c 2 #include <stdio.h> 3 4 //获取函数运行时寄存器%ebp和%esp的值 5 #define FETCH_SREG(_ebp, _esp) do{ 6 asm volatile( 7 "movl %%ebp, %0 \n" 8 "movl %%esp, %1 \n" 9 : "

6个变态的C语言Hello World程序——更好的理解C(2、3)

接上一篇文章,6个变态的C语言Hello World程序--更好的理解C,这篇文章给大家带来变态的Hello World程序2.3 hello2.c #include<stdio.h> main(){ int x=0,y[14],*z=&y;*(z++)=0x48;*(z++)=y[x++]+0x1D; *(z++)=y[x++]+0x07;*(z++)=y[x++]+0x00;*(z++)=y[x++]+0x03; *(z++)=y[x++]-0x43;*(z++)=y[x++]-0

6个变态的C语言Hello World程序 之 雷人的程序语言

以下的六个程序片段主要完毕这些事情: 输出Hello, World 混乱C语言的源码 以下的全部程序都能够在GCC下编译通过,仅仅有最后一个须要动用C++的编译器g++才干编程通过. hello1.c 1 2 3 4 5 6 7 8 9 10 11     #define _________ }     #define ________putchar     #define _______ main     #define _(a) ________(a);     #define ______

C语言编写cgi程序(下)

在<<C语言写cgi程序(上)>>中,我们大概知道了cgi的工作原理.今天我们看看c语言写的cgi,是怎么来处理数据的.  c语言中,通过getenv("环境变量")函数来获取页面传送给cgi的数据,一般通过printf()返回给页面一些数据. 其中C语言中的环境变量包括: HTTP-REFERER:调用该CGI程序的网页的URL.  REMOTE-HOST:调用该CGI程序的Web浏览器的机器名和域名.  REQUEST- METHOD:指的是当Web服务器传

IBM的云平台Bluemix使用初体验——创建Go语言 Web 应用程序,添加并使用语言翻译服务

概述 上篇讲了:创建PHP Web 应用程序,添加并使用语言翻译服务 通过本文学习,你将能够在IBM的云平台Bluemix上创建自己的Go语言 Web 应用程序,添加并使用语言翻译服务,发布自己的GO语言Web应用到云服务器上. 本地开发测试环境:Windows 7 x64,Go,与其它Web后端语言不同,Go语言需要自己编写Web服务器. 有关本地环境的搭建与基础学习,请参考: <Go语言入门>如何在Windows下安装Go语言编程环境 <Go语言入门>第一个Go语言程序--He

6个变态的C语言Hello World程序——更好的理解C(4、5、6)

hello4.c [cpp] view plaincopyprint? main(){int i,n[]={(((1<<1)<<(1<<1)<<(1<< 1)<<(1<<(1>>1)))+((1<<1)<<(1<<1))), (((1 <<1)<<(1<<1)<<(1<<1)<<(1<<1))