【发布时间】:2019-09-24 06:06:17
【问题描述】:
假设使用这个 32 位数字 66 DD FA EB。
小端序
0 x 100 ---> 66 (MSB)
0 x 99 ---> DD
0 x 98 ---> FA
0 x 97 ---> EB (LSB)
大端序
0 x 100 ---> EB (LSB)
0 x 99 ---> FA
0 x 98 ---> DD
0 x 97 ---> 66 (MSB)
我相信已经理解了存储字节的正确顺序。
但是我的问题是,访问这个 4 字节字时首先读取哪个字节?
总是首先读取具有最低地址的字节,然后根据计算机的字节序将其定位为最高有效或最低有效?
我试图更好地解释自己。 以上面的 LITTLE ENDIAN 为例。
我想要的正确顺序是 66 DD FA EB
现在要实现这一点,我可以读取地址最低的字节并将其放在页面的右侧,然后继续向左读取以下字节。
EB
FA EB
DD FA EB
66 DD FA EB
结果是 66 DD FA EB,这是正确的。
或者我可以从地址最高的字节读取,将其放在页面的左侧,然后继续向右读取以下字节
66
66 DD
66 DD FA
66 DD FA EB
结果总是 66 DD FA EB,这是正确的。
由于字的内存地址是第一个字节的地址(最低地址),与字节序无关,我假设总是先读取第一个字节(最低地址),然后定位到正确的顺序。
所以我的最后一个问题是,
我之前展示的两种模式中的哪一种被小端序的计算机用来读取建议示例中的 4 字节字?
【问题讨论】:
-
这是一个理论问题,cpus 不是这样工作的。他们读取单词甚至更大的单元(缓存行)。但第一个版本更有意义。正如你所说,你从低地址开始。
-
感谢您的回答。作为一个字一组字节,就算一次性读完,我想总有一个起点可以开始读吧?
-
0x99之后的地址不是0x100;它是 0x9a。 32 位值通常从 4 的倍数的地址开始放置,而不是奇数地址,例如 0x97。使用字节地址 0x100、0x101、0x102 和 0x103 的示例(对我来说)会更清楚。
-
没有先读取。它们都被同时读取。除非您谈论的是带有小型(16 或 8 位数据总线)的非常旧的 CPU,否则它取决于 CPU。通常先读取低字节,但不一定如此。
-
再次嗨 :) 不,你的理解是错误的——在 32 位/64 位 CPU 上,如果 CPU 读取一个单词——它会将整个单词作为一个单元读取。没有“从哪个字节开始”的概念。当你拿一盒火柴时——你拿整盒火柴,你不会从一个单独的火柴开始这样做。
标签: assembly cpu-architecture endianness