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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
м →‎[[w:PureBasic|PureBasic]]: установка шаблона "по алфавиту" по консенсусу на форуме с помощью AWB
м <source> -> <syntaxhighlight> (phab:T237267)
 
Строка 1: Строка 1:
== [[w:Microsoft Visual C++|Microsoft Visual C++]] ==
== [[w:Microsoft Visual C++|Microsoft Visual C++]] ==
<source lang="c">
<syntaxhighlight lang="c">
#include <intrin.h>
#include <intrin.h>
#pragma intrinsic(__rdtsc)
#pragma intrinsic(__rdtsc)
Строка 7: Строка 7:
return __rdtsc();
return __rdtsc();
}
}
</syntaxhighlight>
</source>


== [[w:GNU Compiler Collection|GNU С / C++]] ==
== [[w:GNU Compiler Collection|GNU С / C++]] ==
<source lang="c">
<syntaxhighlight lang="c">
#include <stdint.h>
#include <stdint.h>
extern __inline__ uint64_t rdtsc() {
extern __inline__ uint64_t rdtsc() {
Строка 17: Строка 17:
return x;
return x;
}
}
</syntaxhighlight>
</source>


== [[w:Pascal|Pascal]] / [[w:Delphi (язык программирования)|Delphi]] ==
== [[w:Pascal|Pascal]] / [[w:Delphi (язык программирования)|Delphi]] ==
<source lang="delphi">
<syntaxhighlight lang="delphi">
function RDTSC: comp;
function RDTSC: comp;
var TimeStamp: record case byte of
var TimeStamp: record case byte of
Строка 34: Строка 34:
Result := TimeStamp.Whole;
Result := TimeStamp.Whole;
end;
end;
</syntaxhighlight>
</source>


В более новых версиях Delphi можно реализовать это так:
В более новых версиях Delphi можно реализовать это так:
<source lang="delphi">
<syntaxhighlight lang="delphi">
function RDTSC: UInt64; register;
function RDTSC: UInt64; register;
asm
asm
Строка 46: Строка 46:
{$ENDIF}
{$ENDIF}
end;
end;
</syntaxhighlight>
</source>


== [[w:PureBasic|PureBasic]] ==
== [[w:PureBasic|PureBasic]] ==
<source lang="asm">
<syntaxhighlight lang="asm">
Procedure.q RDTSC()
Procedure.q RDTSC()
!rdtsc
!rdtsc
ProcedureReturn
ProcedureReturn
EndProcedure
EndProcedure
</syntaxhighlight>
</source>


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

Текущая версия от 16:13, 16 апреля 2020

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