Pregunta

Me encontré con este código y necesito entender lo que está haciendo. Sólo parece ser que declara dos bytes y luego no hacer nada ...

uint64_t x;
__asm__ __volatile__ (".byte 0x0f, 0x31" : "=A" (x));

Gracias!

¿Fue útil?

Solución

Esta es la generación de dos bytes (0F 31) directamente en la corriente de código. Esta es una instrucción RDTSC, que lee el contador de sello de tiempo en EDX: EAX, que luego se copia en la variable 'x' por la restricción de salida "= A" (x)

Otros consejos

0F 31 es el código de operación x86 para la RDTSC (leer contador de sello de tiempo) de instrucciones; se coloca el valor leído en los registros EAX y EDX.

La Directiva _ _ asm__ no sólo está declarando dos bytes, que es la colocación de ensamblado en línea en el código C. Presumiblemente, el programa tiene una manera de utilizar el valor de esos registros inmediatamente después.

http://en.wikipedia.org/wiki/Time_Stamp_Counter

Es la inserción de un 0F 31 opcode, que según este sitio es:

0F 31   P1+   f2   RDTSC EAX EDX IA32_T...        Read Time-Stamp Counter 

A continuación, se almacena el resultado en la variable x

Es asm en línea para rdtsc , con la codificación de código máquina escriben en el apoyo montadores muy viejos que no saben la tecla de acceso.

Por desgracia, sólo funciona correctamente en código de 32 bits, ya no se divide "=A" operandos de 64 bits a la mitad en código de 64 bits. (El manual de gcc incluso utiliza rdtsc una un ejemplo para ilustrar este )

La forma más segura de escribir esto, que compila a código óptimo con gcc -m32 o -m64, es:

#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 código de 64 bits que hace el cambio necesario / o para conseguir ambas mitades en rax para el valor de retorno.

Vea en la Godbolt compilador explorador .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top