试图理解这一点时,考虑总线非常重要.这可能是电气问题,而不是软件问题,但这是答案:
对于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 ON,BHE#ON
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位硬件的大型系统中,确实确实变得非常复杂.