问题描述
我一直在寻找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
不是您想要的。