现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

数据段、代码段、堆栈段、内存、堆、堆栈、CPU寄存器

2012-12-08 18:50 工业·编程 ⁄ 共 1381字 ⁄ 字号 评论 2 条

    学习汇编,会有很多类似标题列举的这些概念,如果对这些概念没有一个较清晰的认识,学习起来会相当的吃力。

    我也是在大学里好好学过汇编,毕业后一直没有摸过,现在,我又把书重新拾起来,再结合我从网上看到得一些文章,这里来对这些概念总结总结(在这里沃要说的是,从网上看的资料,一定要转换成自己的,不能光抄别人的,否则那永远也不会真正的属于你)。

    下面是我个人对这些概念的理解,如果有不对的地方,希望大家提出指正和批评。

   CPU在执行程序的时候,必须有指令和要处理的数据两部分组成。存放指令的地方,那就是代码段,存放数据的地方,就是内存(数据段和堆栈段)。为什么又要将存放数据的地方分为数据段和堆栈段呢?接下来会给出解释。

     我觉得这些数据段、代码段、堆栈段都是属于内存的一部分的,比如,我有一个三室的房子,这个房子就是我们所说的内存,而房子的第一间屋子,专门用来存放指令(代码段),第二间屋子,专门用来存放数据,而这个屋子有一个规则,就是只有一个门,先放进来的数据,放在屋子的最里面,这样,你要取数据,只能从离门最近的地方取,也就是先进后出的方式读取数据(堆栈段)。第三间屋子,又分为2个小室,其中一个室放最一般的数据(通常所称的“内存”),而另一间室,是专门用来给程序员定义使用的空间(堆)。

代码段:不用说,很好理解,就是放编译后的二进制执行代码的地方。

用来放malloc申请内存的地方,也用来存放全局和静态变量的地方。这里就不难理解为什么malloc申请的内存,使用完后一定要用free来释放的原因了,因为如果你不释放,随着程序的不断运行,最后可能把堆的空间给用完了,就是我们通常所说的内存泄露,不出问题才怪!!!!!

堆栈:大家都清楚函数吧,函数里的变量都是在函数结束后就消失的,那么计算机是怎么控制的呢?原来是把函数里的变量,都放在了堆栈里,函数开始时,堆栈不断分配空间来存放函数里的变量值,堆栈指针不段的向上移动,这就是进栈;而当函数结束时,堆栈又不断的回收空间,堆栈指针又不断的向下移动,很明显,函数里的变量在函数结束后,就再也不能使用了。递归函数,就是利用了堆栈的先进后出的特性,不断的调用自己,每次都将返回的值压入堆栈,而每次返回后的自身函数里,就又正好获取到这些返回值,周而复始。。。所以,递归函数也不能递归的层次太深了,否则同样会出现内存溢出的情况!!!

CPU寄存器:CPU寄存器,其实就是来控制代码段和数据段的指令及数据读取的地方,当然,CPU也有自己存放数据的地方,那就是通用寄存器里的数据寄存器,通常是EDX寄存器,C语言里有个register,就是把数据放在这个寄存器里,这样读取数据就相当的快了,因为不用去内存找,就省去了寻址和传送数据的时间开销。他还有一些寄存器是用来指示当前代码段的位置、数据段的位置、堆栈段的位置等等(注意这里存放的只是相应的代码或数据在内存中的地址,并不是实际的值,然后根据这个地址,通过地址总线和数据总线,去内存中获取相应的值),不然在执行代码的时候,指令和数据从哪取呢?呵呵。。。他里面还有标志寄存器,用来标识一些状态位,比如标识算术溢出呀等等。。。。。

延伸阅读80X86CPU寄存器介绍

    其实说简单一点,那就是:CPU+内存;CPU负责执行指令,内存负责存放指令及指令的数据等等。。。

目前有 2 条留言    访客:1 条, 博主:0 条 ,引用: 1 条

  1. 爱求索 2012年12月09日 9:01 下午  @回复  Δ1楼 回复

    内存如同一个仓库,堆栈是仓库中开辟的一个规则有序的后进先出的仓库区,而寄存器就是生产线上的一个容器。堆栈是属于内存区的一部分,而寄存器则是CPU中的一部分。

外部的引用: 1 条

  • 新手必看:80X86CPU寄存器深度整理 « 求索阁

给我留言

留言无头像?