第3章 存储器的分段_第1页
第3章 存储器的分段_第2页
第3章 存储器的分段_第3页
第3章 存储器的分段_第4页
第3章 存储器的分段_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本章要求教学重点及难点:物理地址计算1.了解存储器地址和内容的概念;2.了解存储器地址分段的方式;3.掌握逻辑地址和物理地址的概念及计算方式;4.了解堆栈的概念及外部设备。计划学时:2学时第3章存储器的分段

3.1存储单元的地址和内容基本概念:

计算机存储信息的基本单位是位(Bit),一位可存储一个二进制数。每8个位组成一个字节。

存储器存储信息的基本单位是字节(Byte),由8个二进制位组成。位编号如下:

在存储器中,每一个字节单元都有一个与之对应的、唯一的存储器地址。称为物理地址。对于16位字长的PC机(8086/8088),由两个字节组成一个字(Word)。其位编号如下:

01234567

0123456789101112131415高位字节MSB低位字节LSB地址的定义每一个字节单元都有一个与之对应的单元地址。对于字单元,由两个字节单元组成,其地址是采用低位字节地址来表示的。对于多字单元(双字,4字等),其地址同样是采用最低位字节地址来表示的。地址范围:不同机器,其可以访问的物理地址范围是不同的,一般由系统的地址总线宽度决定。例如:8086的地址总线为20位,其地址访问范围是:0H---0FFFFFH。而PentiumII的地址总线为36位,则地址范围是:0H---0FFFFFFFFFH。存储单元的内容定义:存储单元中存放的信息称为该存储单元的内容表示:存储地址加”()”如果用X表示某存储单元的地址,则X单元的内容可以表示为(X);假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))来表示Y单元的内容。

34H12H…1EH2FH字节0000H0001H0002H0003H0004H0005H0006H1234H1235H0004H字节单元的内容:(0004H)=34H0004H字单元的内容:(0004H)=1234H0004H字单元的内容为1234H,表示为:

(0004H)=1234H0004H字节单元存放的信息为34H,表示:(0004H)=34H

字单元由两个字节单元组成,其地址采用它的低地址来表示。字存入存储器:低位字节存入低地址单元,高位字节存入高地址单元。假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))来表示Y单元的内容。

34H12H…1EH2FH字节0000H0001H0002H0003H0004H0005H0006H1234H1235H直接表示1234H字单元的内容:

S=(1234H)=2F1EH直接给出S的单元地址,(1234H)=2F1EH例如,1234H字单元的内容为S,有两种表示方式:间接表示1234H字单元的内容:

S=((0004H))=(1234H)=

2F1EHS的单元地址存放在0004H字单元中,(0004H)=1234H从0004H字单元中取出S的单元地址,再把S的内容读出来:((0004H))=2F1EH

8086/8088CPU有20根地址总线A19A18…A1A0,可以访问存储器的最大容量为:220B=1024KB=1MB,在8086CPU中所有可用来存放地址的寄存器都是16位的。3.2存储器地址的分段

在IBMPC机里采用了存储器地址分段的办法。把1MB的存储空间划分成若干个段(Segment),每个段可由1~64KB(即65536B)个连续的字节单元组成。每个段是一个可独立寻址的逻辑单位。在8086/8088的程序设计中,需要设立几个段,每个段有多少个字节以及每个段的用途完全由用户自己确定。同时每个段中存储的代码或数据,可以存放在段内任意单元中。

那么在16位字长的机器里,用什么办法来提供20位地址呢?分段的基本规则

在编制程序时,要把存储器划分成段,每个段最大可达64KB,这样段内地址可以用16位表示。

PC机对段的起始地址有限制,段不能起始于任意地址,而必须从任一小段(Paragraph)的首地址开始。机器规定:从0地址开始,每16个字节为一小段。00000,00001,00002,……,0000E,0000F;00010,00011,00012,……,0001E,0001F;00020,00021,00022,……,0002E,0002F;在十六进制表示的地址中,最低位为0(即20位地址的低4位为0)。

虽然存储器可以划分成若干个段,但在任何时刻,一个程序只能访问4个段中的内容,这4个段分别是代码段(CodeSegment),堆栈段(StackSegment),数据段(DataSegment)和附加段(ExtraSegment)。它们的段首地址的段基值分别由对应的4个段寄存器CS,SS,DS,ES指明。它们分别保存各自段首地址的高16位值(A19~A4),由4个段寄存器指向的那些段叫当前段(CurrentSegment)。所以当前段至多可容纳64KB的程序代码,64KB的堆栈和128KB的数据(分别由DS、ES指向的当前段)在规模不是很大的应用程序中,这些容量是足够使用。如果应用规模较大,可以在程序中通过修改相应段寄存器的内容,从而访问其他段,如可用LDS,LES指令等方式来改变当前段。

CPU访问主存必须传送出物理地址,而用户编程则使用逻辑地址,于是在8086/8088系列微型机中,每个存储单元都有两种形式的地址:物理地址(PhsysicalAddress)和逻辑地址(LogicalAddress)以及CPU内如何把程序员使用的逻辑地址形成物理地址(真实地址)的问题。每一个存储单元的物理地址是唯一的,就是这个单元的地址编码。CPU与存储器之间的任何信息交换,都必须使用20位的物理地址先行,经地址译码器后形成开门信号,把被访问的存储单元的“门”打开,方能进行数据交换。在程序设计中,程序员使用的是逻辑地址,而不使用物理地址,这不仅有利于程序的开发,且对存储器的动态管理也是有利的。一个逻辑地址是由段基值和偏移量(OFFSET)两部分组成,而且都是无符号的16位二进制数。3.3逻辑地址与物理地址段基值是一个段首地址的高16位,它存放在某一个16位段寄存器中。段首址的低4位为0,即A3A2A1A0=0000。偏移量表示了某存储单元与它所对应的段的段首地址之间的字节距离。如当偏移量为‘0’时,就在这个段的起始单元,当偏移量为0FFFFH时,就是这个段(最大)最末一个字节单元。每当CPU访问存储器时,总线接口部件BIU便把逻辑地址转换成物理地址。

转换方法是:首先把逻辑地址中的段寄存器保存的段基值左移4位(把段寄存器的内容乘以16),其本质是恢复A3A2A1A0的四位二进制的0或一位16进制的0,使之形成一个完整的段首地址。这也就是为什么段首址要从小段的首地址开始的原因。形成了20位的段起始地址(段基址)之后,再加上16位的无符号偏移量,即产生了CPU访问主存单元的20位物理地址,从地址总线输出。物理地址的计算计算公式:

物理地址=段地址×10H+偏移地址每个存储单元只有唯一的物理地址,但它却可以由不同的段地址和不同的偏移地址组成。

16位段地址15016位偏移地址150+20位物理地址190【例】

:计算下列存储单元的物理地址:(1)2000:3000;(2)2100:2000;(3)2280:0800;(4)2250:0500;【解】:(1)物理地址=2000H×10H+3000H=23000H;(2)物理地址=2100H×10H+2000H=23000H;(3)物理地址=2280H×10H+0800H=23000H;(4)物理地址=2250H×10H+0500H=22A00H;

每个段寄存器可以按规定给出一个段的起始地址的段基值,每个段都有各自的用途。如前所述,代码段存放的是要运行的程序及数据。数据段存放运行程序所用的数据,如果在程序中使用了串操作处理指令,则其源操作数默认存放在数据段中(源串可允许段超越)。堆栈段定义了堆栈的所在区域,堆栈是一个数据结构,它开辟了一个比较特殊的存储区,并以“后进先出”的原则访问这一区域。附加段是附加的数据段,它是一个辅助的数据区,对于串处理指令,它是目的串操作数存放的区域,它不允许进行段跨越。当用户在编制程序时,应该按照上述规定把程序的各部分放在规定的区段之中。除非专门指定,如用户自行设定之外,在一般情况下,各段在存储器中的分配是由操作系统负责的。每个段可以独立地占用64KB存储区。各段也允许部分重叠或完全重叠,下面的例子可以说明这种情况。

【例】如果代码段中的程序占有16KB(4000H)存储区,数据段占有2KB(800H)存储区,堆栈段占有1KB存储区。代码段的区域本可以为01000H~10FFFH(64KB),由于程序区只需要16KB,所以程序区结束后的第一个小段的首地址就作为数据段的起始地址(05000H)。而数据段仅需2KB,则数据段结束后的第一个小段的首地址又成为堆栈段的起始地址(05800H)。这样,代码段和数据段及堆栈段重叠在一起了。

注意:每个存储单元的内容是绝对不允许发生冲突的,也就是说,某个存储单元既存储了指令代码,又将存储操作的数据,这是绝对禁止的。这里所提到的重叠只是指每个区段的大小可允许根据编程的实际情况分配,并非一定要占用64KB的最大段空间。物理地址01000H10FFFH代码段代码段实际使用16KB04FFFH数据段05000H057FFH数据段实际使用2KB堆栈段05800H【例】:已知(CS)=1000H,(DS)=4000H,其中代码段大小为1KB,数据段大小为64KB,试画出对应储存器分段的示意图,要求标出首尾地址。【分析】:

对于代码段,由题意,大小为1KB,即对应的偏移地址为:0H---3FFH,且CS为1000H,则对应的物理地址为:

10000H---103FFH对于数据段,由题意,大小为64KB,即对应的偏移地址为:0H---FFFFH,且DS为4000H,则对应的物理地址为:

40000H---4FFFFH1000HCS4000HDSSSES代码段数据段10000H103FFH40000H4FFFFH4000:00004000:FFFF

堆栈是一个特定的存储区,在这个存储区中信息的进出严格按照一定的规则进行。堆栈主要用于暂存数据以及在“过程”调用或处理中断时暂存断点信息。不仅在现代程序设计中经常使用堆栈,在其他一些领域(如编译技术)中亦广泛地应用堆栈的概念。

堆栈的结构现在常采用软件堆栈,由编程人员用软件在存储器中划出一块存储区作为堆栈。该存储区的一端是固定的,另一端是浮动的,所有信息的存取都在浮动的一端进行,这是进栈与出栈操作的特点。浮动端的地址生长方向一般有两种方法:一为向高地址方向生长称为向上生长,另一种为向低地址方向生长,即为向下生长。8086/8088系列微机属于向下生长的堆栈。3.4堆栈

这个存储区最大地址的字存储单元为堆栈底部,称为栈底(Bottom)。在堆栈中存放的数据或断点信息从这里开始,逐渐向地址小的方向“堆积”。在任何时刻,存放最后一个信息的字存储单元为堆栈顶部,称为栈顶(Top)。栈顶是随着进出栈信息的多少而变的。而栈底是由软件设定后固定不变的。

堆栈指针SP始终指向堆栈顶部的地址。8086/8088堆栈的组织在8086/8088系列微机中,堆栈是由堆栈段寄存器(SS)指定的一段存储区,通常,堆栈段中所包含的存储单元字节数即为堆栈深度或称为堆栈长度。SP中始终包含段基址与栈顶之间的距离(字节数)。当SP初始化时,它的值就是这个堆栈的长度,由于SP是16位的寄存器,而堆栈深度最大是64KB,则至多可存放32K个字数据。

设SP=2000H,把1234H进栈的示意图如下。【例】:已知CPU各段寄存器的内容为:(CS)=3000H,(DS)=1060H,(ES)=1140H,(SS)=2200H,SP=0200H其中代码段大小为16KB,数据段、附加段大小为64KB,试画出对应储存器分段的示意图,要求标出首尾地址。【分析】:

对于代码段,大小为16KB,即对应的偏移地址为:0H---3FFFH,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论