È asm linea for rdtsc
, con la codifica del codice macchina scritta per supportare vecchi assemblatori che non conoscono il codice mnemonico.
Sfortunatamente, funziona solo correttamente in codice a 32 bit perché "=A"
non divide gli operandi a 64 bit a metà nel codice a 64 bit. (Il gcc manual even uses rdtsc
an an example to illustrate this)
Il modo sicuro per scrivere questo, che viene compilato in codice ottimale con gcc -m32 o -m64, è:
#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;
}
Nel codice a 32 bit, è solo rdtsc
/ret
, ma in 64bit codice esegue lo spostamento necessario/o per ottenere entrambe le metà in rax
per il valore restituito.
Vedere su Godbolt compiler explorer.
fonte
2016-06-27 17:01:03
Interessante. È da tanto che non guardo nulla di questo, non ne sono sicuro. È possibile specificare quale assemblatore si sta utilizzando. Non so se questo è l'impostazione del contenuto, l'indirizzo, o entrambi (!) Di "x". Non mi sorprenderebbe se x punti in una porta mappata in memoria, aggiornata da un dispositivo in modo asincrono, e quindi la parola chiave "volatile". Immagino che qualcuno che in realtà fa queste cose si presenterà presto. – Roboprog
Scommetti che desideri che il programmatore originale abbia usato commenti! –
Il modo più semplice: basta compilarlo e quindi smontarlo. –