【发布时间】:2021-12-12 13:17:23
【问题描述】:
我已经得出一个结论,即在小端和大端中。
我们从左到右写入内存,这意味着数字 0x00FF 在两个系统中都将被写入如下:
1000:00
1001:FF
但是字节序的读取不同。
我们会在 little endian 中读取这两个字节
1000:00
1001:FF
作为 0xFF00 和大端,我们将其读取为 0x00FF
现在你可能会说为什么如果我这样做:
mov word [esp],0x00FF
在 little endian 处理器中,结果将是 0x00FF,但我说在 little endian 中,结果将是 0xFF00,所以它完全揭穿了我所说的。
好吧,看来汇编程序只是将数字反转为 0xFF00 看看:
如果汇编器不反转数字,我们会将其读取为 0xFF00。
所以基本上是因为汇编器把它颠倒了,我们把数字写成
1000:FF
1001:00
在内存中,我们将从最低有效字节开始读取它,因此我们将得到 0x00FF
我是对的,还是它的工作方式不同?
【问题讨论】:
-
数字 0x00FF 在两个系统中都会写成如下。如果您将其写为单个指令中的一个字而不是一次一个字节,则不正确。
-
如果计算机系统以一种格式写入字节并以另一种格式读取它们,它将如何工作?内存的全部意义在于能够往返值 - 写入的内容在读取时应该返回相同的值。两种字节序系统都将字节从低位写入高位(地址方面),只是小字节序中的低字节在较大字长的情况下不太重要(读取和写入)。
-
@AngryJohn 汇编器不会convert 0x00FF 到 0xFF00。发生的情况是,在小端架构中,如果您将一个值为 0x00FF 的字写入内存,它将 LSB 写入较低地址,将 MSB 写入较高地址。回读与此一致。说 0x00FF 被“转换”为 0xFF00 是说交换了字节以使 FF 为 MSB,但事实并非如此。正如我在第一条评论中提到的,您在两个系统中以相同方式编写的语句(00 写入地址 1000,FF 写入地址 1001)是不正确的。
-
@AngryJohn 我无法解释这张图片,因为我不知道你的图片来自哪里,也不知道在每个平台上执行了哪些指令导致了这张图片。您没有提供足够的信息。
-
与Are machine code instructions fetched in little endian 4-byte words on an Intel x86-64 architecture? 几乎重复 - x86 机器码以 little-endian 形式存储立即数,因此存储立即数指令将它们的立即数从机器码原封不动地复制到目标位置。