### 如何用十六位字长表示20位地址
在探讨如何使用16位字长表示20位地址之前,我们需要先了解8086操作系统的基本架构及其内存管理方式。8086微处理器是Intel公司在1978年推出的16位微处理器,它在计算机体系结构的发展史上具有里程碑式的意义。8086处理器的最大特点之一是其能够通过段地址和偏移地址的方式寻址高达1MB的物理内存,尽管它的内部数据总线只有16位宽。
#### 8086微处理器的内存管理
在8086微处理器中,内存被划分为多个大小相同的段,每个段最大可达64KB(即2^16)。这是因为8086的数据总线宽度为16位,所以它可以表示的最大数值是2^16-1,即65535(约等于64K)。然而,8086却能够访问高达1MB(即2^20)的物理内存空间。这是如何实现的呢?
关键在于8086采用了分段的方式来管理内存。它使用了四个16位的段寄存器(CS、DS、SS、ES),每个段寄存器都包含一个段地址,该地址是指向该段的起始地址。此外,还有四个16位的指针寄存器(IP、SI、DI、BP),用于提供段内的偏移地址。
#### 物理地址计算公式
物理地址的计算公式为:
\[ \text{物理地址} = \text{段地址} \times 16 + \text{偏移地址} \]
这里需要注意的是,“段地址×16”实际上等同于“段地址左移4位”,因为16在二进制中表示为10000,左移4位也意味着乘以16。这个操作的目的在于确保段地址能够准确地指示段的起始位置,而偏移地址则表示在该段内的相对位置。
#### 示例解析
假设我们有一个20位地址空间,为了更好地理解这个问题,我们可以采用一个具体的例子来说明。
假设我们想要表示第14页的物理地址。根据前面的讨论,我们知道20位地址空间可以表示1MB的内存。如果我们将这个1MB的空间划分成多个64KB的段,那么每个段的长度就是64KB。
- **段地址**:表示当前段在所有段中的位置,这里用4位表示(因为\(2^{20}/2^{16}=2^4\)),即最多可以表示16个不同的段。
- **偏移地址**:表示在当前段内的具体位置,这里用16位表示,可以表示64KB的不同位置。
假设我们要表示的是第14页的位置,那么:
- **段地址**:第14页位于第1段(因为每段64KB,14页大约为56KB,小于64KB)。
- **偏移地址**:偏移4(即在第1段中的第4个位置)。
因此,根据物理地址的计算公式,第14页的物理地址计算过程如下:
\[ \text{物理地址} = (1 \times 16) + 4 = 16 + 4 = 20 \]
需要注意的是,这里的数值都是以十进制表示的,而在实际的计算机系统中,它们是以二进制形式存储的。
通过这种方式,即使处理器的内部数据总线宽度仅为16位,仍然能够有效地管理并访问到更大的物理内存空间。这种巧妙的设计使得8086微处理器在当时成为了一个非常高效且实用的处理器,并且对后续的处理器设计产生了深远的影响。