我一直在寻找如何将BSWAP用于64位寄存器的低32位子寄存器的答案.例如,0x0123456789abcdef
在RAX寄存器中,我想0x01234567efcdab89
用一条指令将其更改为(由于性能).
所以我尝试了以下内联函数:
#define BSWAP(T) { \
__asm__ __volatile__ ( \
"bswap %k0" \
: "=q" (T) \
: "q" (T)); \
}
结果是0x00000000efcdab89
.我不明白为什么编译器就像这样.有人知道有效的解决方案吗?
啊,是的,我现在明白了这个问题:
执行32位操作时,x86-64处理器将 32位寄存器隐式零扩展为64位(在%eax,%ebx等上).这是为了保持与遗留代码的兼容性,遗留代码需要这些寄存器的32位语义,据我所知.
所以我担心没有办法ror
只对64位寄存器的低32位做.你必须使用一系列的几个指令......