format PE Console 4.0
entry start
include 'win32axp.inc'
;-- CODE SECTION -------------------------------------------------------------------------------------------------------
macro ReadTSC
{
mfence
rdtsc
mfence
}
.code
start:
invoke SetThreadPriority, -2, THREAD_PRIORITY_TIME_CRITICAL
;======
ReadTSC
push eax
push edx
invoke Sleep,1000
ReadTSC
pop ecx
pop ebx
sub eax,ebx
sbb edx,ecx
push edx
push eax
fild qword[esp]
add esp,8
fidiv [N1M]
fistp [cpuFreq]
cinvoke printf,<10,' CPU freq: %d MHz',0>,[cpuFreq]
;======
invoke QueryPerformanceFrequency,qpf
fild [qpf]
fidiv [N1M]
fstp [fpuBuff]
cinvoke printf,<10,'Timer freq: %f MHz',0>,dword[fpuBuff],dword[fpuBuff+4]
;====== = 2 : LFENCE, TSC
ReadTSC
push eax
ReadTSC
pop ebx
sub eax,ebx
mov [fix],eax ;
;***************************
;
;***************************
ReadTSC
push eax
;<-----
ReadTSC
pop ebx
sub eax,ebx
sub eax,[fix]
push eax
fild dword [esp] ;
fidiv [cpuFreq] ;
fstp [fpuBuff] ;
pop eax
cinvoke printf,<10,'%i ticks = %f microsec',0>,\
eax, dword[fpuBuff], dword[fpuBuff+4]
cinvoke getch
invoke ExitProcess, 0
;-- DATA SECTION -------------------------------------------------------------------------------------------------------
.data
N1M dd 1000000
cpuFreq dd ?
fix dd ?
qpf dq ?
fpuBuff dq ?
;-- IMPORT SECTION -----------------------------------------------------------------------------------------------------
section '.idata' import data readable
library kernel32, 'kernel32.dll',\
msvcrt, 'msvcrt.dll'
import_kernel32
all_api
import msvcrt,\
printf, 'printf',\
getch, '_getch'