欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++/C程序内存布局及函数栈结构

程序员文章站 2022-05-22 12:41:30
...

一:系统的程序布局图:

 

 

C++/C程序内存布局及函数栈结构

 

 

 

二、详解:

程序空间:

包括.txt代码段,.data数据段, .bss段,堆段,栈段。程序的地址从低往高。堆空间增长方向从低地址往高地址增长。

栈空间从高地址往低地址方向增长。从左往右方向为单字节增长方向。

 

 

栈空间:

栈空间由一个一个函数的栈帧构成,第一帧为main函数的栈帧。第二帧是被main函数调用的函数(假设为fun)的帧,

第三帧也就是当前帧是被fun调用的函数的栈帧。

第一帧的栈顶内存单元中值:0x7FFFFFFC,黄色标记,表示是第一帧的帧起始位置地址。

第二帧的栈顶内存单元值:0x7FFFFFF8,橙色标记,表示的是第二帧的帧起始位置地址。

当前帧的帧起始位置为0x7FFFF0C,绿色标记,由于当前帧是当前函数真正运行,其栈顶由ESP寄存器的值标记,

其帧起始位置存放在EBP中。

 

函数调用:

函数调用时,进入到被调函数中时,被调函数会保护前面的栈帧。并初始化本帧。

 

push %ebp    
mov %ebp, %esp

1)第一句:

把EBP保存到栈中,也就是把前面一个栈帧的起始地址存入栈中。所以会出现前面所有栈帧的

栈顶都是存放了其自身帧起始地址(各种相同颜色的地址)。

 

2)第二句:

把esp的值存放到ebp中,此时esp指向当前函数的栈起始位置(因为刚进入函数,并未构建临时变量),

那么ebp就也指向了函数的栈帧起始位置。

 

3)所有函数调用都会重复以上步奏,那么整个程序的栈空间都是类似的结构。

 

 

注:在被保存的栈帧中,在栈顶内存单元中存放了帧起始的地址,紧接着其下,是被调用函数的返回地址,

再往下是第一个参数,再往下是第二个参数。