Es ist inline ASM for rdtsc
, mit dem Speichern Maschinencode-Kodierung geschrieben, um wirklich alte Assembler zu unterstützen, die das Mnemonic nicht kennen.
Leider funktioniert es nur richtig in 32-Bit-Code, weil "=A"
nicht teilt 64-Bit-Operanden in der Hälfte in 64-Bit-Code. (Die gcc manual even uses rdtsc
an an example to illustrate this)
Der sichere Weg, dies zu schreiben, die mit gcc -m32 oder -m64, um einem optimalen Code kompiliert ist:
#include <stdint.h>
uint64_t timestamp_safe(void)
{
unsigned long tsc_low, tsc_high; // not uint32_t: saves a zero-extend for -m64 (but not x32 :/)
asm volatile("rdtsc" : "=d"(tsc_high), "=a" (tsc_low));
return ((uint64_t)tsc_high << 32) | tsc_low;
}
In 32-Bit-Code, es ist nur rdtsc
/ret
, aber in 64-Bit Code es tut die notwendige Verschiebung/oder beide Hälften in rax
für den Rückgabewert zu bekommen.
Siehe auf der Godbolt compiler explorer.
Interessant. Es ist so lange her, dass ich mir das alles angeschaut habe, ich bin mir nicht sicher. Sie können angeben, welchen Assembler Sie verwenden. Ich weiß nicht, ob dies den Inhalt, die Adresse oder beides (!) Von "x" setzt. Es würde mich nicht überraschen, wenn x auf einen Speicherkarten-Port zeigt, der von einem Gerät asynchron aktualisiert wird, und somit das Schlüsselwort "volatile". Jemand, der dieses Zeug tatsächlich macht, wird bald auftauchen, nehme ich an. – Roboprog
Wetten, dass der ursprüngliche Programmierer Kommentare verwendet hat! –
Einfachster Weg: einfach kompilieren und dann zerlegen. –