本文小节讨论内容:"段地址x16+偏移地址=物理地址”的本质含义,段 的 概 念
"段地址x16+偏移地址=物理地址”的本质含义
注意,这里讨论的是 8086CPU 段地址和偏移地址的本质含义,而不是为了解决具体的问题而在本质含义之上引申出来的更高级的逻辑意义。不管以多少种不同的逻辑意义去看待“段地址x16+偏移地址=物理地址”的寻址模式,一定要清楚地知道它的本质含义,这样才能更灵活地利用它来分析、解决问题。如果只拘泥于某一种引申出来的逻辑含义,而模糊本质含义的话,将从意识上限制对这种寻址功能的灵活应用。
“段地址x16+偏移地址=物理地址”的本质含义是:CPU 在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
更一般地说,8086CPU 的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU 中,段地址x16 可看作是基础地址。
下面,我们用两个与 CPU 无关的例子做进一步的比喻说明。
第一个比喻说明“基础地址+偏移地址=物理地址”的思想
比如说,学校、体育馆、图书馆同在一条笔直的单行路上(参考图1),学校位于路的起点(从路的起点到学校距离是 0 米)。
你要去图书馆,问我那里的地址,我可以用两种方式告诉你图书馆的地址:
(1) 从学校走 2826m 到图书馆。这 2826m 可以认为是图书馆的物理地址。
(2) 从学校走 2000m 到体育馆,从体育馆再走 826m 到图书馆。第一个距离 2000m,是相对于起点的基础地址,第二个距离 826m 是相对于基础地址的偏移地址(以基础地址为起点的地址)。
第一种方式是直接给出物理地址 2826m,而第二种方式是用基础地址和偏移地址相加来得到物理地址的。
第二个比喻进一步说明“段地址x16+偏移地址=物理地址”的思想。
我们为上面的例子加一些限制条件,比如,只能通过纸条来互相通信,你问我图书馆的地址我只能将它写在纸上告诉你。显然,我必须有一张可以容纳 4 位数据的纸条,才能写下 2826 这个数据。
可不巧的是,我没有能容纳 4 位数据的纸条,仅有两张可以容纳 3 位数据的纸条。这样我只能以这种方式告诉你 2826 这个数据。
在第一张纸上写上 200(段地址),在第二张纸上写上 826(偏移地址)。假设我们事前对这种情况又有过相关的约定: 你得到这两张纸后,做这样的运算: 200(段地址)x10+826(偏
移地址)=2826(物理地址)。
8086CPU 就是这样一个只能提供两张 3 位数据纸条的 CPU。
段的概念
我们注意到,“段地址”这个名称中包含着“段”的概念。这种说法可能对一些学习者产生了误导,使人误以为内存被划分成了一个一个的段,每一个段有一个段地址。如果
我们在一开始形成了这种认识,将影响以后对汇编语言的深入理解和灵活应用。
其实,内存并没有分段,段的划分来自于 CPU,由于 8086CPU 用“基础地址(段地址X16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。如图 2 所示,我们可以认为: 地址 10000H~100FFH 的内存单元组成一个段,该段的起始地址(基础地址)为 10000H,段地址为 1000H,大小为 100H;我们也可以认为地址 10000H~1007FH、10080H~100FFH 的内存单元组成两个段,它们的起始地址(基础地址)为: 10000H 和 10080H,段地址为: 1000H 和 1008H,大小都为 80H。
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址X16 定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:段地址x16 必然是 16 的倍数,所以一个段的起始地址也一定是 16 的倍数:偏移地址为 16 位,16 位地址的寻址能力为 64KB,所以一个段的长度最大为 64KB。
思考点
往期文章
寄存器-汇编复习(2)_luozhonghua2000的博客-CSDN博客
通用寄存器-汇编复习(1)_luozhonghua2000的博客-CSDN博客
汇编语言基础-汇编复习(0)_luozhonghua2000的博客-CSDN博客