C++/C程序内存布局及函数栈结构
程序员文章站
2022-05-22 12:41:30
...
一:系统的程序布局图:
二、详解:
程序空间:
包括.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)所有函数调用都会重复以上步奏,那么整个程序的栈空间都是类似的结构。
注:在被保存的栈帧中,在栈顶内存单元中存放了帧起始的地址,紧接着其下,是被调用函数的返回地址,
再往下是第一个参数,再往下是第二个参数。