Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么打印顺序相反?_Linux_Assembly_X86 - Fatal编程技术网

Linux 为什么打印顺序相反?

Linux 为什么打印顺序相反?,linux,assembly,x86,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。我相信这就是正在发生的事情->“最常见的情况是指字节在单个16、32或64位字中的顺序,因此e

小恩迪亚:

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。

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


From

0x12345678
是一个32位的值,它在一个小尾端系统上表示,最低地址为
0x78
(我们称该地址为
addr
),最高地址为
0x12

 addr   addr+1  addr+2  addr+3                single 32-bit number
+----+  +----+  +----+  +----+                  +--------------+
| 78 |  | 56 |  | 34 |  | 12 |    represents    |   12345678   |
+----+  +----+  +----+  +----+                  +--------------+
 addr   addr+1  addr+2  addr+3                single 32-bit number
+----+  +----+  +----+  +----+                  +--------------+
| 41 |  | 42 |  | 43 |  | 44 |    represents    |   44434241   |
+----+  +----+  +----+  +----+                  +--------------+
32位值
0x44434241
存储在最低地址
0x41
和最高地址
0x44

 addr   addr+1  addr+2  addr+3                single 32-bit number
+----+  +----+  +----+  +----+                  +--------------+
| 78 |  | 56 |  | 34 |  | 12 |    represents    |   12345678   |
+----+  +----+  +----+  +----+                  +--------------+
 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
+----+

Little endian vs big endian问题?这意味着,它的顺序是相反的,这意味着它正在做你告诉它要做的事情?我被这个问题弄糊涂了,你说0x41在最低地址,0x44在最高地址,这是正确的,那么为什么会有问题呢?这可能是真的@harold,但因为结尾ianness,它是以另一种方式处理的。@MichaelOverhorst如果它是以另一种方式处理的,我可以理解为什么OP会混淆,但事实并非如此,因为他将其打印为文本,当然他不会问为什么41424344(又称0x44434241)是ABCD吗?我的困惑是因为我不明白上面的代码与下面的代码有什么区别:x:dd 0x12345678。在这个例子中,78位于最低字节,但数字仍然是0x12345678。在ABCD的例子中,最低字节是41,所以数字是0x44434241->那么为什么不是DCBA?+1用于ascii图表。你如何绘制文件l像这样好吗?有什么工具吗?那么…他应该使用格式化输出?这样就可以一次考虑全部4个字节?那么谁来解决endianess呢?只是好奇。@Aftnix我在iOS上也遇到了同样的问题,我的解决方案就是用“向后”写所有内容“这样,它会在向前的^ ^中读取。”AftNIX:是CPU在加载和存储时选择如何将多个字节视为某个较大宽度的单个值。如果
addr
处的字节序列是
0x41,0x42,0x43,0x44
,则从
addr
加载到寄存器中的字节将始终给出值
0x41
;16位加载将为小端CPU提供
0x4241
(或为大端CPU提供
0x4142
);32位加载将为little-endian提供
0x44434241
(或为big-endian提供
0x41424344
)@Aftnix:…我不使用任何用于ASCII图表的特殊工具-只是一个文本编辑器,有大量的复制和粘贴!