8

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

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

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

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

4

2 回答 2

5

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

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

所以恐怕没有办法ror处理 64 位寄存器的低 32 位。你将不得不使用一系列的几个指令......

于 2008-10-07T13:40:22.583 回答
-1

检查 gcc 生成的汇编输出!使用该gcc -s标志编译代码并生成 asm 输出。

IIRC,x86-64 默认情况下使用 32 位整数,而没有明确指示这样做,所以这可能是(部分)问题。

于 2008-10-07T02:10:29.200 回答