80x86为何要求数据段的起始地址必须为16的倍数?

计算机的内存管理单元是以“字节”为最小单位进行线性编址的,字节是80x86CPU对内存管理的基元。为了标识每一个存储单元,就给每一个存储单元规定一个编号,该编号就是内存单元的物理地址。
存储单元的物理地址是一个16位的二进制数,物理地址一般采用16进制书写。
16位CPU内部拥有20根地址线,它的寻址范围就是2的20次方,也就是1M的内存空间。
可是16位CPU存放存储单元偏移量的寄存器(IP,SP,BP,SI,DI,BX)的编码范围仅为:00000H - 0FFFFH,也就是只能访问65536个存储单元,64K。
为了可以访问1M的内存空间,CPU就采用了内存分段的管理模式,而且在CPU内部加入了段寄存器。网络


首先说的是段寄存器的大小是16位的,其中放的是段值。一个物理地址的计算是段值*段的大小+段内偏移=1M;而段内偏移的范围是地址线位数或者指针寄存器的大小决定的,因此它的范围是0-64K。当为0时也就是段的起始地址,因此此时段的大小最小为16.不然不能等于1M。因此我认为既然是为了用16位表示20位的地址空间而采用的分段,因此段的 起始地址确定就是16的倍数了。编码

参考:80x86,完整的地址当初被设计为 段址*16+偏址,因此就要求段对齐在 16 的倍数上了。定为 16 应该是和当时内存容量的预期有关。这样的地址造成方式能够访问到 1M 的内存空间(网络找来的)spa