【问题标题】:How to move two 32 bit registers in to one 64 bit?如何将两个 32 位寄存器移入一个 64 位?
【发布时间】:2012-01-24 17:38:02
【问题描述】:

假设我想将两个 32 位寄存器 EAX 作为低 32 位字和 EDX 作为高 32 位字放入 RAX。 我找到了一种方法:

shl   rdx, 32
or    rax, rdx

这种方法只有在我们确定RAX的32到61位为0的情况下才有效。如果我们不确定,那么我们必须先清除高32位字,例如:

mov   eax, eax      //This instruction should clear the high 32 bit word of RAX

这是最短的路吗?

是否有一条 asm x86-64 指令可以执行此操作?

【问题讨论】:

  • AFAIK 没有比这更短的了。如果目标寄存器是 xmm 寄存器,你可以使用两条pinsd 指令,避免清除指令。
  • @drhirsch:我检查了几乎所有的英特尔文档,但没有发现任何有用的东西。 :)
  • 是的,您可以使用“xor eax, eax”来清除它,从而节省一点空间,但这似乎尽可能短。
  • @Nicholas Hembree:不,在 x86-64 下,指令 xor eax, eax 清除整个 RAX 寄存器!
  • @BlackBear:那应该不错!但遗憾的是没有这样的指令!

标签: assembly x86 move x86-64


【解决方案1】:

也许这样会好一点:

shl     rax,32
shrd    rax,rdx,32

不假设高位双字为零。

【讨论】:

  • 这是我正在寻找的组合。我知道它必须是 shrdshld
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2011-01-14
  • 2014-02-21
  • 2011-10-26
  • 2020-11-21
相关资源
最近更新 更多