Dies erzeugt zwei Bytes (0F 31) direkt in den Codestrom. Dies ist ein RDTSC-Befehl, der den Zeitstempel-Zähler in EDX: EAX liest, der dann durch die Ausgabebedingung "= A" (x) in die Variable 'x'
kopiert wird0F 31 ist der x86-Opcode für den Befehl RDTSC (Lesezeitstempelzähler); es legt den gelesenen Wert in die EDX- und EAX-Register.
Die Anweisung _ _ asm__ deklariert nicht nur zwei Bytes, sondern fügt Inline-Assembly in den C-Code ein. Vermutlich hat das Programm eine Möglichkeit, den Wert in diesen Registern unmittelbar danach zu verwenden.
Es wird ein 0F 31 Opcode eingefügt, der laut dieser Site lautet:
%Vor% Dann speichert es das Ergebnis in der Variable x
Es ist inline asm für rdtsc
, wobei die Maschinencode-Codierung so geschrieben ist, dass sie wirklich alte Assembler unterstützt die die mnemonic nicht kennen.
Leider funktioniert es nur in 32-Bit-Code korrekt, weil "=A"
64-Bit-Operanden nicht in der Hälfte in 64-Bit-Code aufteilt. (Das gcc-Handbuch verwendet sogar rdtsc
als Beispiel, um dies zu veranschaulichen )
Der sichere Weg dies zu schreiben, der mit gcc -m32 oder -m64 zu optimalem Code kompiliert wird, ist:
%Vor% Im 32-Bit-Code ist es nur rdtsc
/ ret
, aber im 64-Bit-Code macht es die notwendige Verschiebung / oder um beide Hälften in rax
für den Rückgabewert zu erhalten.
Siehe auf der Godbolt Compiler-Explorer .
Tags und Links c assembly x86 inline-assembly