[转载]检测CPU的主频示范程序
文章作者:罗云彬<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Programmed by 罗云彬, [email]bigluo@telekbird.com.cn[/email]<BR>; Website: [url]http://asm.yeah.net[/url]<BR>; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 版本信息<BR>; CPU 频率 - 利用586指令 rdtsc 计算CPU的频率<BR>; V1.0 ------ 2000年6月21日<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR><BR> .586<BR> .model flat, stdcall<BR> option casemap :none ; case sensitive<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Include 数据<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR><BR>include windows.inc<BR>include user32.inc<BR>include kernel32.inc<BR>include comctl32.inc<BR>include comdlg32.inc<BR><BR>includelib user32.lib<BR>includelib kernel32.lib<BR>includelib comctl32.lib<BR>includelib comdlg32.lib<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; Equ 数据<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR><BR>DLG_MAIN equ 1000<BR>ID_SPEED equ 1001<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 数据段<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR><BR> .data?<BR><BR>dwTickCount dd ?<BR>dwTSC dd ?,?<BR>hInstance dd ?<BR>szBuffer db 256 dup (?)<BR><BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 子程序声明<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD<BR><BR> .data<BR><BR>szSpeed db "你的CPU主频为 %d MHz",0<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR>; 代码段<BR>;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><BR><BR> .code<BR><BR>include Win.asm<BR><BR>;********************************************************************<BR>_ProcDlgMain proc uses ebx edi esi, \<BR> hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD<BR> local @stPoint:POINT<BR> local @hWindow<BR><BR> mov eax,wMsg<BR> .if eax == WM_CLOSE<BR> invoke EndDialog,hWnd,NULL<BR> invoke KillTimer,hWnd,1<BR> .elseif eax == WM_INITDIALOG<BR> invoke _CenterWindow,hWnd<BR> invoke GetTickCount ;TSC 初始值<BR> mov dwTickCount,eax<BR><BR> rdtsc<BR> mov dwTSC,eax<BR> mov dwTSC+4,edx<BR> invoke SetTimer,hWnd,1,1000,NULL<BR> .elseif eax == WM_TIMER<BR> invoke GetTickCount<BR> push eax<BR> sub eax,dwTickCount<BR> pop dwTickCount<BR> push eax<BR><BR> rdtsc<BR> push edx<BR> push eax<BR> sub eax,dwTSC<BR> sbb edx,dwTSC+4<BR> pop dwTSC<BR> pop dwTSC+4<BR><BR> mov ecx,1000000<BR> div ecx ;除以1Mhz=1000000hz<BR> .if edx >= 500000h ;四舍五入<BR> inc eax<BR> .endif<BR> mov ecx,1000<BR> mul ecx ;1秒=1000毫秒<BR> pop ecx ;pop出经过的毫秒数<BR> div ecx<BR><BR> invoke wsprintf,offset szBuffer,offset szSpeed,eax<BR> invoke SendDlgItemMessage,hWnd,ID_SPEED,\<BR> WM_SETTEXT,0,offset szBuffer<BR> .else<BR>;********************************************************************<BR>; 注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息<BR>; 要返回 FALSE<BR>;********************************************************************<BR> mov eax,FALSE<BR> ret<BR> .endif <BR> mov eax,TRUE<BR> ret<BR> <BR>_ProcDlgMain endp<BR>;********************************************************************<BR>start:<BR> invoke GetModuleHandle,NULL<BR> mov hInstance,eax<BR> invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0<BR> invoke ExitProcess,NULL<BR><BR> end start页:
[1]