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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Строка 41: Строка 41:
asm
asm
rdtsc
rdtsc
{$IFDEF WIN64} // В случае 64-битной компиляции результат функции целиком передаётся через RAX
shl rdx, 32
or rax, rdx
{$ENDIF}
end;
end;
</source>
</source>

Версия от 16:49, 12 февраля 2013

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