2.2 存储器分段和地址的形成
从8086开始采用分段的方法管理存储器。只有充分理解存储器分段的概念和存储器逻辑地址和物理地址的关系,才能熟练的使用8086/8088汇编语言。
2.2.1 存储单元的地址和内容
计算机存储信息的基本单位是一个二进制位,一位可存储一个二进制数:0或1。每8位组成一个字节,位编号如下所示:
IBM PC机的字长为16位,有2个字节组成,位编号如下所示:
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在存储器里以字节为单位存储信息。为了正确的存放或取得信息,每一个字节单元给以一个存储器地址。地址从0开始编号,顺序地每次加1。在机器里,地址也是用二进制数来表示的。当然它是无符号整数,书写格式为十六进制数。
一个存储单元中存储的信息曾为该存储单元的内容。图2.2示意了存储器中部分存储单元存放信息的情况。从图中可以看到, 地址为56780H的字节存储单元中的内容是34H,而地址为56781H的字节存储单元中的内容是12H。
一个字存放到存储器要占用连续的两个字节单元。系统规定,当把一个字节存放到存储器时,其低字节存放在地址较低的字节单元中,其高字节 存放在地址较高的字节单元中。这样二个连续的字节单元就构成了一个字单元,字单元的地址采用它的低地址表示。例如,图中地址56780H的字单元的内容是1234H,而地址为834ABH的字单元的内容是6780H。
上述存储原则称为“高高低低”原则。在以字节方式存取字时需要特
别注意该原则,当以字方式存取字时,处理器自动采用该原则。
四个连续的字节单元就构成了一个双字单元,双字单元的地址就是
最低字节单元的地址。一个双字存放到存储器时也按照“高高低低”原则存储,也即高字在高地址字中,低字在低地址字中,也就是最高字节在最高地址字节单元中,最低字节在最低地址字节单元中。如图所示,地址为56780H的双字单元中存放的内容是29561234H。
2.2.2 存储器的分段
8086/8088CPU有20根地址线,可直接寻址的物理地址空间为1M字节(=)。系统存储器由以字节为单位的存储单元组成,存储单元的物理地址长20位,范围是00000H至FFFFFH。尽管8086/8088内部的ALU每次最多进行16位运算,存放存储单元地址偏移的指针寄存器(如IP、SP以及BP、SI、DI和BX)都是16位,但8086/8088通过对存储器分段使用段寄存器的方法有效地实现了寻址1M字节物理空间。
根据需要把1M字节地址空间划分成若干逻辑段。每个逻辑段必须满足如下两个条件:第一,逻辑段的开始地址必须是16的倍数 ;第二,逻辑段的最大长度为64k。按照这两个条件,1M字节地址空间最多可划分成64k个逻辑段,最少也要划分成16个逻辑段。第一个条件与段寄存器长16位有关;第二个条件与指针寄存器长16位相关。
逻辑段与逻辑段可以相连,也可以不相连,还可以部分重叠。图2.3 给出了若干逻辑段的划分情况。在图2.3 中,段B与段C部分重叠,段E与段D相连。
这种存储器分段的方法不仅有利于实现寻址1M字节空间,而且也十分有利于对1M字节存储空间的管理。对实现程序的重定位和浮动,对实现代码数据的隔离,对充分利用存储空间,这种方法都有益。
2.2.3 物理地址的形成
由于段的起始地址必须是16的倍数,所以段起始地址有如下形式:
bbbb bbbb bbbb bbbb 0000(二进制)
用16进制可表示成XXX0(十六进制)。这种20位的段起始地址,可压缩表示成16位的XXXX(十六进制)形式。我们把20位段起始地址的高16位XXXX(十六进制)称为段值。显然,段起始地址等与段值乘16(即左移4位)。要访问的某一个存储单元总是属于某个段。我们把存储单元的地址与所在段的起始地址的差称为段内偏移,简称偏移。在一个段内,通过偏移可指定要访问的存储单元,或者说要访问的存储单元可由偏移来指定。在整个1M地址空间中,存储单元的物理地址等与段起始地址加上偏移。
于是,存储单元的逻辑地址由段址和偏移两部分组成,用如下形式表示:
段值:偏移
根据逻辑地址可方便地得到存储单元的物理地址,计算公式如下:
物理地址=段值×16 偏移
通过移位和算术加可容易地实现上述公式,图2.4 是物理地址产生的示意图。例如,用16进制表示的逻辑地址1234:3456H多对应的存储单元的物理地址为15796H。
由于段可以重叠,所以一个物理地址可用多个逻辑地址表示。图2.5 是这样的一个例子,其中存储单元的物理地址是12345H,标出的两个重叠段的段址分别是1002H和1233H,在对应段内的偏移分别是2325H和0015H。
采用段值和偏移构成逻辑地址后,段值由段寄存器给出,偏移可由指令指针IP、堆栈指针SP和其他可作为存储器指针使用的寄存器(SI、DI、BX和BP)给出,偏移还可直接用16位数给出。指令中不使用物理地址,而是使用逻辑地址,由总线接口单元BIU按需要根据段值和偏移自动形成20位物理地址。