当前位置: 代码迷 >> 综合 >> 2.7“段地址×16+偏移地址=物理地址”的本质含义
  详细解决方案

2.7“段地址×16+偏移地址=物理地址”的本质含义

热度:13   发布时间:2023-12-12 14:07:25.0

 注意,这里讨论的是8086CPU段地址和偏移地址的本质含义,而不是为了解决具体的问题,而在本质含义之上引申出来的更高级的逻辑意义

 

 不管以多少种不同的逻辑意义去看待段地址×16+偏移地址=物理地址”的寻址模式,一定要清楚地知道它的本质含义,这样才能更灵活地利用它来分析解决问题。

 

 如果,只拘泥于某一种引申出来的逻辑含义,而模糊本质含义的话,将从意识上限制对这种寻址功能的灵活应用。

 

    “段地址×16+偏移地址=物理地址”的本质含义:CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。


 更一般地说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址×16可看做是基础地址

 

 下面,我们用两个与CPU无关的例子来做进一步的比喻说明。

 

 第一个比喻说明“基础地址+偏移地址=物理地址”的思想

 

 比如说,学校、体育馆,图书馆同在一条笔直的单行路上(参考下图),学校位于路的起点(从路的起点到学校距离是0米)。

 

学校、体育馆、图书馆的位置关系

 

    你要去图书馆,问我那里的地址,我可以用两种方式告诉你图书馆的地址:

    (1)从学校走2826m到图书馆。这2826m可以认为是图书馆的物理地址。

    (2)从学校走2000m到体育馆。从体育馆再走826m到图书馆。第一个距离2000m,相对于起点的基础地址。第二个距离826m,是相对于基础地址的偏移地址(以基础地址为点的地址)。

 

 第一种方式是直接给出物理地址2826m,而第二种方式是用基础地址和偏移地址相加来得到物理地址的。

 

 第二个比喻进一步说明“段地址×16+偏移地址=物理地址”的思想。

 

 我们为上面的例子加一些限制条件,比如,只能通过纸条来互相通信。你问我图书馆的地址,我只能将它写在纸上告诉你。显然,我必须有一张可以容纳4位数据的纸条,才能写下2826这个数据。

可以写下4位数据的纸条

2

8

2

6

 

 可不巧的是,我没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以这种方式来告诉你2826这个数据。

 

两张可以写下3位数据的纸条

2

0

0

 

8

2

6

 

 在第一张纸上写上200(段地址),在第二张纸上写上826(偏移地址)。假设我们事先对这种情况又有过相关的约定:你得到这两张纸后,做这样的运算:200(段地址)×10+826(偏移地址)=2826(物理地址)。

 

    8086CPU就是这样,一个只能提供两张3位数据纸条的CPU。

 

    问:简述段地址和偏移地址。

 答:从X地走到Y地,从Y地,走到Z地。X到Y地,也就是段地址。从Y地到Z,也就是偏移地址。两者相加,也就是实际距离。

 

    问:为什么只拘泥于某一种引申出来的逻辑含义,而模糊本质含义的话,将从意识上限制对这种寻址功能的灵活应用?

    答:学东西,不要学的太死了。一件事物,有很多答案。

 

    问:为什么要有段地址和偏移地址?

    答:

    Intel 8088时代,计算机的地址总线是20位的,即可以寻址能力可以达到1M字节,但是它的ALU和寄存器都只有16位,也就是表示数的能力只能达64k,再大就逾锅了。

 

 那怎么办呢?INTEL想了一个办法,让两个寄存器对来表示一个物理地址,比如说DS:BX,前者叫段寄存器,后者叫偏址寄存器。

 

 由于这两个寄存器都是16位,直接相加还是不能匹配20位的地址线的访问能力,因此,INTEL公司变通了一下,人为地将这个组合寻址设计成:在它们组合时,让段寄存器左移四位(假设DS是1234H,左移4位就变成了12340H,至于它内部怎么实现我们不用管它。

 

 注意,对于16进制的数来说,乘以16就相当于在原数后面补个0,因为它是逢16进1啊;与10进制数乘10就是后面补0同样道理。)然后与偏址寄存器相加,这样得到的地址最大可以到0FFFFFH。这样行了。


 现在都32位机了,甚至64位了,所以上面的寻址方法在保护模式下不再用了。