我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案。例如,0x0123456789abcdef
位于 RAX 寄存器内,我想将其更改为0x01234567efcdab89
用一条指令(因为性能)。
所以我尝试了以下内联函数:
#define BSWAP(T) { \
__asm__ __volatile__ ( \
"bswap %k0" \
: "=q" (T) \
: "q" (T)); \
}
结果是0x00000000efcdab89
。我不明白为什么编译器会这样。有人知道有效的解决方案吗?
啊,是的,我现在明白了这个问题:
x86-64 处理器隐式零扩展 http://www.x86-64.org/documentation/assembly.html执行 32 位操作时(在 %eax、%ebx 等上),32 位寄存器转换为 64 位。据我了解,这是为了保持与传统代码的兼容性,这些代码需要这些寄存器的 32 位语义。
所以恐怕有no way to do ror
仅在 64 位寄存器的低 32 位上。你必须使用一系列的几个指令......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)