装配 - 为什么打印顺序相反?

时间:2012-07-23 06:12:11

标签: linux assembly x86

小端:

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.

2 个答案:

答案 0 :(得分:2)

0x12345678是一个32位值,它表示在一个小端系统上,0x78位于最低地址(让我们称之为地址addr),{ {1}}最高:

0x12

并且32位值 addr addr+1 addr+2 addr+3 single 32-bit number +----+ +----+ +----+ +----+ +--------------+ | 78 | | 56 | | 34 | | 12 | represents | 12345678 | +----+ +----+ +----+ +----+ +--------------+ 0x44434241一起保存在最低地址,0x41保存在最低地址:

0x44

但是你的第一个例子中的代码是 not 使用内存作为32位数字:它使用 addr addr+1 addr+2 addr+3 single 32-bit number +----+ +----+ +----+ +----+ +--------------+ | 41 | | 42 | | 43 | | 44 | represents | 44434241 | +----+ +----+ +----+ +----+ +--------------+ 系统调用来写一个字节序列< / em>到write。这个字节序列按它们存储在内存中的顺序写入:

stdout

答案 1 :(得分:1)

我相信这是正在发生的事情 - &gt; &#34;最常见的情况是指在单个16位,32位或64位字中如何排序字节,然后字节顺序与字节顺序相同。通常的对比是,最重要或最不重要的字节是先排序的,即在较大的数据项内的最低字节地址。&#34;

来自Wikipedia