Bootstrap

为什么要用段地址和偏移地址?

本质含义

对于8086CUP而言
是一个16位结构的CPU
其具有的结构特性:
(1)运算器一次最多可以处理16位的数据;
(2)寄存器的最大宽度为16位;
(3)寄存器和运算器之间的通路为16位
除此之外8086CUP有20位地址总线,可以传送20位地址,达到1MB的寻址能力

问题:

8086CPU是一个16位结构,在内部一次性处理、传输、暂时存储的地址为16位
那如果是这样,只能传送16位的地址,只有64KB的寻址能力了

解决问题

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址

当8086CPU要读写内存时:
(1)CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
(3)地址加法器将两个16位地址合成一个20位的物理地址;
(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
(5)输如输出控制电路将20位物理地送上地址总线;
(6)20位物理地址被地址总线传送到存储器

“物理地址=段地址X16+偏移地址”为什么要这样?

从上面我们能清楚,问题就是因为我们的CUP是16位架构的,地址总线又是20位的
这样使用就可以使用到20位的物理地址

本质含义

CPU在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址,所以也可以理解为“基础地址+偏移地址=物理地址
王爽汇编书中给的例子很好理解
Ag:
比如说,学校、体育馆、图书管同在一条笔直的单行路上,学校位于路的起点
如图:
在这里插入图片描述如果你问我怎样去图书馆,我有两种方法告诉你
(1)从学校走2826m到图书馆(这里2826m就是物理地址)
(2)从学校走2000m到体育馆(段地址X16),再走826到图书管(偏移地址)
再加上限制,现在我只能用一张可容纳4位数据的纸条,才能写下这个数据
但是现在我只有两张可容纳3位数的纸条
于是200就可以理解位段地址,826理解位偏移地址

本质上,其实内存并没有分段,段的划分来自于CPU,因为8086CPU用“基础地址(段地址X16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存

小结

21F60H的表示方式有很多种

                                       段地址                  偏移地址
                                       2000H                  1F60H
                                       2100H                  0F06H
                                       21F6H                 0000H

所以CPU可以用不同的段地址和偏移地址形成同一个物理地址

注意因为段地址是十六进制,也就是说X16,相当于我们做十进制时X10

理解这个对后面我们所用Debug有很大的帮助

;