c - saber - sistemas operativos de 32 y 64 bits
¿Por qué debería usar ''rdtsc'' de manera diferente en x86 y x86_x64? (2)
En el modo x86-64, RDTSC también borra los 32 bits más altos de RAX. Para compensar esos bits tenemos que desplazarnos a la izquierda en 32 bits.
Sé que rdtsc
carga el valor actual del contador de marca de tiempo del procesador en los dos registros: EDX y EAX. Para poder obtenerlo en x86, necesito hacerlo así (asumiendo que se usa Linux):
unsigned long lo, hi;
asm( "rdtsc" : "=a" (lo), "=d" (hi));
return lo;
y para x86_x64:
unsigned long lo, hi;
asm( "rdtsc" : "=a" (lo), "=d" (hi) );
return( lo | (hi << 32) );
¿porqué es eso? ¿Alguien me lo puede explicar?
La diferencia no está en rdtsc
, sino en lo que el kernel de Linux quiere hacer con él.
En 32 bits, devuelve un valor de 32 bits. Así que el valor en eax es suficientemente bueno.
En 64 bits, devuelve un valor de 64 bits. Por eso necesita combinar los valores de ambos registros.