C++ lokale variable in assembler -> ungültiger operand

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
327
hallo. ich versuche per assembler eine bit rotation durchzuführen (32 bit anwendung).

Code:
 unsigned int number = 1234;
     __asm
    {
       ror number, 2
    }

das funktioniert. ich schaffe es aber nicht, den zweiten operand auch als variable zu übergeben

Code:
 unsigned int number = 1234;
 unsigned int bits = 2;
     __asm
    {
       ror number, bits
    }

erzeugt einen fehler: error C2415: Ungültiger Operandentyp

ich vermute, das hängt mit der registergröße zusammen. aber bits als char oder short zu deklarieren hilft auch nicht.
kann mir dabei jemand helfen?
 
Weil der Befehl ror wohl nicht auf 2 Speicherstellen angewendet werden kann.

ror [speicherstelle1],[speicherstelle2] geht eben nicht.
 
Die Verwendung von Inline-Assembler zerstört häufig viele Compileroptimierungen und daher wirkt dein Vorgehen eher Kontraproduktiv. Gute Compiler wie GCC oder MSVC erkennen auch viele Konstrukte für die Rotation und ersetzen diese automatisch durch die entsprechende Anweisung. Außerdem gibt es bei Microsoft die _rot-Intrinsics, die genau für diesen Zweck geschaffen wurden.
 
danke.
ich hatte jetzt zwischenzeitlich mal einen loop drin, der einfach bits mal um 1 rotiert, aber ich denke _rotr ist besser^^
 
Code:
#define rotl(i, n) (((i) << (n)) | ((i) >> (32 - (n))))
#define rotr(i, n) (rotl((i), (32 - (n))))

Oder, wenn man nicht weiß, wie groß i ist, den sizeof()-Operator einsetzen (statt 32 dann eben (sizeof(i) * 4).)
 
Zuletzt bearbeitet:
Zurück
Oben