关于微机原理的20位偏移地址计算

微机原理中计算20位偏移地址为16位段地址左移4位再加上16位偏移地址得20位物理地址.为什么不加上4位偏移量就得到20位偏移地址了?如果加上16位偏移地址,很可能在高位进位造成不同的段地址和不同的偏移地址算得同样的物理地址,这样不是出错了吗?

首先,没有你说的4位偏移地址的说法,具体来说是因为在8086中,寄存器都是16位,这样你就只能访问16位地址的空间,不过8086还有段寄存器,就是CS,DS等,他们也是16位,也许你会说,16位加16位岂不是可以访问32位的4G地址吗?不过很可惜,之前的内存都没有这么大,所以当时只用了1M。所以在计算方法上,用两个16位的寄存器来访问20位的地址,就采用了段地址+偏移地址的作法,即:段地址*16+偏移地址,这样,你就可以使用一个固定的段地址,随意的访问64K的段地址空间的所有存储空间了。
其实,Intel为了之后的芯片向上兼容,还在使用段地址加偏移地址的做法,即使现在其他寄存器是32位或是64位了,段寄存器依然是16位,只不过现在不是*16了,而把他作为段描述符,其实也是用来描述一个段地址空间,只是这个段地址空间可能就不止64K了,32位机上就是4G了。这个就扯远了。呵呵。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-29
段地址乘以16,相当于左移4位,这样就有20位,加上4位偏移量就是实际地址
第2个回答  2010-01-29
左移4位移位操作相当于做了乘法,得到的是20位的值;如果直接加上4位偏移量虽然是得到20位的值,但是高位至少有三个值是零,并不能扩展到有效地20位;
加上16位偏移地址,是有可能在高位进位造成不同的段地址和不同的偏移地址算得同样的物理地址,也可以说,不同的逻辑地址可以对应同一个物理地址,并不出错。原因是由于微机的寻址方式决定的。这部分不容易理解,不过你可以自己写几个小汇编程序,debug进去,用R命令、D名观察一下。
相似回答