本篇文章为个人学习笔记,如有错误,欢迎指正!
当一个CPU的位数固定后,其一次性处理、传输和存储的位数是固定的,例如16位CPU一次性处理、传输和存储的位数都是16位。为了增加CPU的寻址能力,可以增加CPU的地址总线条数,例如16条地址总线的寻址能力为2的16次方,为64KB,20条地址总线的寻址能力为2的20次方,为1024KB,增加更多的总线会提高CPU的寻址能力。但是当CPU内部的位数固定时,如何匹配CPU的内部总线和寻址能力是个问题,比如如何让一个16位CPU匹配20位寻址能力? 8086计算机就属于此类情况。8086计算机CPU为16位,寻址能力位64KB(2^16),地址总线宽度为20位(2^20),寻址能力为1024KB。注意:要匹配两者的寻址能力,8086计算机将地址总线宽度拆分为2^(16+4)=2^16 X 2^4,将2^16设置为“偏移地址”,将2^4设置为“段地址”,可以在逻辑上(实际物理结构没有“段”的设置)理解为将所有地址分为16段,每段中包含2^16个地址,即实现1024KB的寻址能力。在操作中CPU给出2个16位地址,一个是“段地址”,另一个是“偏移地址”。设置“地址加法器”,将“段地址”X16后与“偏移地址”相加得到最终的物理地址。“X16”的目的就是将16进制数向高位偏移1位,也就是将其代表的二进制数向高位偏移4位(一个16进制数位等同于4位二进制数位)
注意:
- “段地址”和“偏移地址”的设置目的在于将16位CPU寄存器与20位地址总线进行匹配,即引入一种方法发挥计算机的最大能力,而在物理结构中的地址存储空间中并不存在“段”,“段”只是一个逻辑概念。
- “段”地址储存在16位的“段寄存器”中,由4位十六进制数表示,例如075AH(H代表十六进制)。在实际使用时,需要将“段地址(16位二进制数)”左移4位,即十六进制数“左移1位”而得到5位的十六进制“物理基础地址”,例如075AH左移位075A0H,由此看出,当指定段地址时,其末尾必须是0,即其十六进制数均为10H(或者16<十进制>)的倍数。而比较两个段地址(指“物理基础地址”的十六进制数字)时,他们都相差10H的整数倍,即16(十进制)的整数倍。
- 实际物理地址=段地址X10H(16<十进制>、2^4<二进制>)+偏移地址,所以对于固定的段地址,其寻址能力取决于偏移地址的个数,因为偏移地址存储在16位寄存器中,所以能够表示的最多地址数(二进制数)为2^16=65536字节=64K字节,因此对于固定的段地址,其最大寻址能力为64K。因为段地址都是10H(16<十进制>)的倍数,所以相邻不同的段地址之间相差10H(16<十进制>)个字节数,例如075A0H和075B0H,如果考虑两个段地址的最大寻址能力(64K字节数),可以看出这两个相邻段地址的寻址范围有很大一部分是重叠的。所以同一个“物理地址”可以由不同的“段地址”和“偏移地址”组成,只要满足:物理地址=段地址X16+偏移地址。也可以看出,对于1MB的寻址空间,最多可以指定不重叠的段地址数量为16个,最多可以指定重叠的段地址数量为2^16个。
- 在实际为内存单元分配地址时,为了便于理解,将内存单元分为以16个字节为单位的空间组,每个空间组就是1个逻辑段。当存储的字节数小于16个时,仅开辟一个逻辑段就够了;如果存储的字节数为16的整数倍时,就开辟整数倍个逻辑段;如果存储的字节数大于且不是16的整数倍时,就开辟(N/16+1)*16个逻辑段,其中N为字节数,“/”为取整运算。综合以上三种情况,实际存储的字节数计算公式为((N+15)/16)*16。