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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
м →‎[[w:PureBasic|PureBasic]]: замена категории на шаблон для работы полки, removed: Категория:Программирование с помощью AWB
м →‎[[w:PureBasic|PureBasic]]: установка шаблона "по алфавиту" по консенсусу на форуме с помощью AWB
Строка 56: Строка 56:
</source>
</source>


{{Темы|Программирование}}


{{По алфавиту}}

{{Темы|Программирование}}

Версия от 22:02, 24 марта 2016

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