【发布时间】: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:那应该不错!但遗憾的是没有这样的指令!