好的,这个问题听起来很简单,但是我很惊讶。在古老的1 MB内存巨大的日子里,Intel试图找出如何使用16位来访问1 MB内存的方法。他们提出了使用段和偏移地址值生成20位地址的想法。

现在,20位给出2 ^ 20 = 1,048,576个可以寻址的位置。现在假设我们每个地址位置访问1个字节,我们得到1,048,576/(1024 * 1024)= 2 ^ 20/2 ^ 20兆字节= 1兆字节。好的,明白了。

困惑来了,在古老的8086中我们拥有16位数据总线,并且一次只能访问2个字节而不是1个字节,这等于20位地址可以访问总共2 MB的数据,对吗?当数据总线为2字节宽时,为什么我们假定每个地址中只存储1个字节?我在这里很困惑。

最佳答案

试图理解这一点时,考虑总线是非常重要的。这可能是电气问题,而不是软件问题,但这是答案:

对于8086,当从ROM读取时,不使用最低有效地址线(A0),此后立即将地址线的数量减少到19。

如果CPU需要从奇数地址读取16位,例如0x3和0x4的字节,它将实际上执行两次16位读取:一次从0x2读取,一次从0x4读取,并丢弃字节0x2和0x5。

对于8位ROM读取,总线上的读取仍然是16位,但是不需要的字节将被丢弃。

但是对于RAM,有时只需要写入一个字节,这会变得更加复杂。处理器上还有一个额外的输出信号,称为BHE#(总线高电平使能)。 A0和BHE#的组合用于确定写入是8位还是16位宽,以及写入的地址是奇数还是偶数。

了解这两个信号是回答您的问题的关键。尽可能简单地说明一下:

8位偶数访问:A0 OFF,BHE#OFF

8位奇数访问:A0开启,BHE#开启

16位访问(必须为偶数):A0 OFF,BHE#ON

而且我们不能通过A0 ON和BHE#OFF来进行总线循环,因为对总线偶数字节的奇数访问是没有意义的。

这与您最初的理解有关:对于存储设备,您是完全正确的。一个1兆字节的16位内存芯片实际上只有19条地址线,对于该芯片,16位是一个字节,实际上,它们实际上没有A0地址输入。

... 几乎。 16位可写存储设备有两个额外的信号(BHE#和BLE#),它们分别连接到CPU的BHE#和A0。这样,他们知道在进行8位访问时会忽略总线的一部分,从而使它们成为8/16位混合设备。 ROM芯片没有这些信号。

对于不启发的硬件,这是我们在此涉及的相当复杂的领域,并且在性能方面以及在具有8位和16位硬件混合的大型系统中,确实确实非常复杂。

8086 datasheet中对此进行了详尽的解释

关于memory - 为什么在16位计算机上使用20个地址空间可以访问1 MB而不是2 MB?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18470756/

10-11 18:53