Примеры использования rdtsc в языках высокого уровня

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Microsoft Visual C++[править]

#include <intrin.h>
#pragma intrinsic(__rdtsc)

unsigned __int64 rdtsc() {
    return __rdtsc();
}

GNU С / C++[править]

 #include <stdint.h>
 extern __inline__ uint64_t rdtsc() {
   uint64_t x;
  __asm__ volatile ("rdtsc\n\tshl $32, %%rdx\n\tor %%rdx, %%rax" : "=a" (x) : : "rdx");
   return x;
 }

Pascal / Delphi[править]

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

В более новых версиях Delphi можно реализовать это так:

 function RDTSC: UInt64; register;
 asm
   rdtsc
 {$IFDEF WIN64} // В случае 64-битной компиляции результат функции целиком передаётся через RAX
   shl rdx, 32
   or rax, rdx
 {$ENDIF}
 end;

PureBasic[править]

Procedure.q RDTSC()
  !rdtsc
  ProcedureReturn
EndProcedure