【问题标题】:Operations and endianess操作和字节序
【发布时间】:2016-06-23 22:30:01
【问题描述】:

我通过使用 gdb 看到,当使用的系统采用小端方法时,当字节从内存复制到寄存器时,它们会被反转。

因为,据我所知,x86 汇编指令集不允许操作数都在内存中的操作,我想知道:是否有任何操作直接对小端值执行而无需先反转?

【问题讨论】:

  • 您可以有 2 个内存操作数,但至少其中一个必须是隐式的。参见例如pushpopmovs。我不明白你的其余问题,或者为什么它需要 2 个内存操作数。例如add [foo], eax 是合法的并且对内存进行操作。
  • 我的意思是:考虑操作 add -0x8(%ebp), %eax。它所做的是从内存中获取第一个值,将其反转,然后将其添加到 eax 的内容中。最后将结果存储在 eax 中。我的问题是:是否有任何操作(除了用于移动内存的操作)不会反转内存操作数?
  • 它不是“反转”的,它以正确的顺序在内存中并以正确的顺序从内存中读取,ls 字节通道首先,ms 字节通道最后,控制器将字节放在正确的字节通道上,就像在大端机器上,控制器将字节放在正确的字节通道上。 x86 允许未对齐,因此它甚至比它必须获取任何通道中的字节并将它们移动到正确的通道(在总线上或处理器内核内部之后,取决于设计)更糟糕。
  • 任何基于字节的东西都没有字节序,或者至少从你解释事物的方式来看。该字节在基于地址的 32 位或 64 位内存中仍然是一个字节顺序的事情(并且必须移动到总线上正确的字节通道)。但是没有你所说的“逆转”。
  • 你觉得add %eax, -0x8(%ebp)怎么样?

标签: assembly endianness


【解决方案1】:

这个答案对于有经验的人来说可能有点奇怪,但提问者正在寻找的是MOVBE。它确实将数据原样(!)(与他的论点有关)复制到寄存器中。它并非在所有架构上都可用,但仍然是解决此特定问题的最佳解决方案。所以回答

我想知道:是否有任何操作直接对小端值执行而不先反转?

是的:MOVBE 确实按要求的顺序复制字节。

【讨论】:

  • 我相信有经验的人试图说,movbe 是反转字节的人。 Endianess 是由于处理器的内部布线,当然 Intel 没有为了反话而浪费晶体管。您似乎在传播误解,即寄存器值是用于显示它的数字。我们不知道像 RAX 这样的寄存器是如何加载的,我们只知道低地址的字节进入 AL(低字节),反之亦然。如果 AL 实际上是 56-63 位或 0-7 位,我们不知道。
猜你喜欢
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多