Windows MASM / RDTSCP

Author Adam
Platform Windows
Language MASM
Technique RDTSCP

Code

.586
.MODEL FLAT,STDCALL
 include    windows.inc
 include    kernel32.inc
 includelib kernel32.lib
 include    user32.inc
 includelib user32.lib
 include    masm32.inc
 includelib masm32.lib
.data
  pat                  db 'rdtscp delta=%d, rdtsc delta=%d',13,10,0
  rdtscp_not_supported db 'rdtscp not supported'
.data?
  buf db 64 dup (?)
.code
rdtscp macro
  db 0Fh, 01h, 0F9h
endm
assume fs:nothing
RDTSCP  proc
  LOCAL _retval:DWORD
   mov  _retval,0
   pushad
   push OFFSET e
   push dword ptr fs:[0]
   mov  dword ptr fs:[0], esp
   rdtscp
   mov ebx,eax
   rdtscp
   sub  eax,ebx
   mov  _retval,eax
   jmp  no_e
 e:
   mov  esp, [esp + 8]
   pop  dword ptr fs:[0]
   add  esp, 4
   popad
   mov  _retval,-1
   jmp  _ret
 no_e:
   pop  dword ptr fs:[0]
   add  esp, 4
   popad
_ret:
   mov eax,_retval
   ret
RDTSCP  endp
  Start:
   rdtsc
   mov ebx,eax
   rdtsc
   sub  eax,ebx
   mov  ebp,eax
   call RDTSCP
   .if eax==-1
       invoke  StdOut,OFFSET rdtscp_not_supported
   .else
       invoke  wsprintfA,OFFSET buf,OFFSET pat,eax,ebp
       invoke  StdOut,OFFSET buf
   .endif
   invoke ExitProcess,0
END Start

Created

September 14, 2020

Last Revised

April 22, 2024