第3章存储器的分段

上传人:今*** 文档编号:107270069 上传时间:2019-10-18 格式:PPT 页数:22 大小:293KB
返回 下载 相关 举报
第3章存储器的分段_第1页
第1页 / 共22页
第3章存储器的分段_第2页
第2页 / 共22页
第3章存储器的分段_第3页
第3页 / 共22页
第3章存储器的分段_第4页
第4页 / 共22页
第3章存储器的分段_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《第3章存储器的分段》由会员分享,可在线阅读,更多相关《第3章存储器的分段(22页珍藏版)》请在金锄头文库上搜索。

1、本章要求,教学重点及难点:,物理地址计算,1.了解存储器地址和内容的概念; 2.了解存储器地址分段的方式; 3.掌握逻辑地址和物理地址的概念及计算方式; 4.了解堆栈的概念及外部设备。,计划学时: 2学时,第3章 存储器的分段,3.1 存储单元的地址和内容,基本概念:,计算机存储信息的基本单位是位(Bit),一位可存储一个二进制数。每8个位组成一个字节。,存储器存储信息的基本单位是字节(Byte),由8个二进制位组成。位编号如下 :,在存储器中,每一个字节单元都有一个与之对应的、唯一的存储器地址 。称为物理地址。对于16位字长的PC机(8086/8088),由两个字节组成一个字(Word)。其

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

3、内容可以表示为 (X); 假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=(X)来表示Y单元的内容。,0004H字节单元的内容: (0004H)=34H 0004H字单元的内容: (0004H)=1234H,0004H字单元的内容为1234H,表示为: (0004H)=1234H,0004H字节单元存放的信息为34H,表示:(0004H)=34H,字单元由两个字节单元组成,其地址采用它的低地址来表示。 字存入存储器:低位字节存入低地址单元,高位字节存入高地址单元。,假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=(X)来表示Y单元的内容。,直接表示1234H字单元的内容: S=(1

4、234H)=2F1EH,直接给出S的单元地址, (1234H)=2F1EH,例如,1234H字单元的内容为S,有两种表示方式:,间接表示1234H字单元的内容: S=(0004H)= (1234H)= 2F1EH,S的单元地址存放在0004H字单元中,(0004H)=1234H,从0004H字单元中取出S的单元地址,再把S的内容读出来: ((0004H))=2F1EH,8086/8088 CPU 有20根地址总线A19A18A1A0,可以访问存储器的最大容量为:220B=1024KB=1MB,在8086 CPU 中所有可用来存放地址的寄存器都是16位的。,3.2 存储器地址的分段,在IBM P

5、C机里采用了存储器地址分段的办法。把1MB的存储空间划分成若干个段(Segment),每个段可由164KB(即65536B)个连续的字节单元组成。每个段是一个可独立寻址的逻辑单位。 在8086/8088的程序设计中,需要设立几个段,每个段有多少个字节以及每个段的用途完全由用户自己确定。同时每个段中存储的代码或数据,可以存放在段内任意单元中。,那么在16位字长的机器里,用什么办法来提供20位地址呢?,分段的基本规则,在编制程序时,要把存储器划分成段,每个段最大可达64KB,这样段内地址可以用16位表示。,PC机对段的起始地址有限制,段不能起始于任意地址,而必须从任一小段(Paragraph)的首

6、地址开始。,机器规定:从0地址开始,每16个字节为一小段。,00000,00001,00002,0000E,0000F; 00010,00011,00012,0001E,0001F; 00020,00021,00022,0002E,0002F;,在十六进制表示的地址中,最低位为0(即20位地址的低4位为0)。,虽然存储器可以划分成若干个段,但在任何时刻,一个程序只能访问4个段中的内容,这4个段分别是代码段(Code Segment),堆栈段(Stack Segment),数据段(Data Segment)和附加段(Extra Segment)。它们的段首地址的段基值分别由对应的4个段寄存器CS

7、,SS,DS,ES指明。 它们分别保存各自段首地址的高16位值(A19A4),由4个段寄存器指向的那些段叫当前段(Current Segment)。所以当前段至多可容纳64KB的程序代码,64KB的堆栈和128KB的数据(分别由DS、ES指向的当前段)在规模不是很大的应用程序中,这些容量是足够使用。 如果应用规模较大,可以在程序中通过修改相应段寄存器的内容,从而访问其他段,如可用LDS,LES指令等方式来改变当前段。,CPU访问主存必须传送出物理地址,而用户编程则使用逻辑地址,于是在8086/8088系列微型机中,每个存储单元都有两种形式的地址:物理地址(Phsysical Address)和

8、逻辑地址(Logical Address)以及CPU内如何把程序员使用的逻辑地址形成物理地址(真实地址)的问题。 每一个存储单元的物理地址是唯一的,就是这个单元的地址编码。CPU与存储器之间的任何信息交换,都必须使用20位的物理地址先行,经地址译码器后形成开门信号,把被访问的存储单元的“门”打开,方能进行数据交换。 在程序设计中,程序员使用的是逻辑地址,而不使用物理地址,这不仅有利于程序的开发,且对存储器的动态管理也是有利的。一个逻辑地址是由段基值和偏移量(OFFSET)两部分组成,而且都是无符号的16位二进制数。,3.3 逻辑地址与物理地址,段基值是一个段首地址的高16位,它存放在某一个16

9、位段寄存器中。段首址的低4 位为0,即A3A2A1A0=0000。 偏移量表示了某存储单元与它所对应的段的段首地址之间的字节距离。如当偏移量为0时,就在这个段的起始单元,当偏移量为0FFFFH时,就是这个段(最大)最末一个字节单元。 每当CPU访问存储器时,总线接口部件BIU便把逻辑地址转换成物理地址。 转换方法是:首先把逻辑地址中的段寄存器保存的段基值左移4位(把段寄存器的内容乘以16),其本质是恢复A3A2A1A0的四位二进制的0或一位16进制的0,使之形成一个完整的段首地址。这也就是为什么段首址要从小段的首地址开始的原因。形成了20位的段起始地址(段基址)之后,再加上16位的无符号偏移量

10、,即产生了CPU访问主存单元的20位物理地址,从地址总线输出。,物理地址的计算,计算公式: 物理地址=段地址10H+偏移地址,每个存储单元只有唯一的物理地址,但它却可以由不同的段地址和不同的偏移地址组成。,【例】 : 计算下列存储单元的物理地址: (1) 2000:3000; (2) 2100:2000; (3) 2280:0800; (4) 2250:0500;,【解】: (1) 物理地址=2000H10H+3000H=23000H;,(2) 物理地址=2100H10H+2000H=23000H;,(3) 物理地址=2280H10H+0800H=23000H;,(4) 物理地址=2250H1

11、0H+0500H=22A00H;,每个段寄存器可以按规定给出一个段的起始地址的段基值,每个段都有各自的用途。如前所述,代码段存放的是要运行的程序及数据。数据段存放运行程序所用的数据,如果在程序中使用了串操作处理指令,则其源操作数默认存放在数据段中(源串可允许段超越)。堆栈段定义了堆栈的所在区域,堆栈是一个数据结构,它开辟了一个比较特殊的存储区,并以“后进先出”的原则访问这一区域。附加段是附加的数据段,它是一个辅助的数据区,对于串处理指令,它是目的串操作数存放的区域,它不允许进行段跨越。当用户在编制程序时,应该按照上述规定把程序的各部分放在规定的区段之中。 除非专门指定,如用户自行设定之外,在一

12、般情况下,各段在存储器中的分配是由操作系统负责的。每个段可以独立地占用64KB存储区。各段也允许部分重叠或完全重叠,下面的例子可以说明这种情况。,【例】如果代码段中的程序占有16KB(4000H)存储区,数据段占有2KB(800H)存储区,堆栈段占有1KB存储区。代码段的区域本可以为01000H10FFFH(64KB),由于程序区只需要16KB,所以程序区结束后的第一个小段的首地址就作为数据段的起始地址(05000H)。而数据段仅需2KB,则数据段结束后的第一个小段的首地址又成为堆栈段的起始地址(05800H)。 这样,代码段和数据段及堆栈段重叠在一起了。 注意:每个存储单元的内容是绝对不允许

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

14、000H,则对应的物理地址为: 10000H-103FFH 对于数据段,由题意,大小为64KB,即对应的偏移地址为:0H-FFFFH,且DS为4000H,则对应的物理地址为: 40000H-4FFFFH,10000H,103FFH,40000H,4FFFFH,4000:0000,4000:FFFF,堆栈是一个特定的存储区,在这个存储区中信息的进出严格按照一定的规则进行。堆栈主要用于暂存数据以及在“过程”调用或处理中断时暂存断点信息。不仅在现代程序设计中经常使用堆栈,在其他一些领域(如编译技术)中亦广泛地应用堆栈的概念。 堆栈的结构 现在常采用软件堆栈,由编程人员用软件在存储器中划出一块存储区作

15、为堆栈。该存储区的一端是固定的,另一端是浮动的,所有信息的存取都在浮动的一端进行,这是进栈与出栈操作的特点。浮动端的地址生长方向一般有两种方法:一为向高地址方向生长称为向上生长,另一种为向低地址方向生长,即为向下生长。8086/8088系列微机属于向下生长的堆栈。,3.4 堆栈,这个存储区最大地址的字存储单元为堆栈底部,称为栈底(Bottom)。在堆栈中存放的数据或断点信息从这里开始,逐渐向地址小的方向“堆积”。在任何时刻,存放最后一个信息的字存储单元为堆栈顶部,称为栈顶(Top)。栈顶是随着进出栈信息的多少而变的。而栈底是由软件设定后固定不变的。 堆栈指针SP始终指向堆栈顶部的地址。 808

16、6/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,且CS为3000H,则对应的物理地址为: 30000H-33FFFH 对于数据段,大小为64KB,即对应的偏移地址为:0H-FFFFH,且DS为

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号