繁体   English   中英

如何对64位寄存器的低32位进行BSWAP?

[英]How to BSWAP the lower 32-bit of 64-bit register?

我一直在寻找有关如何将BSWAP用于64位寄存器的低32位子寄存器的答案。 例如, 0x0123456789abcdef位于RAX寄存器中,我想用一条指令将其更改为0x01234567efcdab89 (由于性能)。

所以我尝试了以下内联函数:

#define BSWAP(T) {  \
    __asm__ __volatile__ (  \
            "bswap %k0" \
            : "=q" (T)  \
            : "q" (T)); \
}

结果是0x00000000efcdab89 我不明白为什么编译器会这样。 有人知道有效的解决方案吗?

嗯,是的,我现在明白了这个问题:

x86-64处理器在执行32位操作(%eax,%ebx等)时, 会将 32位寄存器隐式扩展为64位。 据我了解,这是为了与希望这些寄存器具有32位语义的旧代码保持兼容性。

因此,恐怕无法对64位寄存器的低32位执行ror了。 您必须使用一系列的一些说明...

检查gcc生成的程序集输出! 使用gcc -s标志来编译代码并生成asm输出。

IIRC,x86-64在没有明确指示的情况下默认情况下使用32位整数,因此这可能是问题的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM