如何检测CPU的主频
来源: 发布时间:星期二, 2009年2月3日 浏览:327次 评论:0
概述: 说到检测CPU  速度   般是测试在单位时间内运算  指令条数  但用这种思路方法有太大  局限性  由于受到很多原因  影响  准确度比较低  特别是在Windows环境下  你不知道在你   外别   占用了多少  时间片  其实  在586及以上档次处理器中  已经有了  条专用  指令来测试主频  那就是 RDTSC指令  意思是读取时间标记计数器(Read Time-Stamp Counter)  Time-stamp counter 是处理器内部   个64位  MSR (model spec  ic register)  它每个时钟增加  个记数  在处理器复位  时候   值为0  RDTSC 指令把 TSC  值低32位装入EAX中  高32位装入EDX中  如果CPU  主频是200MHz  那么在  秒钟内  TSC  值增加 200,000,000 次  所以在计算  时候  把两次  TSC差值除以两次  时间差值就是CPU  主频   结构如下:  化  时候设置  个定时器  定时时间为1秒  然后在定时器消息中利用 RDTSC 取得 TSC计数  再和上次保留  值相减  然后除以时间差即可  这里是本文中  所有  源   源  : ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Programmed by 罗云彬, bigluo@telekbird.com.cn ; Website: http://asm.yeah.net ; LuoYunBin's Win32 ASM page (罗云彬 编程乐园) ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 版本信息 ; CPU 频率 - 利用586指令 rdtsc 计算CPU 频率 ; V1.0 ------ 2000年6月21日 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .586 .model flat, stdcall option map :none ; sensitive ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Include 数据 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
windows.inc
user32.inc
kernel32.inc
comctl32.inc
comdlg32.inc
lib user32.lib
lib kernel32.lib
lib comctl32.lib
lib comdlg32.lib ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Equ 数据 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DLG_MAIN equ 1000 ID_SPEED equ 1001 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 数据段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data? dwTickCount dd ? dwTSC dd ?,? hInstance dd ? szBuffer db 256 dup (?) ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 子 声明 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD .data szSpeed db "你 CPU主频为 %d MHz",0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 代码段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code
Win.asm ;******************************************************************** _ProcDlgMain proc uses ebx edi esi, hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD local @stPo :POINT local @hWindow mov eax,wMsg . eax WM_CLOSE invoke EndDialog,hWnd,NULL invoke KillTimer,hWnd,1 . eax WM_INITDIALOG invoke _CenterWindow,hWnd invoke GetTickCount ;TSC 值 mov dwTickCount,eax rdtsc mov dwTSC,eax mov dwTSC+4,edx invoke SetTimer,hWnd,1,1000,NULL . eax WM_TIMER invoke GetTickCount push eax sub eax,dwTickCount pop dwTickCount push eax rdtsc push edx push eax sub eax,dwTSC sbb edx,dwTSC+4 pop dwTSC pop dwTSC+4 mov ecx,1000000 div ecx ;除以1Mhz=1000000hz . edx >= 500000h ; 4舍 5入 inc eax .end mov ecx,1000 mul ecx ;1秒=1000毫秒 pop ecx ;pop出经过 毫秒数 div ecx invoke wspr f,off szBuffer,off szSpeed,eax invoke SendDlgItemMessage,hWnd,ID_SPEED, WM_SETTEXT,0,off szBuffer . ;******************************************************************** ; 注意:对话框 消息处理后 要返回 TRUE,对没有处理 消息 ; 要返回 FALSE ;******************************************************************** mov eax,FALSE ret .end mov eax,TRUE ret _ProcDlgMain endp ;******************************************************************** start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance, DLG_MAIN,NULL,off _ProcDlgMain,0 invoke ExitProcess,NULL end start
标签:
相关文章
读者评论
发表评论
|
|