Accueil🇫🇷Chercher

RDTSC

L'instruction RDTSC est une instruction pour les processeurs x86.

Description

L'instruction RDTSC est un mnémonique pour read time stamp counter. L'instruction retourne dans le couple de registre EDX:EAX le nombre de ticks[1] écoulés depuis la dernière remise à zéro du processeur (Reset).

L'instruction lit simplement un registre spécial de 64 bits, nommé time stamp counter (compteur temporel) et place le résultat dans les registres EDX et EAX. La partie haute du compteur temporel (32 bits de poids fort) est placée dans le registre EDX tandis que la partie basse (32 bits de poids faible) est placée dans le registre EAX.

L'instruction fut ajoutée au processeur Pentium.

OpcodeInstructionDescription
0F 31 RDTSC Lit le compteur de temps et place le résultat dans les registres EDX et EAX

Drapeaux affectés

Aucun drapeau du registre EFLAGS n'est affecté par cette instruction.

Exceptions générées

Les exceptions générées par l'instruction pour les différents modes d'exécution du processeur sont :

  • Mode protĂ©gĂ©
    • Protection gĂ©nĂ©rale avec code 0 : #GP(0) ; Condition : Si le drapeau TSD du registre CR4 est armĂ© et que le niveau de privilège est diffĂ©rent de 0.
  • Mode virtuel 8086
    • Protection gĂ©nĂ©rale avec code 0 : #GP(0) ; Condition : Si le drapeau TSD du registre CR4 est armĂ©.
  • Mode rĂ©el
    • Aucune exception n'est gĂ©nĂ©rĂ©e dans ce mode d'exĂ©cution.

Exemples d'utilisation

Langages C ou C++

GNU C/C++ (IA32 / x86_64)

#ifdef __i386
extern __inline__ uint64_t rdtsc(void) {
  uint64_t x;
  __asm__ volatile ("rdtsc" : "=A" (x));
  return x;
}
#elif defined __amd64
extern __inline__ uint64_t rdtsc(void) {
  uint64_t a, d;
  __asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
  return (d<<32) | a;
}
#endif

Microsoft Visual C++ (IA32 seulement)

__declspec(naked)
unsigned __int64 __cdecl rdtsc(void)
{
   __asm
   {
      rdtsc
      ret       ; valeur de retour dans EDX:EAX
   }
}

Langages Pascal ou Delphi

function RDTSC: comp;
var TimeStamp: record case byte of
                 1: (Whole: comp);
                 2: (Lo, Hi: Longint);
               end;
begin
  asm
    db $0F; db $31;
    mov [TimeStamp.Lo], eax
    mov [TimeStamp.Hi], edx
  end;
  Result := TimeStamp.Whole;
end;

Notes

  1. D'après le IA-32 Intel Architecture Software Developer’s Manual volume 3 le time stamp counter est incrémenté d'environ 9,5 * 10^16 fois en une année pour un processeur cadencé à 3GHz.

Articles connexes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.