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?
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 ...
Ü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).
Tags und Links c gcc 64bit endianness