由于不同机器对于字长的定义不一致(可能是16bit,32bit或者其他),但是对于字节的长度都定义为8bit。所以实际上很少使用连续的字地址对字进行编码,通常会使用连续的字节地址对字节进行编码,使用该字的低位(或高位)的字节地址作为字地址。例如图一中所表示的IBM 370的字长是32bit,PDP-11的字长是16bit。他们的字节地址是连续的,字地址则分别是该字的低位和高位字节地址。
字节寻址的不同分类.jpg
- 当需要读出1或2字节的数据时,内存只能一次读出包含那1或2字节数据的4个字节,是这样吗?
是的。虽然字地址不是连续的,但存储器的数据带宽始终是与字长保持一致。
- 读出的4个字节都对应同一个地址,怎么从中找出我们需要的1或2字节数据呢?
读出的4个字节同属于一个字地址,但是又有各自的字节地址,所以会根据字节地址找到对应的字节。而每个字节又包含8个bit,它们是没有显示地址的,但是bit的相对位置可以作为一个隐式的地址,所以不会存在找不到对应数据的问题,毕竟大端小端的定义就是为了解决这个问题的。
- 如果数据小端存放,那0x12345678aabbccdd在内存中是0xaabbccdd,0x12345678(地址左低右高)这样存放的吗?
是的。在半字中,两个字节的顺序会保持与在字中一样的次序,也就是0x12345678aabbccdd在内存中是0xaabbccdd,0x12345678,至于二者谁先输后就要取决于大小端了。这方面的内容我只在《硬件架构的艺术》看到非常简单的描述。
网友评论