返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言堆栈帧的介绍与创建方式
  • 830
分享到

C语言堆栈帧的介绍与创建方式

2023-06-20 18:06:04 830人浏览 安东尼
摘要

本篇内容主要讲解“C语言堆栈帧的介绍与创建方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言堆栈帧的介绍与创建方式”吧!什么是堆栈帧?    &nb

本篇内容主要讲解“C语言堆栈帧的介绍与创建方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言堆栈帧的介绍与创建方式”吧!

什么是堆栈帧?

       堆栈帧(stack frame)是一块堆栈保留区域,用于存放被传递的实际参数,子程序的返回值、局部变量以及被保存的寄存器。

堆栈帧的创建方法?‍?【32bit windows

       (1)被传递的实际参数。如果有,则压入堆栈;

       (2)当子程序被调用时,使该子程序的返回值压入堆栈。如果使用寄存器保存返回值,则跳过此步;

       (3)子过程返回地址入栈;

       (4)子程序开始执行时,EBP被压入堆栈;

       (5)设置EBP等于ESP。从现在开始,EBP就变成了该子程序所有参数的引用基址;

       (6)如果有局部变量,修改ESP以便在堆栈中为这些变量预留空间;

       (7)如果需要保存寄存器,则将它们入栈;

我们来看一段code?

#include<stdio.h>int print_string(const char * str){//00FE18A0  push        ebp  //00FE18A1  mov         ebp,esp  //00FE18A3  sub         esp,0C0h  //00FE18A9  push        ebx  //00FE18AA  push        esi  //00FE18AB  push        edi       printf("%s\n", str);    //00FE18C1  mov         eax,dWord ptr [str]  //00FE18C4  push        eax  //00FE18C5  push        offset string "%s\n" (0FE7B30h)  //00FE18CA  call        _printf (0FE10CDh)  //00FE18CF  add         esp,8          return 1;//00FE18D2  mov         eax,1  }int main(){    char* str = "Hello World";    //00FE1865  mov         dword ptr [str],offset string "Hello World" (0FE7B34h)      print_string(str);    //00FE186C  mov         eax,dword ptr [str]  //00FE186F  push        eax //00FE1870  call        _print_string (0FE13B1h)  //00FE1875  add         esp,4      return 0;//00FE1878  xor         eax,eax  }

我们再通过一张图来解释一下:

//我们的汇编code如下print_string PROCpush ebp        // 保存基址寄存器mov ebp,esp     // 堆栈帧基址push ecxpush edx        // 保存寄存器mov eac,[ebx+8] // 取堆栈参数..pop edx         // 恢复被保存的寄存器pop ecxpop ebp         // 恢复基址指针ret             // 清除堆栈print_string ENDP

函数print_string() 对应的堆栈帧如下图?

C语言堆栈帧的介绍与创建方式

到此,相信大家对“C语言堆栈帧的介绍与创建方式”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C语言堆栈帧的介绍与创建方式

本文链接: https://lsjlt.com/news/299362.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C语言堆栈帧的介绍与创建方式
    本篇内容主要讲解“C语言堆栈帧的介绍与创建方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言堆栈帧的介绍与创建方式”吧!什么是堆栈帧?    &nb...
    99+
    2023-06-20
  • C语言堆栈帧的介绍与创建
    什么是堆栈帧?        堆栈帧(stack frame)是一块堆栈保留区域,用于存放被传递的实际参数,子程序的返回...
    99+
    2024-04-02
  • C语言函数栈帧的创建和销毁介绍
    在初学c语言中,很多时候要记的内容有点多,有时候并不能深入的了解它。关于函数的栈帧可以帮助我们深入了解函数传参的过程,让我们了解c语言。 以下是我们平时接触过,但不了解的问题: 1...
    99+
    2024-04-02
  • C语言栈的创建方式
    这篇文章主要讲解了“C语言栈的创建方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言栈的创建方式”吧!目录栈的结构定义如下:栈的初始化如下:栈元素的输入接口:完整代码如下:运行结果如下...
    99+
    2023-06-20
  • C语言函数栈帧的创建与销毁详解
    目录前言一、函数栈帧是什么?1.寄存器2.ebp与esp二、函数栈帧的创建1.代码块2.调用堆栈3.esp与ebp如何维护栈帧总结 前言 大家在学习的时候一定有以下困惑: ...
    99+
    2024-04-02
  • C++堆栈的使用方法介绍
    本篇内容介绍了“C++堆栈的使用方法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在开发这个大的领域,C++堆栈是一个不容忽视的概念,但...
    99+
    2023-06-17
  • C语言函数栈帧的创建与销毁原理图解
    目录什么是函数栈帧什么是栈?与函数栈帧有关的汇编语句函数如何创建栈帧并销毁main函数栈帧开辟调用Add函数返回主函数什么是函数栈帧 我们在写C语言代码的时候,经常会把一个独立的功能...
    99+
    2024-04-02
  • C语言函数栈帧的创建和销毁详解
    目录写在前面Add函数的调用函数传参Add函数栈帧的创建Add函数栈帧的销毁main函数栈帧的销毁总结写在前面 我们知道,每一次函数调用都需要在栈区上为其开辟一块空间,这块空间就叫做...
    99+
    2024-04-02
  • C语言函数栈帧如何创建和销毁
    这篇文章主要为大家展示了“C语言函数栈帧如何创建和销毁”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言函数栈帧如何创建和销毁”这篇文章吧。写在前面我们知道,每一次函数调用都需要在栈区上为其开...
    99+
    2023-06-29
  • 用C语言实现链式栈介绍
    目录堆栈的基本概念常见的栈有顺序栈和链式栈- 链式栈的C代码实现代码运行效果堆栈的基本概念 堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入...
    99+
    2024-04-02
  • c语言函数栈帧的创建和销毁过程详解
    目录1 相关知识介绍 1.1 寄存器1.2 函数栈帧概述2 栈帧创建与销毁过程1 相关知识介绍  1.1 寄存器 一般计算机内通用寄存器包括eax,ebx,ec...
    99+
    2024-04-02
  • C语言超详细讲解函数栈帧的创建和销毁
    目录1、本节目标2、相关寄存器3、相关汇编指令4、什么是函数栈帧5、什么是调用堆栈6、函数栈帧的创建和销毁(1)、main函数栈帧的创建与初始化(2)、main函数的核心代码(3)、...
    99+
    2024-04-02
  • C语言中函数栈帧的创建和销毁的深层分析
    目录一、本文目标二、基础知识1、寄存器2、代码案例  3、总体栈帧概况4、所需反汇编代码总览三、函数栈帧创建销毁过程1、_tmainCRTStartup函数(调用main函...
    99+
    2024-04-02
  • C语言详尽图解函数栈帧的创建和销毁实现
    目录常见寄存器基本的汇编语言知识具体实现关于栈帧创建与销毁的问答题注:本文章所使用的编译器是VS2010,由于不同编译器的函数栈帧与销毁略有差异,所以具体细节请读者自行实践! 常见寄...
    99+
    2024-04-02
  • 如何进行C语言函数栈帧的创建和销毁分析
    如何进行C语言函数栈帧的创建和销毁分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。以下是我们平时接触过,但不了解的问题:1.为什么局部变量在未赋值前是随机的。2.局部变量...
    99+
    2023-06-22
  • 深入了解C语言栈的创建
    目录栈的结构定义如下:栈的初始化如下:栈元素的输入接口:完整代码如下:运行结果如下:总结栈:是限定仅在表尾进行插入和删除操作的线性表! 栈的结构定义如下: typedef str...
    99+
    2024-04-02
  • C语言冒泡排序的方式介绍
    这篇文章主要介绍“C语言冒泡排序的方式介绍”,在日常操作中,相信很多人在C语言冒泡排序的方式介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言冒泡排序的方式介绍”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-20
  • C语言之实现栈的基础创建
    栈:是限定仅在表尾进行插入和删除操作的线性表! 栈的结构定义如下: typedef struct Stack { SLDataType *base;//栈底元素的地址 ...
    99+
    2024-04-02
  • C语言中.与->的用法介绍
    目录(一)基础(二)例子(三)总结(一)基础 结构体用点,结构体指针用箭头。 a->b 的含义是 (*a).b 。  现代的标...
    99+
    2023-05-20
    C语言中.与->的区别 C语言->用法
  • C语言深入讲解栈与堆和静态存储区的使用
    目录一、程序中的栈二、函数的调用过程三、函数调用的栈变化四、函数调用栈上的数据五、程序中的堆六、程序中的静态存储区七、小结一、程序中的栈 栈是现代计算机程序里最为重要的概念之一栈在程...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作