2.7 “段地址×16+偏移地址=物理地址”的本质含义
在理解8086CPU段地址和偏移地址的本质含义时,不应拘泥于某一种引申出来的逻辑意义,而应清楚其本质含义。只有这样,才能更灵活地利用它来分析和解决问题。“段地址×16+偏移地址=物理地址”的本质含义是:CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
更一般地说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址×16可看作是基础地址。
下面,用两个与CPU无关的例子做进一步的比喻说明。
比喻1:基础地址+偏移地址=物理地址
比如说,学校、体育馆、图书馆同在一条笔直的单行路上,学校位于路的起点(从路的起点到学校距离是0米)。如图2.8所示:
学校 体育馆 图书馆
0m 2000m 2826m
你要去图书馆,问我地址,我可以用两种方式告诉你:
- 从学校走2826m到图书馆。这2826m可以认为是图书馆的物理地址。
- 从学校走2000m到体育馆,从体育馆再走826m到图书馆。第一个距离2000m是相对于起点的基础地址,第二个距离826m是相对于基础地址的偏移地址。
第一种方式是直接给出物理地址2826m,而第二种方式是用基础地址和偏移地址相加来得到物理地址。
比喻2:段地址×16+偏移地址=物理地址
在上面的例子中,我们进一步限制条件:只能通过纸条来通信。显然,我必须有一张可以容纳4位数据的纸条,才能写下2826这个数据。
学校 体育馆 图书馆
0m 2000m 2826m
可不巧的是,我没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以这种方式告诉你2826这个数据:
2 0 0
8 2 6
在第一张纸上写上200(段地址),在第二张纸上写上826(偏移地址)。假设我们事前对这种情况有过约定:你得到这两张纸后,做这样的运算:200(段地址)×10+826(偏移地址)=2826(物理地址)。
8086CPU就是这样一个只能提供两张3位数据纸条的CPU。
2.8 段的概念
“段地址”这个名称中包含着“段”的概念。这种说法可能对一些学习者产生了误导,使人误以为内存被划分成了一个一个的段,每一个段有一个段地址。其实,内存并没有分段,段的划分来自于CPU。由于8086CPU用“基础地址(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
例如,地址10000H-100FFH的内存单元可以看作一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H。也可以认为地址10000H-1007FH和10080H-100FFH的内存单元组成两个段,它们的起始地址(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为80H。
10000H 1007FH 100FFH
[-