2

小端:

mov eax,4
push dword  0x44434241
mov ebx,1
mov ecx,esp
mov edx,4
int 0x80
add esp,4

我不明白为什么它打印 ABCD 而不是 DCBA。41在最低地址,44在最高地址,为什么?例如,当我写

x: dd 0x12345678

78 在最低地址,但这里的数字仍然不是 78563412 而是 12345678。

4

2 回答 2

2

0x12345678是一个 32 位的值,它在一个 little-endian 系统上表示0x78,最低地址(我们称之为 address addr)和0x12最高地址:

 addr   addr+1  addr+2  addr+3                single 32-bit number
+----+  +----+  +----+  +----+                  +--------------+
| 78 |  | 56 |  | 34 |  | 12 |    represents    |   12345678   |
+----+  +----+  +----+  +----+                  +--------------+

并且 32 位值0x44434241存储0x41在最低地址和0x44最高地址:

 addr   addr+1  addr+2  addr+3                single 32-bit number
+----+  +----+  +----+  +----+                  +--------------+
| 41 |  | 42 |  | 43 |  | 44 |    represents    |   44434241   |
+----+  +----+  +----+  +----+                  +--------------+

但是您的第一个示例中的代码没有将内存用作 32 位数字:它使用write系统调用将字节序列写入stdout. 这个字节序列是按照它们在内存中存储的顺序写入的:

 addr
+----+
| 41 |    =>   single byte 'A' is printed, then...
+----+

addr+1
+----+
| 42 |    =>   ...single byte 'B' is printed, then...
+----+

addr+2
+----+
| 43 |    =>   ...single byte 'C' is printed, then...
+----+

addr+3
+----+
| 44 |    =>   ...single byte 'D' is printed
+----+
于 2012-07-23T19:58:10.543 回答
1

我相信这是正在发生的事情->“最常见的情况是指字节在单个 16、32 或 64 位字中的排序方式,并且字节顺序与字节顺序相同。通常的对比是在较大的数据项中,最高有效字节还是最低有效字节首先排序——即,在最低字节地址。”

来自维基百科

于 2012-07-23T06:15:54.210 回答