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

问题描述

我一直在寻找64位的等效bswap指令,但还没有找到任何东西。

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

mov rax,0x666E69

交换值后,寄存器 RAX 应包含以下内容

rax = 0x696E6600

我已经尝试过shl,shr,rol和ror,但没有任何效果。你能帮我么 ?谢谢。

解决方法

bswap eax将反转RAX的低4字节,将RAX as part of writing the result to EAX的高4字节清零。 32位操作数大小始终可用,您没有在64位模式下使用64位操作数大小。查看任何编译器输出的代码使用int,您会看到正在使用32位寄存器。另请参见The advantages of using 32bit registers/instructions in x86-64

事实上,bswap r32(1 uop,1c延迟)比主流英特尔(甚至包括Ice Lake)上的bswap r64(2 uop,2c延迟)https://uops.info/

低4个字节的正向和反向是
00 66 6E 69输入
69 6E 66 00 32位bswap结果

对于此输入,给出您想要的结果。如果您对非零高半部分的较大输入有其他要求,请说出。 (如果您拥有SSSE3,则可以在XMM寄存器上执行任意字节的随机播放;值得考虑的是,bswap r32还是bswap r64不是您想要的。