- nicehost
-
8086 CPU有20根地址线引脚,所以,它访问内存时的物理地址是20位的二进制数。
8086 CPU是16位微处理器,一次只能处理、传送一个16位的数。
为了用16位的二进制数表示20位的物理地址,INTEL设计时规定用2个16位数组合成一个逻辑地址,按规定算法生成20位的物理地址。这样,就形成了段地址、偏移地址的概念。
8086的内存访问,采用分段访问的方式。
每64KB一个段,这样,在段内,用一个16位的偏移地址可遍历访问。
而每个段的段首的物理地址,规定为一个20位的、且是16的整数倍的数。
因为它是16的整数倍,因此这个20位二进制数的最低4位一定是0 。
忽略这最后的4个0,剩下前面部分正好是16位,可以用一个16位的二进制数表示。
这个16位数,就是段地址。
也就是说,段地址(16位二进制数),是段的首物理地址(20位二进制数)的高16位部分。
二进制格式16位的段地址,改写成20位的段的首物理地址,就是在最后补上省略掉的4个0 。
二进制数后面加4个0,就是乘以16。
这就是乘以16的原因。
- LuckySXyd
-
16位系统的内存是1M,1M约等于2的20次方,而cpu的寄存器是16位的,能寻址的范围最大为2的16次方,如果在此最大值上乘以16,正好为2的20次方,即1M。
说白了就是为了寻址1M的内存空间。
- 蓓蓓
-
把两个 16 位二进制数,合成为 20 位数,X16 是最好的方法。
追问:
当segment=0,offset=0时,找到的地址是0
当segment=2^16,offset>0时,这时segment*16=2^20,此时segment*16+offset不是越界了吗?
越就越了呗,80286 就用上了。