簡體   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