码迷,mamicode.com
首页 > 其他好文 > 详细

程序存储器分段

时间:2018-04-20 23:43:06      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:一段   图片   环境   col   nbsp   这一   http   先进后出   bsp   

程序存储器分为:text,data,bss,heap,stack

text:代码段,存储汇编后程序机器语言指令,该段内执行是非线性的。text段禁用写权限。

data:存储程序运行过程中要使用的全局变量,字符串和其他常量。

bss:存储未初始化的内容。

heap:heap段的大小是可变的。heap段中的所有存储单元又配器和回收器算法管理。分配器在堆中预留一部分区域,回收器取消预留的存储器,使该区域可以被下一次预留重新使用。堆从存储器的低地址向高地址增长。

stack(先进后出):stack段的大小是可变的。stack段用作中间结果暂存器来存储断点信息。当一个程序运行时,函数将有它自己的传递变量集,并且函数的代码会在文本段(代码段)的不同存储单元内。函数调用时,程序的运行环境和EIP必须改变,堆栈存储所有被传递的变量,以及函数执行后EIP应该返回的地方。数据被存入堆栈中时成为压栈(Push),数据取出被称为出栈(POP).

 

void test_function(int a,int b,int c,int d)
{
char flag;
char buffer[10];      
}

void main()
{
    test_function(1,2,3,4);
}

这一段代码声明了一个具有4个参数的test函数。

当主函数调用时,值被压入堆栈以创建下述堆栈帧。当调用test_function()时,逆序将函数压入堆栈,函数的参数是1,2,3,4,因而随后的压栈指令压入4,3,2,1.

当汇编call执行执行时,为了将执行环境变成test_function(),返回地址被压入堆栈。这个值是紧跟在当前EIP之后的那一条指令。

紧随返回地址的是帧指针,这个值用来恢复EBP原来的值。然后,把ESP的值复制到EBP中。

技术分享图片

当函数调用时,EIP的值被修改为函数在代码段中的首地址,以执行函数。

函数执行结束时,EIP被设置为返回地址。

技术分享图片

程序存储器分段

标签:一段   图片   环境   col   nbsp   这一   http   先进后出   bsp   

原文地址:https://www.cnblogs.com/98Lucifer/p/8893743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!