函数栈帧的创建和销毁(上)

简介: 函数栈帧的创建和销毁

基础知识介绍和引入

//不同的编译器下,函数调用过程中栈帧的创建是略有差异的

栈区下面是高地址,上面是低地址;

在调用时,栈区是从高地址向低地址使用的

//

寄存器:集成到CPU上

ebp、esp这两个寄存器中存放的是地址

这两个地址是用来维护函数栈帧的

调用哪个函数就维护哪个栈帧

每一个函数调用,都要在栈区创建一个空间,称这块空间为函数的函数栈帧

ebp存了这块空间的高地址,称ebp为栈低指针

esp存了这块空间的低地址,称esp为栈顶地址

在VS2013中,main函数也是被其他函数调用的

//push:压栈:在栈顶放一个元素

//pop:出栈:从栈顶删除一个元素

引入:

代码

1.

为main函数创建空间

push         ebp:压栈

在栈顶部放一个值ebp

然后esp向上移动一位

mov         ebp,esp

mov         a,b:

把后面b的值赋给前面的a

sub         esp,0E4h

把esp减去十六进制的0E4h

esp地址变小,指向上面

紫色部分就是为main函数预开辟的空间

lea         edi ,[ebp-0E4h]

load effective address:

加载有效地址

[ebp-0E4h]这个地址放入edi中

lea         edi ,[ebp-0E4h]

mov       ecx,39h

mov       eax,0CCCCCCCCh

rep         stos dword ptr es:[edi]

word占两个字节,dword:double word占四个字节

rep         stos dword ptr es:[edi]

意思是:把从edi 向下到 39h之前的所有地址的编号改为0CCCCCCCCh

2.

创建局部变量

int a = 10;

mov         dword ptr [ebp-8],0Ah

0Ah赋给[ebp-8]

//此处的8单位是字节

已知:一个地址占四个字节

[ebp-8]就是ebp向上两个地址的位置

//

如果不初始化a,那么在[ebp-8]这块空间存储的就是0CCCCCCCCh

这也就是为什么有时候在打印时会打印出随机值或者烫

int b = 20;

mov         dword ptr [ebp-14h],14h

int c = 0;

mov         dword ptr [ebp-20h],0

相关文章
|
6月前
|
编译器
函数栈帧的创建和销毁
函数栈帧的创建和销毁
32 0
|
7月前
|
存储 编译器 容器
函数栈帧的创建和销毁讲解
函数栈帧的创建和销毁讲解
42 0
|
7月前
|
编译器 容器
关于函数栈帧的创建和销毁
关于函数栈帧的创建和销毁
|
存储
函数栈帧的创建和销毁(下)
函数栈帧的创建和销毁(下)
54 0
|
7月前
|
容器
函数栈帧的创建和销毁介绍
函数栈帧的创建和销毁介绍
41 0
|
7月前
|
存储 编译器
初识函数栈帧的创建与销毁(笔记)
初识函数栈帧的创建与销毁(笔记)
|
编译器 程序员 C语言
函数栈帧的创建与销毁(超详解)
函数栈帧的创建与销毁(超详解)
107 0
|
存储 缓存 编译器
函数栈帧的创建与销毁
函数栈帧的创建与销毁
41 0
|
存储 C语言 C++
你知道函数栈帧的创建和销毁吗?
你知道函数栈帧的创建和销毁吗?
76 0
|
存储 编译器 C++
深入理解内存 —— 函数栈帧的创建与销毁
深入理解内存 —— 函数栈帧的创建与销毁
125 0