Was macht diese x86-Inline-Assembly?

8

Ich bin auf diesen Code gestoßen und muss verstehen, was er tut. Es scheint nur zwei Bytes zu deklarieren und dann nichts zu tun ...

%Vor%

Danke!

    
MK. 13.08.2009, 17:14
quelle

4 Antworten

11

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 wird     
Chris Dodd 13.08.2009, 17:26
quelle
4

0F 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.

Ссылка

    
Ian Clelland 13.08.2009 17:27
quelle
2

Es wird ein 0F 31 Opcode eingefügt, der laut dieser Site lautet:

%Vor%

Dann speichert es das Ergebnis in der Variable x

    
AShelly 13.08.2009 17:29
quelle
0

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 .

    
Peter Cordes 27.06.2016 17:01
quelle

Tags und Links