CPU的情况是这样的: CPU 8086的内存大小1MB = 1048576B CPU 8086的寄存器是16位的, 最多能寻址64K = 65536B 1MB = 16 * 64KB, 所以用了两个寄存器一个表示段值, 一个代表偏移
假设的情况是这样的: 天朝在某个地方修了一条长度为1048576米的高速公路. 由于天朝技术限制, 只能制造长度为65536米的尺子. 一天, 某领导开车在路上, 心血来潮想体验一下风驰电掣的感觉, 一脚油门下去, 车立马就停了. 领导淡定地意识到这车完了, 下车一看, 这什么地方, 指示牌上写着8000:8888. 领导心想: 号倒是不错, 谁知道啥意思啊. 谁能告诉我们敬爱的领导这是在哪啊?
因为当初写指示牌时, 用了16根尺子才量完公路, 就给尺子编号了0-15号, 也就是从8号尺子开始处, 再向前走8888米就是领导的所在.
段值是0x8000, 偏移是0x8888
后来, 就麻烦了CPU变了, 从386开始, 能有4GB的内存空间, 寄存器是32位的. 一个寄存器就能寻址4GB内存. 为什么还要保留"段:偏移"的寻址模式呢?
因为, 386开始支持保护模式, 操作系统划分段,设置段属性, 限制应用程序只能在操作系统分配给自己的空间里, 保护应用程序之间不会相互干扰.
因为现实变了, 高速公里收费了, 收了钱, 给谁啊. 某领导说, 我的地盘听我的, 这一段在我的地盘中, 钱给我. 于是, 公路就继续分段. 为了搞清楚, 那一段有多长, 归谁管等难题. 程序员们就用EXCEL做记录 上面写着从哪里开始,到哪里结束, 收了钱归谁,一行一行, 组成了一个表. 行号就是段值, 大家都知道哪一段归谁管了. 从此, 不能去别人的段里乱收费了, 保护了大家的利益. 从此大家就像王子和公主一样过上了幸福美满的生活.