Wie BSWAP das untere 32-Bit-64-Bit-Register BSWAP?

8

Ich habe nach der Antwort gesucht, wie man BSWAP für das untere 32-Bit-Teilregister des 64-Bit-Registers verwendet. Zum Beispiel ist 0x0123456789abcdef im RAX-Register und ich möchte es mit einer einzigen Anweisung (wegen der Leistung) in 0x01234567efcdab89 ändern.

Also habe ich versucht, der Inline-Funktion zu folgen:

%Vor%

Und das Ergebnis war 0x00000000efcdab89 . Ich verstehe nicht, warum der Compiler so handelt. Kennt jemand die effiziente Lösung?

    
user25683 07.10.2008, 02:02
quelle

2 Antworten

5

Ah, ja, ich verstehe das Problem jetzt:

die x86-64 Prozessoren implizit Null-extend die 32- Bit-Register zu 64-Bit bei 32-Bit-Operationen (auf% eax,% ebx, etc). Dies ist, um Kompatibilität mit Legacy-Code zu erhalten, der 32-Bit-Semantik für diese Register erwartet, wie ich es verstehe.

Ich fürchte also, dass <%> keine Möglichkeit < ror nur für die unteren 32 Bits eines 64-Bit-Registers gibt. Sie müssen eine Reihe von Anweisungen verwenden ...

    
Dan Lenski 07.10.2008, 13:40
quelle
-1

Überprüfen Sie die von gcc! Verwenden Sie das Flag gcc -s , um den Code zu kompilieren und asm-Ausgabe zu generieren.

IIRC, x86-64 verwendet standardmäßig 32-Bit-Ganzzahlen, wenn nicht explizit darauf hingewiesen wird, dies zu tun (dies kann ein Teil des Problems sein).

    
Dan Lenski 07.10.2008 02:10
quelle

Tags und Links