内存的分段表示法
内存分段表示法
1.什么是内存?
内存(Memeory)是计算机中最重要的部件之一,它是程序与 CPU 进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为主存,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后 CPU 再将结果传送出来,主存的运行也决定了计算机的稳定运行。
2.内存的物理结构
![](/2020/10/08/%E5%86%85%E5%AD%98%E7%9A%84%E5%88%86%E6%AE%B5%E8%A1%A8%E7%A4%BA%E6%B3%95/2020-10-09-15-45-08.png)
内存的内部是由各种 IC 电路组成的,它的种类很庞大,但是其主要分为三种存储器:
随机存储器(RAM)
:内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会 丢失。只读存储器(ROM):
ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。高速缓存(Cache):
Cache 也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于内存和 CPU 之间,是一个读写速度比内存更快的存储器。当 CPU 向内存写入数据时,这些数据也会被写入高速缓存中。当 CPU 需要读取数据时,会直接从高速缓存中直接读取,当然,如需要的数据在 Cache 中没有,CPU 会再去读取内存中的数据。
内存 IC 是一个完整的结构,它内部也有电源、地址信号、数据信号、控制信号和用于寻址的 IC 引脚来进行数据的读写。下面是一个虚拟的 IC 引脚示意图:
![](/2020/10/08/%E5%86%85%E5%AD%98%E7%9A%84%E5%88%86%E6%AE%B5%E8%A1%A8%E7%A4%BA%E6%B3%95/2020-10-09-15-48-25.png)
note:
图中 VCC 和 GND 表示电源,A0 - A9
是地址信号
的引脚,D0 - D7
表示的是数据信号
、RD
和WR
都是控制信号
,我用不同的颜色进行了区分,将电源连接到 VCC 和 GND 后,就可以对其他引脚传递 0 和 1 的信号,大多数情况下,+5V
表示 1,0V
表示 0。我们都知道内存是用来存储数据,那么这个内存 IC 中能存储多少数据呢?D0 - D7 表示的是数据信号,也就是说,一次可以输入输出 8 bit = 1 byte 的数据。A0 - A9 是地址信号共十个,表示可以指定 00000 00000 - 11111 11111 共 2 的 10 次方 = 1024 个地址。每个地址都会存放 1 byte 的数据,因此我们可以得出内存 IC 的容量就是 1 KB。
如果我们使用的是 512 MB 的内存,这就相当于是 512000(512 * 1000) 个内存 IC。当然,一台计算机不太可能有这么多个内存 IC ,然而,通常情况下,一个内存 IC 会有更多的引脚,也就能存储更多数据。
4. 确定物理地址的方法
- CPU 访问内存单元时要给出内存单元的地址。
- 所有内存单元构成的存储空间是一个一维的线性空间。
- 每一个内存单元在这个空间中有唯一的地址,这个唯一的地址称为
物理地址
。
物理地址对应的是 5 位的 16 进制数,相当于 20 位的二进制数
4. 事实
4.1 8086 有 20 位地址总线,可传送 20 位地址,寻址能力为1M
。
![](/2020/10/08/%E5%86%85%E5%AD%98%E7%9A%84%E5%88%86%E6%AE%B5%E8%A1%A8%E7%A4%BA%E6%B3%95/2020-10-09-16-54-03.png)
4.2 8086 是 16 位结构 CPU
4.2.1 运算器一次最多可以处理 16 位的数据,寄存器的最大宽度为 16 位。
4.2.2 在 8086 内存处理的、传输、暂存的地址也是 16 位,寻址能力也只有64kb
问题: 8086 如何处理在寻址空间上的这个矛盾?!
![](/2020/10/08/%E5%86%85%E5%AD%98%E7%9A%84%E5%88%86%E6%AE%B5%E8%A1%A8%E7%A4%BA%E6%B3%95/2020-10-09-16-33-06.png)
5.用分段的方式管理内存
8086CPU 用”(段地址 x16)+偏移地址=物理地址”的方式给出内存单元的物理地址.
Note:
段地址 x16:相当于左移 4 位2*2*2*2
将内存分成若干个段,内存并没有分段,段的划分来自于CPU
!!!
内存是一块连续的区域,先对内存进行分段,然后具体到哪个物理地址,通过结合偏移地址来计算。
![](/2020/10/08/%E5%86%85%E5%AD%98%E7%9A%84%E5%88%86%E6%AE%B5%E8%A1%A8%E7%A4%BA%E6%B3%95/2020-10-09-16-01-31.png)
![](/2020/10/08/%E5%86%85%E5%AD%98%E7%9A%84%E5%88%86%E6%AE%B5%E8%A1%A8%E7%A4%BA%E6%B3%95/2020-10-09-16-04-46.png)
6. 用不同的段地址和偏移地址形成同一个物理地址
![](/2020/10/08/%E5%86%85%E5%AD%98%E7%9A%84%E5%88%86%E6%AE%B5%E8%A1%A8%E7%A4%BA%E6%B3%95/2020-10-09-16-11-42.png)
物理地址 | 段地址 | 偏移地址 |
---|---|---|
21F60H | 2000H | 1F60H |
Note:
21F60
HH 为 hex 的缩写. 表示十六进制
21F60H 表示为十六进制地址。
计算示例
物理地址 = 段地址 * 16 (左移 4 位) + 偏移地址
21F60H - 20000H = 1F60H
2000
0
H 为左移 4 位,原理百度二进制与十六进制的转换.
我们把 8086 丰富的取址方式用活了,也就是把汇编语言学会了.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!