汇编语言入门:地址和段的概念
地址是CPU访问内存信息的索引凭证
仍然围绕16位CPU展开(王爽老师《汇编语言》)
物理地址
CPU访问内存单元时要给出内存单元的地址;所有的内存单元构成的存储空间是一个一维的线性空间(显卡、网卡……都有自己的内存空间)
我们将这个唯一的地址称为物理地址
16位CPU的特点
1. 运算器一次可以处理16位的数据
2. 寄存器的最大宽度位16位
3. 寄存器和运算器之间的通路是16位的
8086CPU给出地址,读写内存
1. CPU的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
3. 地址加法器将两个16位地址合并成一个20位的地址
地址加法器的工作原理:物理地址=段地址x16+偏移地址
例如,8086CPU访问地址为123C8H的内存单元:
“段地址x16”更常见的说法是“数据左移4个二进制位”
一个数据的二进制形式左移N位相当于乘以2^N
段的概念
内存并没有被分段,段的划分来自于CPU(“段”是概念上的)
由于8086CPU用“段地址x16+偏移地址=物理地址”的方式给出内存单元的物理地址,我们用分段的方式来管理内存
因为一个地址的起始地址=段地址x16,所以一个段的其实地址必然是16的倍数
偏移地址位16位,16位地址的寻址能力位64k,所以一个段的长度最大位64k(64kB)
举几个例子说明“一个物理地址可以由多种不同的段地址和偏移地址组成”:
如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位64k个内存单元:分析,偏移地址16位,变化范围位0~FFFF;比如,给定段地址1000H,仅通过偏移地址,CPU的寻址范围为1000H~1FFFFH
数据在某某内存单元中,可以有两种描述方式:例如数据在21F60H的内存单元中,对于8086PC机有的两种描述:1. 数据存在内存2000: 1F60单元中,2. 数据存在内存的200段中的1F60单元中
可能根据需要,将地址连续、其起始地址为16倍数的一组内存单元定义为一个段(再次强调,“段”仅是概念上的东西!)
最后再次说明,CPU只看物理地址
下一篇文章讲解“段寄存器”……