小端:
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。
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
+----+
我相信这是正在发生的事情->“最常见的情况是指字节在单个 16、32 或 64 位字中的排序方式,并且字节顺序与字节顺序相同。通常的对比是在较大的数据项中,最高有效字节还是最低有效字节首先排序——即,在最低字节地址。”
来自维基百科