【发布时间】:2016-06-23 22:30:01
【问题描述】:
我通过使用 gdb 看到,当使用的系统采用小端方法时,当字节从内存复制到寄存器时,它们会被反转。
因为,据我所知,x86 汇编指令集不允许操作数都在内存中的操作,我想知道:是否有任何操作直接对小端值执行而无需先反转?
【问题讨论】:
-
您可以有 2 个内存操作数,但至少其中一个必须是隐式的。参见例如
push、pop或movs。我不明白你的其余问题,或者为什么它需要 2 个内存操作数。例如add [foo], eax是合法的并且对内存进行操作。 -
我的意思是:考虑操作 add -0x8(%ebp), %eax。它所做的是从内存中获取第一个值,将其反转,然后将其添加到 eax 的内容中。最后将结果存储在 eax 中。我的问题是:是否有任何操作(除了用于移动内存的操作)不会反转内存操作数?
-
它不是“反转”的,它以正确的顺序在内存中并以正确的顺序从内存中读取,ls 字节通道首先,ms 字节通道最后,控制器将字节放在正确的字节通道上,就像在大端机器上,控制器将字节放在正确的字节通道上。 x86 允许未对齐,因此它甚至比它必须获取任何通道中的字节并将它们移动到正确的通道(在总线上或处理器内核内部之后,取决于设计)更糟糕。
-
任何基于字节的东西都没有字节序,或者至少从你解释事物的方式来看。该字节在基于地址的 32 位或 64 位内存中仍然是一个字节顺序的事情(并且必须移动到总线上正确的字节通道)。但是没有你所说的“逆转”。
-
你觉得
add %eax, -0x8(%ebp)怎么样?
标签: assembly endianness