Примеры использования rdtsc в языках высокого уровня: различия между версиями
Содержимое удалено Содержимое добавлено
ЕссБот (обсуждение | вклад) м →[[w:PureBasic|PureBasic]]: установка шаблона "по алфавиту" по консенсусу на форуме с помощью AWB |
DannyS712 (обсуждение | вклад) м <source> -> <syntaxhighlight> (phab:T237267) |
||
Строка 1: | Строка 1: | ||
== [[w:Microsoft Visual C++|Microsoft Visual C++]] == |
== [[w:Microsoft Visual C++|Microsoft Visual 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++]] == |
||
< |
<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]] == |
||
< |
<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 можно реализовать это так: |
||
< |
<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]] == |
||
< |
<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