字节对齐理解
为什么要字节对齐
原因是CPU访问数据的效率问题。
例如,8086处理器是16位的处理器,每次从处理器取16位的数据.
当需要从存储器取出一个字的数据时:如果要取0x1234,则cpu只需要一个总线周期即可取出;如果要去0x3456,cpu这时就需要两个总线周期,即第一次从00000H处取出0x1234,第二次从00002H处取出0x5678,再将两个数据的地位与高位合并才能得到0x3456.
字节对齐其实就是将0x3456这样的数据存到2的倍数的地址处(偶地址),这样一次总线周期就能读取完数据.我们利用牺牲空间的方法来换取效率.
奇偶分体
为什么8086只能从偶地址开始读取数据呢?这其实与存储器的结构有关。
8086系统中1M字节的存储器地址空间实际上分成两个512K字节的存储体—— “偶存储体”和“奇存储体”,偶存储体同8086的低8位数据总线D0~D7相连,奇存储体同 8086的高8位数据线D8~D15相连,地址总线的A1~A19同两个存储体中的地址线A0~A18 相连,最低位地址线A0和“总线高允许”BHE*用来分别选择偶存储体和奇存储体。这种连接方法称为“奇偶分体”。
从图中可以看出,A0与BHE *是奇偶体选择线,并且每次按字或字节取数据,我们可以分为三种情况:
- A0=0,BHE*=1:取偶地址的字节
- A0=1,BHE*=0:取奇地址的字节
- A0=0,BHE*=0:取一个字
当我们需要取一个字时,我们会同时选通两个存储体,并且A0=0,这就意味着无论每次给的地址数据是什么,它只选择A19~A1,A0总等于0,所以每次只能从偶地址开始读取数据
总结
读取一个字时
- 读取对齐字0x1234,0x12通过低位数据总线存入寄存器的低8位AL中,0x34通过高位数据总线存入寄存器的高8位AH中,总共一个总线周期
- 读取非对齐字0x3456,第一次按字节读取,将奇地址的0x34存入寄存器的AH中;第二次按字节读取,将偶地址的0x56存入寄存器的AL中,在整合得到0x3456,需要两个总线周期