X86 在64位ASM中。是否有一种只记录寄存器底部32位的好方法

X86 在64位ASM中。是否有一种只记录寄存器底部32位的好方法,x86,assembly,X86,Assembly,假设我们在RAX中有一些值。我们希望不改变RAX的低32位,而保持高32位不变。有什么好办法吗 命令如下: not eax 不幸的是,零扩展 我可以这样做: mov rbx,rax not ebx ; or not rbx and rax, 0xffffffff00000000 or rax, rbx 但感觉应该有更好的方法。您可以使用0x00000000ffffffff对其进行异或运算,这将翻转底部32位。@LarsViklund感谢您的更正。不知怎的,我看了看,然后说“0000ffff,

假设我们在RAX中有一些值。我们希望不改变RAX的低32位,而保持高32位不变。有什么好办法吗

命令如下:

not eax
不幸的是,零扩展

我可以这样做:

mov rbx,rax
not ebx ; or not rbx
and rax, 0xffffffff00000000
or rax, rbx

但感觉应该有更好的方法。

您可以使用
0x00000000ffffffff
对其进行异或运算,这将翻转底部32位。

@LarsViklund感谢您的更正。不知怎的,我看了看,然后说“0000ffff,那是32位。”是的,但我想要64位,最下面的32位是1。@Vatine,谢谢,我知道这必须很简单。一个问题是XOR只需要32位带符号的立即数,所以你需要在内存中使用64位值进行XOR,或者使用64位立即数的MOV,然后使用XOR。@rcgldr您可以将其设置为32位MOV,以节省一些空间。您甚至可以将其设置为
或r32,-1
,以获得最小空间,但它有一个伪依赖项。@rwong:您可以将
0x00000000ffffffffff
放入带有
movsx eax,字节[减一]
的寄存器中
movsx
movzx
不能以直接操作数形式提供。所以我建议
moveax,-1
将是最快的方法。(或者harold的
或eax,-1
更短,如果你有一个死寄存器(就依赖链而言)也一样快。)我可能不正确,但我认为你想要一个64位的
0xffffffff00000000
,而不是你目前得到的32位值(这会导致16-31位保持不变,其他所有的值都归零).我没有好好思考就打字了。编辑,谢谢