学汇编有些时间了,最近在看32位的,但是看到一般 发现 对某些概念越来越模糊了。
比如 段 这个东西, 哪位大神 能谈一谈这个段 包括16位和32位
包括清晰的概念,如何分配的 等等等等
还有 内存,始终无法再脑袋中建立一个清晰的内存的影响, 哪位大大能够谈谈! 小弟先谢谢了
我自己很模糊,所以也不知道怎么去问直接的问题, 我感觉我提的几个问题 太空了 额呵呵
------解决方案--------------------------------------------------------
段在现代操作系统中意义不是很重要了,你不如仔细研究一下分页机制而不是分段机制。
------解决方案--------------------------------------------------------
16位下:内存本身并没有分段,段的划分来自CPU,由于8086CPU采用段地址×16+偏移地址=物理地址给出内存单元的物理地址,因此可以用分段的方式管理内存。段地址×16必然是16的倍数,因此一个段的起始地址也一定是16的倍数,而偏移地址是16位,所以段的长度最大为64KB。
段地址存放在8086CPU的段寄存器中,这4个寄存器分别是CS、DS、SS、ES
32位下:有实地址模式和保护模式之分
实地址模式,可以寻址1M的内存,范围从0到FFFFF。由于8086只有16位的寄存器,因此,为了存放20位的地址,将内存划分成64K大小的被称为段的单位。
20位的内存地址=16位的段基地址×16+偏移地址
一个典型的程序有三个段:代码段、数据段和堆栈段。三个段寄存器CS、DS和SS包含着代码段、数据段和堆栈段的基地址。
保护模式,在保护模式中,每个程序可以寻址最大达4G的内存,地址从0到FFFFFFFF。在保护模式下,段寄存器(CS、DS、SS、ES、FS和GS)指向操作系统用于定义段位置的段描述符表。
CS引用描述符表中的代码段描述符,DS引用描述符表中数据段描述符,SS引用描述符表中的堆栈段描述符。
平坦分段模式,在该模式下,所有的段被映射到计算机的整个32位地址空间中。你必须至少定义两个段,一个用于存放程序代码而另外一个存放程序的数据。每个段都有一个段描述符定义,段描述符是要给存放在全局描述符表(GDT)中的一个64位的值。
------解决方案--------------------------------------------------------
如果你是在32位Windows里面编程的的话,就不用考虑段了,你的程序能用也只能用几个固定的段,你自己不能改变段寄存器,改变段寄存器的值在保护模式里好像是特权指令,反正是不能执行
如果是写操作系统的话,就必须详细了解了,推荐一本书<自己动手写操作系统>,我想你如果常在这个论坛混的话应该对这个书名很熟了,说实话对我来说不是那么容易懂的,我看那本书的时候找回刚学汇编的时候的那种感觉了
另外32位中的段虽然还叫段,但其本质已经有改变了,16位下的段只是为了在寄存器位数不够的情况下合成物理地址,除此之外没有任何用处.但在32位的保护模式下,段已经是个不可或缺的概念了,保护模式的"保护"二字和段有非常大的联系,具体是如何联系的还是看书吧,想详细了解必须看书,想通过几句话就明白保护模式是不可能的,你看楼上的东西明白保护模式了么?
对于一个程序员,关于内存只需要知道它可以通过地址来读写就行了,再深入就涉及到硬件了,不过如果你有兴趣的话不妨看看,不过你很可能会越学问题越多,比如你花几个星期的时间把内存相关的电路看明白了,肯定会觉得不过瘾,然后下个星期又去看硬盘的电路,如果你在电子方面有基础的话,你可以这么干,说不定你还有可能成为设计硬件的专家呢,不过...(此处省略XXX字)
我没复制粘贴
------解决方案--------------------------------------------------------
段这个词一般用在两个地方:
1,在保护模式下内存寻址时。
段由段描述符确定,由新增加的寄存器gdtr,idtr,ldtr和tr确定段描述符的位置。每个段描述符占用8字节,用来段的基地址,段长和段的保护属性。这里的段基址是在线性空间中的地址。讲内存时再谈。这些知识你可参考保护模式的相关书籍。
2,在汇编语言中。
比如代码段,堆栈段,未初始化数据段,初始化数据段。严格来说这里的段应该称为节,即代码节,堆栈节,未初始化数据节,初始化数据节。在大多数操作系统中(包括windows和linux),进程的数据段和代码段是完全重合在一起的。也就是说,进程的代码段和数据段在线性地址空间和物理地址空间中是一样的区域。“节”就是对这一区域中再次划分。“节”的划分由编译器和链接器完成,表现为某一目标文件格式,常见的有PE,coff,elf等等。运行这一文件时,由操作系统的加载器提取"节"信息,然后把代码和数据加载到段中相应区域中。建议参考书《链接器和加载器》。
内存的概念
内存地址是物理地址空间的一部分。在保护模式下地址空间分为逻辑地址空间(段选择符+地址),线性地址空间和物理地址空间。逻辑地址空间由段选择符和地址组成,如cs:ip。逻辑地址经段转换为线性地址。在不分页的情况下就是物理地址,即由32位地址线构成。如果分页,线性地址还应经分页机制才能转化为物理地址。
内存地址只占物理地址空间的一部分,一般为0--内存大小的范围,而在物理地址高端(4GB附近)属于BIOS,另外显存还占用物理地址空间的一部分。
------解决方案--------------------------------------------------------
个人愚见:
段其实是一段内存区域,在汇编中,有代码段、数据段、和堆栈段,代码段存放程序的指令,数据段则用于存放程序所用的数据,比如说一个数组。建议楼主看一下汇编程序的结构。
如果lz有兴趣,可以点击这个链接:http://blog.csdn.net/w_shun/archive/2010/04/25/5527724.aspx