Es asm inline for rdtsc
, con el código de máquina escrito para admitir ensambladores realmente antiguos que no conocen el mnemónico.
Desafortunadamente, solo funciona correctamente en el código de 32 bits porque "=A"
no divide los operandos de 64 bits a la mitad en el código de 64 bits. (El gcc manual even uses rdtsc
an an example to illustrate this)
La manera segura de escribir esto, que compila a código óptimo con gcc -m32 o -m64, es decir:
#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;
}
En el código de 32 bits, es sólo rdtsc
/ret
, pero en 64 bits el código hace el cambio necesario/o para obtener ambas mitades en rax
para el valor de retorno.
Véa en el Godbolt compiler explorer.
Interesante. Ha pasado tanto tiempo desde que miré esto, no estoy seguro. Puede especificar qué ensamblador está utilizando. No sé si esto es establecer el contenido, la dirección o ambos (!) De "x". No me sorprendería si x apunta a un puerto mapeado en memoria, actualizado por un dispositivo de forma asíncrona y, por lo tanto, a la palabra clave "volátil". Alguien que realmente haga esto aparecerá pronto, supongo. – Roboprog
¡Apuesto a que deseas que el programador original haya utilizado los comentarios! –
La manera más fácil: compílala y luego desmóntala. –