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语言函数栈帧的创建和销毁 -> 正文阅读

[C++知识库]c语言函数栈帧的创建和销毁

在学习C语言时,我们难免有许多疑问
(1)局部变量是怎么创建的?
(2)为什么局部变量的值是随机的?
(3)函数是怎么传参的?传参的顺序如何?
(4)形参和实参是什么关系?
(5)函数调用是怎么做的?
(6)函数调用结束后是怎么返回的?

接下来带你学习函数栈帧。

在vs底下各个版本略有差异,而今天带你学习的是vs2013

寄存器

一般计算机内通用寄存器包括eax,ebx,ecx,edx,esi,edi,esp,edp,其中esp,ebp这两个寄存器是用来存放地址的,这两个地址就是用来维护函数栈帧的

函数栈帧介绍

写一个简单的代码来详细介绍

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);

    printf("%d", c);
    return 0;
}

每一个函数调用,都要在栈区创建一个空间

而esp和ebp是来维护函数栈帧的

esp:栈顶指针

ebp:栈底指针

调试:

mainCRTStartup 函数调用 _tmainCRTStartup函数,

__tmainCRTStartup 函数调用 main 函数。

?

右击鼠标可以看到反汇编,就可以看到C语言的汇编代码:

push 压栈:给栈顶放上一个元素
pop 出栈:从栈顶删除一个元素

?首先给__tmainCRTStartup开辟一块内存空间?

然后mov,把espebpsubesp 减去0E4h,而这块空间就是给mian函数开辟的空间。

?

?


接下来push压栈? ? ebxesiedi

然后leaload effective address(加载的意思)。把ebp-0E4h地址给edi

然后mov,把39hecx,然后把ecx改成0CCCCCCCCh

rep stos39hdword(4个字节)全部初始化0CCCCCCCCh

?

?


到 int a=10;就是把0Ah(10的十六进制就是a)放到[ebp-8]

int b=20;把14h放到[ebp-14h]

int c=0;把0放到[ebp-20h]

?

?


Add(a,b);

mov,把[ebp-14h](就是10)给eax。然后push(压栈)eax。

mov,把[ebp-8](就是20)给ecx。然后push(压栈)ecx。

call指令调用函数(call指令的下一条指令进行压栈(记住),等调用完函数就会回来找到这个地址)

?


int Add(int x,int y);

为Add函数准备

?

?


z=x+y;

mov,把[ebp+8]给eax(值是10,前面已经传过来了)。

add,把[ebp+0Ch]的值(20)加给eax。

mov,把eax的值给[ebp-8](z)。

?

从而可以知道形参根本不是函数内部创建的,而是call指令回来找到push的eax和ecx。

所以形参是实参的一份临时拷贝。


return z;

[ebp-8]给eax寄存器,最后把edi,esi,ebx? pop(弹出)。

空间回收,把ebp给esp。pop(弹出)? ?ebp

?


ret

结束找回call指令的下一条指令,然后[esp+8]指向edi,形参销毁。eax给[ebp-20h](c)

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:11:24  更:2021-08-17 15:12:35 
 
开发: 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年5日历 -2024/5/20 1:06:02-

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