第三节 存储器
存储器.mp4
存储器是用来存放程序和数据的。计算机的存储系统由内存(主存储器)和外存(辅助存储器)组成。内存设在主机内部,用来暂时存放当前运行的程序和使用的数据,其特点是存取速度快,但比外存容量小,且掉电后信息全部消失。外存设在主机外部(磁盘、光盘等),属于计算机外部设备,用来存放当前不参与运行的程序和数据。其特点是能永久存放信息,存储容量大,但存取速度较低。
本书所讲的存储器均指内存。
一、存储器的组成
存储器的基本单位是位,它能存储一位二进制数的0或1。每8位组成一个字节,每相邻的2个字节还可组成一个字,每相邻的4个字节又可组成双字,依此类推。
存储器存取的最小单位是一个字节信息,叫作一个存储单元,存储器是由若干个存储单元组成的。存储器的容量就是存储单元的个数。
为了访问不同的存储单元,每一单元都被指定一个编号,这个编号叫作该存储单元的物理地址。8086/8088 CPU有20条地址线,因此具有1MB的寻址能力(220=1MB),最低地址编号为00000H,最高地址编号为0FFFFFH,如图2-8所示。
图2-8 存储单元地址表示
对存储器的一次访问可以读写一个字节或一个字,甚至可以访问一个双字。
二、存储器的段结构
8086/8088 CPU有20条地址总线传输地址,即使用20位的物理地址编号,直接寻址范围为1MB,而CPU内部的运算器和寄存器都是16位结构,只能表示和处理16位地址,16位地址范围最大只能是64KB。为了能寻址1MB范围的存储空间,所以采用了存储器的分段技术。
所谓存储器分段技术,就是把1MB的存储空间划分成任意的一些段,每个段是一个可独立寻址的逻辑单位,其最大长度不超过64KB,这样段内的地址就可以用16位表示。每个段的起始地址叫段基址,且规定,各段的起始地址都从能被16整除的地址开始。也就是说,段基址的最低4位总是0,段基址的高16位放入段寄存器中。
在8086/8088的程序中,需要设立几个段,每个段有多少个字节以及每个段有什么用途完全由用户自己确定。每个段中存储的代码或数据,可以存放在段内任意单元中。
在程序中设置的段叫逻辑段,各个逻辑段在物理存储器中可以是邻接的、间隔的、部分重叠的和完全重叠的4种情况,如图2-9所示。所以一个物理存储单元可映像到一个或多个逻辑段中。例如图2-9中DATA_BYTE单元可映像到段2、段3和段4中。
图2-9 物理存储器中的段结构
存储器虽然可以划分成若干个段,但是在任何时刻,一个程序只能访问4个段中的内容,这4个段分别是代码段(Code Segment)、数据段(Data Segment)、堆栈段(Stack Segment)和附加段(Extra Segment)。它们分别由对应的4个段寄存器CS、DS、SS、ES指向。这4个段寄存器分别保存4个段的段基址高16位二进制数,即段基值。由4个段寄存器指向的那些段叫当前段。所以,当前段至多可容纳64KB的代码、64KB堆栈和128KB的数据(分别由DS、ES指向的当前段)。如果应用规模较大,可以在程序中通过修改相应段寄存器的内容而访问其他段。如图2-10所示,由于4个段寄存器有段B、F、I、K的段基值,所以段B、段F、段I、段K是当前段。如果程序需要访问其他段(如段J)中的数据,那么可用程序办法修改DS或ES的内容为J的段基值,改变当前段。
图2-10 存储器中的当前段
三、逻辑地址与物理地址
在8086/8088微机中,每个存储单元有两种地址:物理地址(Physical Address)和逻辑地址(Logical Address)。在1MB的存储空间中,每一个存储单元(即一个字节单元)的物理地址是唯一的,就是这个单元的地址编码。物理地址由二进制的20位组成,它的范围是00000H~FFFFFH。CPU与存储器之间的任何信息交换,都使用物理地址。
在程序设计中,使用逻辑地址而不使用物理地址,这不仅有利于程序的开发,且对存储器的动态管理也是有利的。一个逻辑地址是由段基值和偏移量两部分组成的,且都是无符号16位二进制数。表达形式为“段基值:偏移量”,如2010H:0100H,或DS:10A2H。
段基值是一个段起始单元地址(段基址)的高16位,它存放在某一个段寄存器中。偏移量(偏移地址)表示某存储单元与它所在段的段基址之间的字节距离。当偏移量为0时,就是这个段的起始单元。当偏移量为0FFFFH时,就是这个段的最后一个字节单元。由于逻辑段可以重叠,因此,同一个物理地址可以得到不同的逻辑地址。例如,两个逻辑地址2010H:1000H和2000H:1100H对应同一物理地址21100H,即它们指向同一存储单元。
由于段基值由段寄存器指出,因此,在程序中要对某个存储单元的数据进行存取时,只需要给出偏移量。程序中给出偏移量常用符号或某种寻址表达式,然后由计算机计算出偏移量。这种由计算机根据寻址表达式计算出的偏移地址叫有效地址,用EA表示。
每当CPU访问存储器时,总线接口单元BIU会把逻辑地址转换成物理地址。转换方法是:首先把逻辑地址中的段基值(在段寄存器中)左移4位,形成20位的段起始地址(段基址),然后再加上16位的偏移量,产生20位的物理地址,转换过程如图2-11所示。
图2-11 逻辑地址到物理地址的转换
四、堆栈
堆栈是用程序在内存中定义的一个段(段值由SS指示)。这个段是按照“后进先出”的规则进行数据存取的特殊存储区域,主要用于暂存数据以及在过程调用或中断处理时暂存断点信息。
堆栈是一端固定、另一端浮动的存储区。所有信息的存取都在浮动的一端进行。这个存储区最大地址的字存储单元为堆栈底部,叫栈底(Bottom)。在堆栈中存放的数据从这里开始,逐渐向地址小的方向“堆积”。在任何时刻,存放最后一个信息的存储单元(即已存放信息的最小地址单元)为堆栈顶部,叫栈顶(Top)。栈顶是随着存放信息的多少而变的,它是这个存储区的浮动“端头”,而栈底是固定不变的,它是固定“端头”,如图2-12所示。
图2-12 8086/8088堆栈构造
由于堆栈顶部是浮动的,为了指示现在堆栈中存放数据的位置,设置了一个堆栈指针SP(Stack Pointer)指向堆栈的顶部。这样,堆栈中数据的进出都由SP来“指挥”。
在堆栈中存取数据的规则是“先进后出”。就是说最先进入堆栈的数据(在栈顶底部),最后才能取出。相反,最后送入堆栈的数据(在堆栈顶部),最先取出。