内存是计算机中重要的部件之一,它是外存与CPU进行沟通的桥梁。
计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。
内存按功能划算可以分为RAM内存和ROM内存:
RAM内存,也叫主存,它允许CPU读取、写入数据,且断电后数据会清空;
ROM内存只允许CPU读取数据,且断电后数据不会被清空。
我们接下来可以带着几个问题去了解内存:
1、CPU是如何找到内存里的数据、指令的?
程序运行时的数据以及指令大部分都存放在内存,每个数据、指令都有自己的内存地址,CPU通过地址线查找到内存地址,最后去处理这些数据、指令。
我们第二篇文章讲到,可以想象内存是一个临时的仓库,仓库存放一些物品,每个物品都有自己的编号,这个编号就相当于内存地址,工作人员可以根据编号查找库存。
2、内存地址(编号)具体是什么形式的,它长什么样?
我们先下载两个辅助工具
下载DOSBox:DOSBox官网
debug、edit、link、masm等等(masm汇编开发工具)
首先我们下载安卓masm汇编开发工具,把它解压到目录,我们假定它解压目录是/Users/sv/Study/masm5
sv@MacBook-Pro masm5 % pwd
/Users/sv/Study/masm5
然后,我们下载dosbox,安装打开:
接着,我们挂载下masm解压目录,并执行debug d命令,如图1-3:
我们提取两行来解释:
如图1-5所示,内存地址图中由16进制表示(逢16进1,详细见第一篇文章),第一个00数据对应的内存地址为073F:0100,第二个00对应的内存地址为073F:0101,直到073F:010F第一行结束,第二行从073F:0110开始,以此类推。
3、为什么内存地址是073F:0100这种格式,而不是单独用0100来表示?
8086型号的CPU内部的地址总线只有16根,也就是只能访问到64KB(2^16B)的地址,但是为了能访问到更大的内存,8086外部地址总线采用了20根线,那么问题来了,内部16位,怎样才能产生外部的20位的地址呢?
其具体做法就是将其中的一个16位地址(被称为段地址)的值先乘以16,然后再加上另外一个16位地址(被称为偏移量或偏移地址),就得到一个20位的地址(被称为物理地址)了。
物理地址 = 段地址×16 + 偏移地址
以073F:0100为例:
073F表示段地址,0100为偏移地址。
073FH × 16 + 0100H = 073F0H + 0100H = 074F0H
最终得出073F:0100真实的物理地址为 074F0H