3.1存储器概述3.1.1存储器的分类1.按存储介质分类(1)半导体存储器(2)磁表面存储器(3)光存储器2.按存取方式分类(1)随机存取存储器RAM(RandomAccessMemory)①静态随机存取存储器SRAM②动态随机存取存储器DRAM(2)只读存储器ROM(ReadOnlyMemory)3.1存储器概述3.按存储器在计算机系统中的作用分类(1)主存储器(2)外存储器(3)高速缓冲存储器(4)CMOS存储器4.内存条(DRAM)(1)内存条的分类①SIMM(单列直插内存模块):分30线和72线两种。②DIMM(双列直插内存模块):分72线和168线。③RIMM(高速率直插内存模块):采用184线结构。3.1存储器概述(2)主流内存条的类型①SDRAM内存条②DDRSDRAM内存条③RDRAM内存条3.1.2存储器的主要性能指标存储器的主要性能指标包括:存储容量、存取速度、可靠性及性能价格比。3.1存储器概述3.1.3存储系统的层次结构为了解决存储容量、存取速度和价格之间的矛盾,通常把各种不同存储容量、不同存取速度的存储器,按一定的体系结构组织起来,形成一个统一整体的存储系统。由高速缓冲存储器、内存储器、外存储器构成的三级存储系统可以分为两个层次,其中高速缓冲存储器和内存间称为Cache-内存层次,内存和外存间称为内存-外存层次。三级存储系统总的效果是:存取速度接近于Cache水平,存储容量非常之大,整个价格也比较合理。其中快存主要为获取速度,使存取速度能和中央处理器的速度相匹配;辅存追求大容量,以满足对计算机的容量要求;内存则介于两者之间,要求其具有适当的容量,能容纳较多的核心软件和用户程序,还要满足系统对速度的要求。3.28086存储器结构3.2.1存储器的组织8086/8088系统的存储器空间以字节为单位储存信息。每个存储单元地址由20位二进制数组成,地址从0开始编号,依次增1,为了书写方便,用5位十六进制数表示,其物理地址范围是00000H~FFFFFH,且地址码为无符号数。存储器的容量是指存储器所具有的字节数,通常以210=1024B为基本单位,称为1KB。为了表示更大的容量,也使用MB(兆字节),GB(吉字节)等为单位,其中:1KB=210B=1024B1MB=220B=1024KB1GB=230B=1024MB存储器的内容物理地址:取指令:物理地址=CS*24+IP取OP数:物理地址=DS(ES)*24+偏移量堆栈OP:物理地址=SS*24+SP逻辑地址与物理地址逻辑地址:段地址:偏移地址如:DS:DAT1返回本章首页计算机中信息的单位二进制位Bit:存储一位二进制数:0或1字节Byte:8个二进制位,D7~D0字Word:16位,2个字节,D15~D0双字DWord:32位,4个字节,D31~D0最低有效位LSB:数据的最低位,D0位最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31位数据的存储格式D7D000000H78H00001H56H00002H12H00003H34H00004H00005H00006H低地址D7D0字节D15D0字D31D0双字每个存储单元都有一个编号;被称为存储器地址每个存储单元存放一个字节的内容0002H单元存放有一个数据34H表达为[0002H]=34H多字节数据存放方式多字节数据在存储器中占连续的多个存储单元:存放时,低字节存入低地址,高字节存入高地址;表达时,用它的低地址表示多字节数据占据的地址空间。图2.3中2号“字”单元的内容为:[0002H]=1234H2号“双字”单元的内容为:[0002H]=78561234H80x86处理器采用“低对低、高对高”的存储形式,被称为“小端方式LittleEndian”。相对应还存在“大端方式BigEndian”。3.28086存储器结构计算机通过存储单元的地址来访问其内容的。8086/8088CPU是16位的微处理器,访问时既可以按字节来操作,也可以按字来处理。一个字(即16位)占据连续的两个存储单元。若将一个字存入存储器,需要遵循“小端方式”的规则,即:①一个字占据两个相邻的存储单元。②低位字节存入低地址,高位字节存入高地址。③字的地址由低字节地址来表示,如字3456H的地址号为20000H。同样,将一个双字存入存储器时,也需要遵循“小端方式”的规则3.28086存储器结构3.2.2存储器分段和物理地址的形成1.分段方法存储器是计算机的重要组成部分,当要访问某个存储单元时,首先必须获得该单元的物理地址。于8086地址总线为20条,可寻址的最大内存空间为220(1M)字节,其物理地址范围是00000H~FFFFFH。在8086中,CPU内部寄存器都是16位,直接寻址能力为216(64KB),地址范围是0000H~FFFFH。8086/8088又把1MB的存储空间划分成若干个逻辑段,逻辑地址由段基址和偏移地址两部分组成。段的起始单元地址叫做段基地址(简称段基址),它为16的整数倍。段基址存放于段寄存器CS,DS,SS,ES中。每个逻辑段有相应的逻辑地址LA(LogicalAddress),表示为:逻辑地址(LA)=段地址:偏移地址(EA)。存储器的分段管理8086CPU有20条地址线最大可寻址空间为220=1MB物理地址范围从00000H~FFFFFH8086CPU将1MB空间分成许多逻辑段(Segment)每个段最大限制为64KB段地址的低4位为0000B这样,一个存储单元除具有一个唯一的物理地址外,还具有多个逻辑地址物理地址和逻辑地址对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH。分段后在用户编程时,采用逻辑地址,形式为段基地址:段内偏移地址逻辑地址段地址说明逻辑段在主存中的起始位置8086规定段地址必须是模16地址:xxxx0H省略低4位0000B,段地址就可以用16位数据表示,就能用16位段寄存器表达段地址偏移地址说明主存单元距离段起始位置的偏移量每段不超过64KB,偏移地址也可用16位数据表示物理地址和逻辑地址的转换将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址一个物理地址可以有多个逻辑地址逻辑地址1460:100、1380:F00物理地址14700H14700H14600H+100H14700H13800H+F00H14700H段地址左移4位加上偏移地址得到物理地址段寄存器和逻辑段8086有4个16位段寄存器CS(代码段)指明代码段的起始地址SS(堆栈段)指明堆栈段的起始地址DS(数据段)指明数据段的起始地址ES(附加段)指明附加段的起始地址每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途3.28086存储器结构2.物理地址的计算8086/8088CPU中有一个地址加法器,它将段寄存器提供的段地址自动乘以10H(即左移4位),然后与16位的偏移地址相加,并锁存在物理地址锁存器中,如图3.3所示。如逻辑地址0001H:0010H生成物理地址时,将段地址0001H左移4位为00010H,再与偏移地址0010H相加即可得到物理地址00020H。20位的物理地址由16位段地址和16位偏移地址合成。3.28086存储器结构物理地址的计算方法如下:物理地址(PA)=段地址×10H+偏移地址(EA)也就是说,将段地址左移4位再加上偏移地址就形成物理地址。说明:图3.3①存储器中的存储单元地址可以使用20位的物理地址表示,也可以使用逻辑地址表示,即使用“段地址:偏移地址”的方式表示。逻辑地址是在程序中使用的,物理地址是由系统转换自动生成的。②每个内存单元具有惟一的物理地址,但可以使用不同的逻辑地址来描述,例如0001H:0010H对应唯一的物理地址00020H,但该物理地址又可以由逻辑地址0002:0000H,等来描述。③除非专门指定,一般情况下,各段在存储器中的分配由操作系统负责。④段的大小由程序决定,因为使用16位偏移地址,所以每个段不能超过64KB,当然也不一定必须等于64KB。16位段地址存放在某个段寄存器中。3.28086存储器结构[例3.2.3]:计算下列逻辑地址对应的物理地址。①2017:000AH②2010:007AH③2410:0031H分析:逻辑地址是以“段地址:偏移地址”的形式表达存储器地址的,而物理地址由如下公式计算得出:物理地址(PA)=段地址×16+偏移地址(EA)解:①物理地址(PA)=2017H×10H+000AH=2017AH②物理地址(PA)=2010H×10H+007AH=2017AH③物理地址(PA)=2410H×10H+0021H=24121H.3.28086存储器结构3.段的种类8086/088采用分段内存管理机制,允许程序员将程序划分为相对独立的多个段,这些段各有各的用途。8086/8088主要包括下列4种类型的段:①代码段用来存放正在运行的程序的指令序列。②数据段用来存放当前运行程序所用到的数据。③堆栈段定义作为堆栈使用的内存区域。堆栈是一种数据结构,它开辟了一个以‘后进先出’方式访问的存储区。④附加段是附加的数据段,它是一个辅助的数据区。例如:取指令时(CS)=2000H,(IP)=3500H,则被取指令的物理地址=(CS)×10H+(IP)=20000H+3500H=23500H。又如:取数时(DS)=1000H,段内偏移地址=1000H,则被取数据的物理地址=(DS)×10H+1000H=10000H+1000H=11000H。3.28086存储器结构3.2.3堆栈和堆栈操作1.堆栈的概念堆栈是在存储器中开辟的一个特殊的存储区域,该区域的一端固定(称为固定端),另一端活动(称为活动端),且只允许数据从活动端进出。堆栈中数据的存取也遵循“先进后出”的原则。我们把堆栈的活动端称为栈顶,固定端称为栈底。堆栈是按‘先进后出’的原则在内存中组织的。8086/8088的堆栈的伸展方向是从高地址向低地址。8086/8088的堆栈操作都是字操作。将一个数据压入堆栈称为进栈,进栈时SP自动减2,进栈的字就存放在新增加的两个单元内。把一个数从栈顶弹出称为出栈,出栈时SP自动加2,弹出的字是SP让出的两个单元的内容.3.28086存储器结构2.堆栈操作它可分为两类操作,分别为进栈和出栈。进栈时是从高地址到低地址,出栈时是从低地址到高地址。进栈操作指令为PUSH,出栈操作为POP,后面章节会详细介绍。(1)进栈把一个数据压入堆栈,称为进栈。将一个数据压入堆栈的过程是:SP先自动减2,指出新的栈顶,然后再将数据入栈。[例3.2.5]:设AX=1234H,SS=1000H,SP=0040H,将寄存器AX的内容压入堆栈。首先SP-1,将高字节数据12H压入1000FH单元,然后SP再减1,将低字节数据34H压入1000EH单元,操作后SP=100EH。3.28086存储器结构(2)出栈将一个数据从栈中弹出,称为出栈。弹出的过程是:将数据从栈顶弹出送相应的寄存器单元,再将SP加2,指示新的栈顶。[例3.2.6]:将堆栈中字单元数据从堆栈中弹出送寄存器AX中。首先从1000EH单元弹出低字节数据34H到AL,把SP加1指向当前栈顶;然后从1000FH单元弹出高字节数据12H到AH中,再把SP加1指向新的栈顶,操作后SP=10040H。栈的位置由堆栈段寄存器SS和堆栈指示器SP规定。SS负责给出当前堆栈段的基址,SP指示当前堆栈段的栈顶的偏移地址。注意这里的基址,是指SS的内容,而非堆栈的栈底。8086规定:堆栈的操作数字长是16位.3.28086存储器结构3.2.4特殊的内存区域8088/8086系统中,有些内存区域的作用是固定的,用户不能随便使用,如:中断矢量区:0