IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 初学函数栈帧 -> 正文阅读

[C++知识库]初学函数栈帧

萌新编写,大佬勿喷

寄存器

在学习函数栈帧之前,我们要先了解寄存器.

寄存器是集成再cpu上存储数据的一小块区域,读写速度非常快用来存储指令,数据和地址.例如:ebp,esp,eax,ebx.其中ebp和esp用来维护函数栈帧

栈区

c语言中内存分配的栈区用来存储函数,随着函数的创建和销毁而使用.

栈区从高地址向低地址使用.

?图片来自大佬博客比我写的详细很多函数栈帧(详细图解)_ZHOUZH的博客-CSDN博客_函数栈帧一、栈 简单来说栈是一块由函数运行而临时占用的内存区域,其主要特点有:一个限定表尾进行删除(出栈)和插入(入栈)操作的线性表,其过程类似与压子弹与退子弹。一个由系统自动分配的内存空间。用于存储函数内部的局部变量、方法调用、函数传参数值等。由高地址向低地址生长。...https://blog.csdn.net/qq_41412237/article/details/119489211?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164110854416780271997401%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164110854416780271997401&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-119489211.pc_search_insert_es_download_v2&utm_term=%E5%87%BD%E6%95%B0%E6%A0%88%E5%B8%A7&spm=1018.2226.3001.4187

我们用一段非常简单的代码学习函数栈帧的创建和销毁的过程.

#include <stdio.h>

int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;

	c = Add(a, b);
	return 0;
}

在此之前我们要知道main函数也是要被别的函数调用的

main函数被__tmainSRTStartup函数调用

寄存器ebp维护的是栈底(栈底指针)esp维护栈顶(栈顶指针)

在main函数被调用之前ebp,esp维护的是__tmainSRTStartup函数,

?然后程序调用main函数开始执行main函数中的指令

我们转到反汇编

?

?接着创建变量进行赋值

?

????????然后开始进入函数

先将传递? 的参数压栈,再将call指令下一条指令的地址压栈

?

之后创建函数栈帧

蓝色是调整栈顶指针和栈底指针,绿色是初始化函数

?

?

?

?

????????

这是栈顶储存的是call指令下一条指令的地址?然后ret指令跳到此地址

?

?

?

?这样整个函数栈帧的流程就结束了

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 15:53:52  更:2022-01-03 15:54:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:49:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码