- 6
- 0
- 约 40页
- 2016-12-30 发布于广东
- 举报
第3章 存储器的分段 为了便于用户使用外设,IBM-PC机提供了两种类型的例行程序供用户调用。一种是BIOS(Basic Input Output System),另一种是DOS(Disk Operating System)功能调用。它们都是系统编制的子程序,通过中断方式转入所需要的子程序去执行,执行完后返回原来的程序继续执行。这些例行程序有的完成一次简单的外设信息传送,如从键盘输入一个字符用MOV AH,1和INT 21H两条指令即可,或送一个字符至显示器等;也有的要完成一次相当复杂的外设操作,如从磁盘读写一个文件等。总之,操作系统把一些复杂的外设操作编制成了例行程序,用户只须按入口参数设定,功能号的设定,再执行一条INT n(n为中断类型号)就可以进入这些例行程序,完成所需要的外设操作,所以用户应尽量利用这些系统所提供的工具来编写自己的程序。 BIOS和DOS功能调用虽然都是系统提供的例行程序,但是它们之间又有差别。BIOS存放在机器的只读存储器ROM中,所以,可以把它看成机器硬件的一个组成部分,它的层次比DOS更低,更接近硬件,因此,它的语句要完成每一个对设备的直接命令,或信息传送。DOS功能调用是操作系统DOS的一个组成部分,它在开机时由磁盘装入到存储器,只要不关机,这些例行程序都在主存中,在它的例行程序中可以一次或多次调用BIOS以完成比BIOS更高级的功能。用户需要使用外设时,应尽可能使用层次较高的DOS功能调用,但有时还不能满足要求,此时,就需要直接调用BIOS,如果BIOS还不能解决问题,那就只好自己编制中断服务程序。 3.1 存储单元的地址和内容 尽管存储器是由字节单元组成的,但是任何两个相邻字节可以构成一个字(WORD),即16位二进制代码。显然一个字有二个地址,约定用地址值较小的那个字节单元地址作为这个字单元地址的代表。一个字有两个字节,其中低字节在相应的低地址中,高字节数在高地址中。如在字地址23400H中存放7869H字数据,则69H存放在地址23400H单元中,78H(高字节)存放在23401H单元中,也就是遵循“低位在前,高位在后”的原则。 在8086/8088 CPU 访问内存的指令中,可分为字节访问和字访问两种。而在386以上CPU还具有32位访问。因此要求指令中表示出是哪种访问。在程序中,通常用伪指令定义符号地址(Variable)时已隐式指出该变量所具有的类型属性。访问存储器时,从某个单元取出(读出)其内容后,该单元仍然保存着原来的内容不变,可以重复取出,称为非破坏性读出,只有存入新的信息后,原来保存的内容就自动丢失了。 3.2 存储器地址的分段 8086/8088 CPU 有20根地址总线A19A18…A1A0,可以访问存储器的最大容量为:220B=1048576B=1024KB=1MB 在8086 CPU 中所有可用来存放地址的寄存器都是16位的。那么在16位字长的机器里,用什么办法来提供20位地址呢?在IBM PC机里采用了存储器地址分段的办法。把IMB的存储空间划分成若干个段(Segment),每个段可由1~64KB(即65536B)个连续的字节单元组成。每个段是一个可独立寻址的逻辑单位。在8086/8088的程序设计中,需要设立几个段,每个段有多少个字节以及每个段的用途完全由用户自己确定。同时每个段中存储的代码或数据,可以存放在段内任意单元中。 一个存储器可以划分为若干个段,但是每个段的起始单元的首地址不是任意的,而是有所限制,它必须从任意的小段(Paragraph)的首地址开始。机器规定,从0地址开始,每16个字节为一个小段。IMB可分成65536个小段。观察下面每小段的首地址的特性: 虽然存储器可以划分成若干个段,但在任何时刻,一个程序只能访问4个段中的内容,这4个段分别是代码段(Code Segment),堆栈段(Stack Segment),数据段(Data Segment)和附加段(Extra Segment)。它们的段首地址的段基值分别由对应的4个段寄存器CS,SS,DS,ES指明。它们分别保存各自段首地址的高16位值(A19~A4),由4个段寄存器指向的那些段叫当前段(Current Segment)。所以当前段至多可容纳64KB的程序代码,64KB的堆栈和128KB的数据(分别由DS、ES指向的当前段)在规模不是很大的应用程序中,这些容量是足够使用。如果应用规模较大,可以在程序中通过修改相应段寄存器的内容,从而访问其他段
原创力文档

文档评论(0)