IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段

上传人:E**** 文档编号:89189420 上传时间:2019-05-21 格式:PPT 页数:18 大小:242KB
返回 下载 相关 举报
IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段_第1页
第1页 / 共18页
IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段_第2页
第2页 / 共18页
IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段_第3页
第3页 / 共18页
IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段_第4页
第4页 / 共18页
IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段》由会员分享,可在线阅读,更多相关《IBM-PC汇编语言程序设计 教学课件 ppt 作者 余朝琨 第3章 存储器的分段(18页珍藏版)》请在金锄头文库上搜索。

1、第3章 存储器的分段 3.1 存储单元的地址和内容 3.2 存储器地址的分段 3.3 逻辑地址与物理地址 3.4 堆栈(Stack) 3.5 外部设备,第3章 存储器的分段,3.1 存储单元的地址和内容 ,尽管存储器是由字节单元组成的,但是任何两个相邻字节可以构成一个字(WORD),即16位二进制代码。显然一个字有二个地址,约定用地址值较小的那个字节单元地址作为这个字单元地址的代表。一个字有两个字节,其中低字节在相应的低地址中,高字节数在高地址中。如在字地址23400H中存放7869H字数据,则69H存放在地址23400H单元中,78H(高字节)存放在23401H单元中,也就是遵循“低位在前,

2、高位在后”的原则。 在8086/8088 CPU 访问内存的指令中,可分为字节访问和字访问两种。而在386以上CPU还具有32位访问。因此要求指令中表示出是哪种访问。在程序中,通常用伪指令定义符号地址(Variable)时已隐式指出该变量所具有的类型属性。访问存储器时,从某个单元取出(读出)其内容后,该单元仍然保存着原来的内容不变,可以重复取出,称为非破坏性读出,只有存入新的信息后,原来保存的内容就自动丢失了。,3.2 存储器地址的分段 8086/8088 CPU 有20根地址总线A19A18A1A0,可以访问存储器的最大容量为:220B=1048576B=1024KB=1MB 在8086 C

3、PU 中所有可用来存放地址的寄存器都是16位的。那么在16位字长的机器里,用什么办法来提供20位地址呢?在IBM PC机里采用了存储器地址分段的办法。把IMB的存储空间划分成若干个段(Segment),每个段可由164KB(即65536B)个连续的字节单元组成。每个段是一个可独立寻址的逻辑单位。在8086/8088的程序设计中,需要设立几个段,每个段有多少个字节以及每个段的用途完全由用户自己确定。同时每个段中存储的代码或数据,可以存放在段内任意单元中。 一个存储器可以划分为若干个段,但是每个段的起始单元的首地址不是任意的,而是有所限制,它必须从任意的小段(Paragraph)的首地址开始。机器

4、规定,从0地址开始,每16个字节为一个小段。IMB可分成65536个小段。观察下面每小段的首地址的特性:,虽然存储器可以划分成若干个段,但在任何时刻,一个程序只能访问4个段中的内容,这4个段分别是代码段(Code Segment),堆栈段(Stack Segment),数据段(Data Segment)和附加段(Extra Segment)。它们的段首地址的段基值分别由对应的4个段寄存器CS,SS,DS,ES指明。它们分别保存各自段首地址的高16位值(A19A4),由4个段寄存器指向的那些段叫当前段(Current Segment)。所以当前段至多可容纳64KB的程序代码,64KB的堆栈和12

5、8KB的数据(分别由DS、ES指向的当前段)在规模不是很大的应用程序中,这些容量是足够使用。如果应用规模较大,可以在程序中通过修改相应段寄存器的内容,从而访问其他段,如可用LDS,LES指令等方式来改变当前段。 3.3 逻辑地址与物理地址 CPU访问主存必须传送出物理地址,而用户编程则使用逻辑地址,于是在8086/8088系列微型机中,每个存储单元都有两种形式的地址:物理地址(Phsysical Address)和逻辑地址(Logical Address)以及CPU内如何把程序员使用的逻辑地址形成物理,地址(真实地址)的问题。 每一个存储单元的物理地址是唯一的,就是这个单元的地址编码。CPU与

6、存储器之间的任何信息交换,都必须使用20位的物理地址先行,经地址译码器后形成开门信号,把被访问的存储单元的“门”打开,方能进行数据交换。 在程序设计中,程序员使用的是逻辑地址,而不使用物理地址,这不仅有利于程序的开发,且对存储器的动态管理也是有利的。一个逻辑地址是由段基值和偏移量(OFFSET)两部分组成,而且都是无符号的16位二进制数。上面已经说过段基值是一个段首地址的高16位,它存放在某一个16位段寄存器中。段首址的低4 位为0,即A3A2A1A0=0000。偏移量表示了某存储单元与它所对应的段的段首地址之间的字节距离。如当偏移量为0时,就在这个段的起始单元,当偏移量为0FFFFH时,就是

7、这个段(最大)最末一个字节单元。,每当CPU访问存储器时,总线接口部件BIU便把逻辑地址转换成物理地址。转换方法是:首先把逻辑地址中的段寄存器保存的段基值左移4位,或称把段寄存器的内容乘以16,其本质是恢复A3A2A1A0的四位二进制的0或一位16进制的0,使之形成一个完整的段首地址。这也就是为什么段首址要从小段的首地址开始的原因。形成了20位的段起始地址(段基址)之后,再加上16位的无符号偏移量,即产生了CPU访问主存单元的20位物理地址,从地址总线输出。 物理地址=段地址16+偏移地址 ,每个段寄存器可以按规定给出一个段的起始地址的段基值,每个段都有各自的用途。如前所述,代码段存放的是要运

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

9、种情况。 ,例如,如果代码段中的程序占有16KB(4000H)存储区,数据段占有2KB(800H)存储区,堆栈段占有1KB存储区。代码段的区域本可以为01000H10FFFH(64KB),由于程序区只需要16KB,所以程序区结束后的第一个小段的首地址就作为数据段的起始地址(05000H)。而数据段仅需2KB,则数据段结束后的第一个小段的首地址又成为堆栈段的起始地址(05800H)。这样,代码段和数据段及堆栈段重叠在一起了。请注意:每个存储单元的内容是绝对不允许发生冲突的,也就是说,某个存储单元既存储了指令代码,又将存储操作的数据,这是绝对禁止的。这里所提到的重叠只是指每个区段的大小可允许根据编

10、程的实际情况分配,并非一定要占用64KB的最大段空间。如果程序中的四个段都在64KB的范围内,而且程序运行时所需的信息都在本程序所定义的段区之内,那么,程序员只要在程序的首部设定各段寄存器的值就可以了。但如果程序的某一段(如数据段)在程序运行过程中会超过64KB空间,或者程序中可能访问除本身四个段以外的其它,区段的信息,那么在程序中必须动态地修改寄存器的内容,以保证所获得的信息的正确性,因此并不会因段区的划分而限制了程序空间的使用。 存储器分段的方法虽然给程序设计带来了一定的限制,但它可以扩大存储空间,而且对于程序的再定位也很方便。 3.4 堆栈(Stack) 前面已经提到,堆栈是一个特定的存

11、储区,在这个存储区中信息的进出严格按照一定的规则进行。堆栈主要用于暂存数据以及在“过程”调用或处理中断时暂存断点信息。不仅在现代程序设计中经常使用堆栈,在其他一些领域(如编译技术)中亦广泛地应用堆栈的概念。 (1)堆栈的结构 现在常采用软件堆栈,由编程人员用软件在存储器中划出一块存储区作为堆栈。该存储区的一端是固定的,另一端是浮动的,所有信息的存取都在浮动的一端进行,这是进栈与出栈操作的特点。浮动端的地址生长方向一般有两种方法:一为向高地址方向生长称为向上生长,另一种为向低地址方向生长,即为向下生长。8086/8088系列微机属于向下生长的堆栈。这个存储区最大地址的字存储单元为堆栈底部,称为栈

12、底(Bottom)。,在堆栈中存放的数据或断点信息从这里开始,逐渐向地址小的方向“堆积”。在任何时刻,存放最后一个信息的字存储单元为堆栈顶部,称为栈顶(Top)。栈顶是随着进出栈信息的多少而变的。而栈底是由软件设定后固定不变的。 堆栈指针SP始终指向堆栈顶部的地址。 (2)8086/8088堆栈的组织 在8086/8088系列微机中,堆栈是由堆栈段寄存器(SS)指定的一段存储区,通常,堆栈段中所包含的存储单元字节数即为堆栈深度或称为堆栈长度。SP中始终包含段基址与栈顶之间的距离(字节数)。当SP初始化时,它的值就是这个堆栈的长度,由于SP是16位的寄存器,而堆栈深度最大是64KB,则至多可存放

13、32K个字数据。 设SP=2000H,把1234H进栈的示意图如下。,3.5 外部设备 计算机运行时的程序和数据都需要通过输入设备送给计算机,程序运行的结果要通过输出设备送给用户,如在CRT上显示或在打印机上输出等,所以输入输出设备是计算机必不可少的组成部分。大容量的外存储器(如硬磁盘或软磁盘、光盘)能够存储大量的信息,也是现代计算机不可缺少的一部分。对于外部设备的管理是汇编语言的重要使用场合之一。 CPU外连接的各种功能部件,可归纳为两种性质的部件:主存储器和I/O端口,I/O端口也称外部设备,外部设备与主机(CPU和主存)的通信是通过外设接口进行的。每个接口包括一组寄存器。这些寄存器的用途

14、是: (1)数据寄存器:用来存放要在外设和主机间传送的数据,这类寄存器实际上起缓冲器的作用。,(2)状态寄存器:用来保存外围设备或接口的状态信息,以便CPU在必要时测试外设状态,了解外设的工作情况,起联络作用。例如,每个设备都有忙闲位用来标志设备当前是否正在工作,是否有空接受CPU给予的新任务等,使CPU与外设实现异步控制就更为方便。(3)命令寄存器:CPU给外设或接口的控制命令通过此寄存器传送给外部设备。例如,CPU要启动磁盘工作,必须发出启动命令等。 当然外部设备通过接口与主机相连,每个接口中究竟需要如何设置这些寄存器以及这些寄存器的具体数量都是取决于不同类型的接口电路而定。 为使主机访问

15、外设方便起见,外设接口中的每个寄存器给予一个端口(Port)地址,又称为端口号,这样就组成了一个独立于内存空间的I/O地址空间。8086/8088的I/O空间可达64K个端口地址,在输入输出指令中寻址的外设地址总线使用了16根,所以端口地址的范围是0000HFFFFH。 注意:一个接口中可包含有几个端口,CPU外最多可挂64K个端口,可知其可挂的接口数要少得多。,为了便于用户使用外设,IBM-PC机提供了两种类型的例行程序供用户调用。一种是BIOS(Basic Input Output System),另一种是DOS(Disk Operating System)功能调用。它们都是系统编制的子程

16、序,通过中断方式转入所需要的子程序去执行,执行完后返回原来的程序继续执行。这些例行程序有的完成一次简单的外设信息传送,如从键盘输入一个字符用MOV AH,1和INT 21H两条指令即可,或送一个字符至显示器等;也有的要完成一次相当复杂的外设操作,如从磁盘读写一个文件等。总之,操作系统把一些复杂的外设操作编制成了例行程序,用户只须按入口参数设定,功能号的设定,再执行一条INT n(n为中断类型号)就可以进入这些例行程序,完成所需要的外设操作,所以用户应尽量利用这些系统所提供的工具来编写自己的程序。,BIOS和DOS功能调用虽然都是系统提供的例行程序,但是它们之间又有差别。BIOS存放在机器的只读存储器ROM中,所以,可以把它看成机器硬件的一个组成部分,它的层次比DOS更低,更接近硬件,因此,它的语句要完成每一个对设备的直接命令,或信息传送。DOS功能调用是操作系统DOS的一个组成部分,它在开机时由磁盘装入到存储器,只要不关机,这些例行程序都在主存中,在它的例行程序中可以一次或多次调用BIOS以完成比BIOS更高级的功能。用户需要使用外设时,应尽可能使用

展开阅读全文
相关资源
相关搜索

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

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