结构如下: 化时候设置个定时器定时时间为1秒然后在定时器消息中利用 RDTSC 取得 TSC计数再和上次保留值相减然后除以时间差即可
这里是本文中所有源
源:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by 罗云彬, [email protected]
; 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 wsprf,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
最新评论