Assembly Code Snippet to measure base CPU Frequency

Basically the base (not turbo boosted) CPU Frequency is amount of TSC Increments per one second.

A very simple code snippet to get it:

EUROASM AutoSegment=Yes, CPU=X64, SIMD=AVX2
getbase PROGRAM Format=PE, Width=64, Model=Flat, IconFile=, Entry=main:

INCLUDE winscon.htm, winabi.htm, cpuext64.htm

MsgFmt D "TSC Ticks per 1 s = %%d[u]; Base CPU Frequency is %%f[p2] GHz",13,10,0
Ticks DB Q
Freq DB Q
Divider DO Q 1_000_000_000
    
LINK cvirt.lib

main: nop
	WinABI SetStdioWindowOptions,0,0 ; prevent to move to front
    WinABI GetCurrentThread ; This one will be in RAX
    WinABI SetThreadAffinityMask, RAX, 1 ; RCX is thread param (core#)
    WinABI SetThreadPriority, RAX, 15 ; RCX is thread param (core#)
    WinABI QueryPerformanceFrequency, Freq
	mov r15, [Freq]

	WinABI QueryPerformanceCounter, Ticks
	mov r14, [Ticks] ; r10 - initial

	CPUID
    RDTSC
    SHL RDX, 32
    OR RAX, RDX
    MOV R13, RAX ; R13 will hold initial Time Stamp counter value
	
align 16
L1:
    RDTSCP
    SHL RDX, 32
    OR RAX, RDX
    SUB RAX, R13 ; Subtract previous stamp
	mov r12, rax ; R12 is the TSC difference

	WinABI QueryPerformanceCounter, Ticks
	mov r11, [Ticks] ; r10 - was initial
	sub r11, r14
	cmp r11, r15 ; Frequency, count one second
	jle L1

    movq xmm0, r12 ; R12 is now amount of TSC Ticks per second
    movq xmm1, [Divider]
    divsd xmm0, xmm1
    WinABI FmtOut, MsgFmt, r12, xmm0 ; Float Point

jmp main
	TerminateProgram

ENDPROGRAM

Output on Intel Xeon w5-2445 with Base Speed of 3,1 GHz:

>getbase.exe
TSC Ticks per 1 s = 3096153679; Base CPU Frequency is 3.10 GHz
TSC Ticks per 1 s = 3095987294; Base CPU Frequency is 3.10 GHz
TSC Ticks per 1 s = 3095986282; Base CPU Frequency is 3.10 GHz
TSC Ticks per 1 s = 3095985619; Base CPU Frequency is 3.10 GHz