8088的存储器组织
8088有20根地址线,可以有1MB内存寻址空间,每个内存单元都有20位的地址编码。但CPU内部和地址有关的寄存器(段寄存器,P,SP,BP,SL,DI)都是16位的,也就是说,CPU的任何一个寄存器只能保存16位的地址编码。为了能够访问20位的地址空间,CPU对它的1MB地址空间采用了分段管理的办法。它将该内存空间分成许多“逻辑段”,每个逻辑段的最大长度为64KB。采用两个16位的二进制数来描述某个存储单元的确切位置,一个十六进制数用以保存逻辑段的首地址(简称段地址),另一个十六位二进制数用以保存相对于段首址的偏移量。BU在寻址内存时通过BU内的20位的地址加法器把段首址和偏移量地址合成为内存的20位实际地址(也称为物理地址)。
①段地址(Segment Address):描述了要寻址的逻辑段在内存中的起始位置。所有的内存地址都是20位的,段地址也不例外,其形式应为XXXXXH。但由于8088规定了段地址必须能被16整除,所以该地址实际形式为XXXX0H。在8088中仅把XXXX部分保存到一个十六位寄存器中,而把0省略了。用以保存段地址的寄存器就称为段寄存器,在8088中使用CS、SS、DS和ES等4个段寄存器。
②偏移量地址(Offset Address):也称地址偏移量,描述了要寻址的内存单元相对于本段段首址的偏移量。在进行内存寻址时,偏移量地址可以通过很多方法获取,所以在寻址时常被称做“有效地址EA(Effective Address)”。由于各个逻辑段的长度不超过64KB,即偏移量最大不超过OFFFFH,当大于该值时则为0000班,所以可以用一个16位数来表示。
③物理地址(Physical Address):描述了要寻址单元的绝对地址。一个内存单元的物理地址是由段地址和偏移量地址两部分组成的,段基址和偏移量地址又称“逻辑地址”,由逻辑地址到物理地址的转换是由BU中20位的地址加法器自动完成的,具体操作如图35所示。先将段寄存器提供的16位段地址左移4位(在后面加4个0),恢复为20位地址,然后与各种寻址方式提供的16位有效地址相加,最终得到20位的物理地址。在访问内存时,用户编程使用的是16位的逻辑地址,而BU使用的是20位的物理地址。物理地址是惟一的,逻辑地址的表现形式可以是多样的。换句话说,一个物理地址会有多种逻辑地址。
根据逻辑段存放信息的物理意义,逻辑段可以分成4类,即:代码段、堆栈段、数据段和附加段。各段的位置由用户指派,它们可以彼此分离,也可以首尾相连、重叠或部分重叠。4个逻辑段的段地址分别存放在CS、SS、DS、ES4个段寄存器中。
①代码段(Code Segment):该逻辑段用来存放程序和常数。系统在取指时将寻址代码段,其段地址和偏移地址分别由段寄存器CS和指令指针P给出。代码段有时也用来存放数据。
2堆栈段(Stack Segment):该逻辑段用来临时存放数据。这些数据按照“先进后出(FLO:First In Last Out)或“后进先出”(LFO)的原则存取。在子程序调用时,可以用堆栈段来保存返回地址和传递参数:在任务切换时,可以利用堆栈来保护现场。
系统在执行堆栈操作指令时将寻址堆栈段。这时,其段地址和偏移地址分别由段寄存器SS和堆栈指针SP提供。
③数据段(Data Segment).:该逻辑段用于数据的保存。用户在寻址该段内的数据时,可以默认段寄存器的说明(即默认DS:),其偏移量地址即有效地址EA可通过直接寻址、间接寻址、基址寻址、变址寻址以及基址加变址寻址等多种寻址方式形成。
④附加段(Extra Segment):该逻辑段用于数据的保存。用户在访问该段内的数据时,其偏移地址同样可以通过多种寻址方式来形成,但在偏移地址前一般要加上段的说明(即段跨越前缀ES:)。惟一的例外是串操作,此时系统将默认源操作数和目的操作数分别位于数据段和附段,并用SI和DI两个变址寄存器对它们分别进行间接寻址。
通过以上介绍,知道除了程序必须存放在代码段和堆栈必须安排在堆栈段以外,数据可以存放在各个逻辑段中,但常规用法还是将数据存放于数据段或者附加段中。由于各个逻辑段分工明确,程序和数据一般是连续存放的,需要跨段访问的机会不多。所以在很多的时候,用户并不需要在程序中指明当前使用的究竟是哪个逻辑段,也不需要经常改变段地址。