🌈个人主页:聆风吟
🔥系列专栏:数据结构、算法模板、汇编语言
🔖少年有梦不应止于心动,更要付诸行动。
文章目录
- 📋前言
- 一. ⛳️物理地址
- 二. ⛳️16位结构的CPU
- 三. ⛳️8086CPU给出物理地址的方法
- 四. ⛳️“物理地址=段地址x16+偏移地址” 的本质含义
- 五. ⛳️段的概念
- 六. ⛳️小结检测
- 5.1 🔔习题
- 5.2 🔔习题答案
- 📝全文总结
📋前言
💬 hello! 各位铁子们大家好哇,今天又给大家带来了《寄存器精讲第二期》,不知道咱们的第一期大家都学会了吗?如果还有小伙伴们需要学习或者复习的都可以点击下方专栏进行跳转。
📚 系列专栏:本期文章收录在《汇编语言》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
一. ⛳️物理地址
CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。CPU 通过地址总线送入存储器,必须是一个内存单元的物理地址且物理地址必须要先在内部形成。
二. ⛳️16位结构的CPU
概括的讲,16位结构描述了一个CPU具有一下几个方面特征:
- 运算器一次最多可以处理 16 位的数据;
- 寄存器的最大宽度为 16 位;
- 寄存器和运算器之间的通路为 16位。
三. ⛳️8086CPU给出物理地址的方法
8086有 20 位地址总线,可以传送 20 位地址,寻址能力为 1 MB。8086内部为 16 位结构,它只能传送 16位地址,表现出的寻址能力却只有 64KB。那么问题来了:8086CPU如何用内部16位的数据转换成20位的地址呢?8086CPU 采用一种在内部用两个 16 位地址合成的方法来形成一个 20 位的物理地址。 如下图所示:
由上图所示,当8086CPU 要读写内存时:
- CPU 中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
- 地址加法器将两个16位地址合成为一个20位的物理地址;
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
- 输入输出控制电路将20位物理地址送上地址总线;
- 20位物理地址被地址总线传送到存储器。
地址加法器采用物理地址=段地址x16+偏移地址的方法用段地址和偏移地址合成物理地址。例如,8086CPU要访问地址为 123C8H 的内存单元,此时加法器的工作过程如下图所示:
知识拓展:
(1)一个数据的二进制形式左移 1 位,相当于该数据乘以 2;
(2)一个数据的二进制形式左移 n 位,相当于该数据乘以 2 的 N 次方;
(3)地址加法器如何完成段地址x16的运算?就是将以二进制形式存放的地址左移 4 位(计算机中所有的信息都是以二进制形式存储);有以上我们可以看出:一个数据的十六进制形式左移 1 位,相当于乘以 16;一个数据的十进制形式左移 1 位,相当于乘以 10;一个数据的 X 进制形式左移 1 位,相当于乘以 X。
四. ⛳️“物理地址=段地址x16+偏移地址” 的本质含义
本质含义:CPU 在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。更通俗的来说,8086CPU 的这种寻址功能是 “基础地址+偏移地址=物理地址” 寻址模式的一种具体实现方案。8086CPU中,段地址x16可以看作是基础地址。
五. ⛳️段的概念
错误认识:“段地址”这个名称中包含这“段”的概念,使人们误以为内存被划分成了一个一个段,每一个段有一个段地址。
其实,内存并没有分段。段的划分来自于CPU,8086CPU用 “基础地址(段地址×16)+偏移地址=物理地址” 的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。因此,我们可以认为地址 10000H-100FFH 的内存单元组成一个段,也可以认为地址 10000H-10007FH、10080H-100FFH 的内存单元组成两个段,如下图所示:
在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:
- 段地址x16必然是 16 的倍数,所以一个段的起始地址也一定是 16 的倍数;
- 偏移地址为 16 位,16 位地址的寻址能力为 64KB,所以一个段的长度最大为64KB。
知识拓展:
(1)CPU访问内存单元时,必须向内存提供内存单元的物理地址;
(2)CPU 可以用不同的段地址和偏移地址形成同一个物理地址,比如 CPU 要访问 21F60H 单元,则它给出的段地址 SA 和偏移地址 EA 满足 SAx16+EA=21F60H 即可;
(3)偏移地址 16 位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻 64KB 个内存单元,比如给定段地址 1000H,用偏移地址寻址,CPU 的寻址范围为:10000H~1FFFFH;
(4)在8086PC机中,存储单元的地址用两个元素来描述,即段地址和偏移地址;
(5)我们经常会使用:①数据存在内存 2000:1F60 单元中;②数据存在内存的 2000H 段中的 1F60H 单元中,这两种描述中的一种表示 “数据在内存单元 21F60H 单元中”。
六. ⛳️小结检测
5.1 🔔习题
(1):给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为_____到_____。
(2):有一数据存放在内存 20000H 单元中,现给定段地址为 SA,若想用偏移地址寻址到此单元。则 SA 应满足的条件是:最小为______,最大为______。(提示,反过来思考一下,当段地址给定为多少,CPU 无论怎么变化偏移地址都无法寻到20000H单元?)
5.2 🔔习题答案
注明:一天后习题答案将在评论区展示,一周或两周后将会把答案修订到文章中。
📝全文总结
本文主要讲解:
- 物理地址的定义:所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址;
- 16位结构的CPU特征:运算器一次最多可以处理 16 位的数据;寄存器的最大宽度为 16 位;寄存器和运算器之间的通路为 16位;
- 8086CPU给出物理地址的方法:物理地址=段地址x16+偏移地址;
- “物理地址=段地址x16+偏移地址” 的本质含义:CPU 在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址;
- 段的概念:实际内存并没有分段,但平常我们可以用分段的方式来管理内存。
今天的内容就到这里了,你对今天的内容是否有所掌握?如果还有疑问的话请在评论区里多多提问,大家可以一起帮你解决,让我们共同进步。创作不易,如果对你有用的的话点个赞支持下作者,你们的支持是作者创作最大的动力。关注我不迷路,让我们下期再见✋✋。