Assembly 如何使用NASM交换64位寄存器中的字节?

Assembly 如何使用NASM交换64位寄存器中的字节?,assembly,x86-64,nasm,endianness,Assembly,X86 64,Nasm,Endianness,我一直在搜索64位的等效bswap指令,但还没有找到任何内容 假设我在寄存器RAX中有以下内容: mov rax, 0x666E69 交换值后,寄存器RAX应包含以下内容: rax = 0x696E6600 我已经试过shl、shr、rol和ror,但都没用。你能帮帮我吗?谢谢。bswap eax将反转RAX的低位4字节,将RAX的高位4字节归零32位操作数大小始终可用,您不必在64位模式下使用64位操作数大小。查看使用int的任何编译器输出代码,您将看到正在使用32位寄存器。另见 事实上,

我一直在搜索64位的等效bswap指令,但还没有找到任何内容

假设我在寄存器RAX中有以下内容:

mov rax, 0x666E69
交换值后,寄存器RAX应包含以下内容:

rax = 0x696E6600

我已经试过shl、shr、rol和ror,但都没用。你能帮帮我吗?谢谢。

bswap eax将反转RAX的低位4字节,将RAX的高位4字节归零32位操作数大小始终可用,您不必在64位模式下使用64位操作数大小。查看使用
int
的任何编译器输出代码,您将看到正在使用32位寄存器。另见

事实上,
bswap r32
比主流Intel(包括Ice Lake)上的
bswap r64
(2 uop,2c延迟)更快(1 uop,1c延迟)

低4字节正向和反向为
00666e69
input
69 6E 66 00
32位结果


这就给出了这个输入所需的结果。如果您对具有非零高半部的较大输入有其他要求,请这样说。(如果您有SSSE3,您可以在XMM寄存器上执行任意字节洗牌;如果
bswap r32
bswap r64
不是您想要的,那么值得考虑。

如果您想交换64位,我希望输入666E69h会产生696E6600亿小时。是哪一个?如果您不能在一条指令中完成,请使用多个指令。)您提供的是正确的,我犯了一个错误,我用32位寄存器作为示例bwsapeax@ErikEidt你能告诉我更多的细节吗?你的问题是修复预期的输入和输出。不管怎样,
bswap
也可以使用32位和64位。这两种方式都不能产生你想要的结果吗?