QueryPerformanceCounter 可以取得开机以来64位的时间计数值
QueryPerformanceFrequency 取得计算机每秒钟的计数值,和CPU速度有关
Timer.asm:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
; Include 文件定义
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_TIMER1 equ 1
DLG_MAIN equ 1
IDC_COUNT equ 101
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
dw1m dd 1000000
ddcc1 db "%d 微秒", 0
buffer db 512 dup(?)num1 dq 333
num2 dq 3
res dd 0.data?
hInstance dd ?
tick1 dd ?
dqtick1 dq ?
dqtick2 dq ?
dqFreq dq ?
dqTime dq ?
buf db 200 dup(?)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_ProcDlgMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if eax == WM_TIMER
mov eax,wParam
.if eax == ID_TIMER1
invoke MessageBeep,-1
.endif
.elseif eax == WM_INITDIALOG
invoke QueryPerformanceCounter,addr dqtick1
.while 1
add edi,1
.break .if edi > 100000000
;.continue
.endw
invoke QueryPerformanceCounter,addr dqtick2
invoke QueryPerformanceFrequency,addr dqFreq
mov eax,DWORD ptr dqtick1
mov edx,DWORD ptr dqtick1+4
sub DWORD ptr dqtick2,eax
sbb DWORD ptr dqtick2+4,edx
finit
fild dqFreq
fild dqtick2
fimul dw1m
fdivr
fistp dqTime
invoke wsprintf,addr buf,addr ddcc1,dqTime
invoke SendDlgItemMessage,hWnd,IDC_COUNT,WM_SETTEXT,NULL,addr buf
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDOK
invoke QueryPerformanceCounter,addr dqtick1
.while 1
add edi,1
.break .if edi > 100000000
;.continue
.endw
invoke QueryPerformanceCounter,addr dqtick2
invoke QueryPerformanceFrequency,addr dqFreq
mov eax,DWORD ptr dqtick1
mov edx,DWORD ptr dqtick1+4
sub DWORD ptr dqtick2,eax
sbb DWORD ptr dqtick2+4,edx
finit
fild dqFreq
fild dqtick2
fimul dw1m
fdivr
fistp dqTime
invoke wsprintf,addr buf,addr ddcc1,dqTime
invoke SendDlgItemMessage,hWnd,IDC_COUNT,WM_SETTEXT,NULL,addr buf
.endif
.elseif eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
Timer.rc:
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&
gt;>>>>>>>>>>>>>>>>>>>>>
#include <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define DLG_MAIN 1
#define ICO_1 1
#define IDC_COUNT 101
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_1 ICON "1.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLG_MAIN DIALOG 70, 110, 120, 70
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "1+1 1亿次 小杰的博客"
FONT 9, "宋体"
{
LTEXT "计数:", -1, 35, 16, 25, 10
LTEXT "", IDC_COUNT, 62, 16, 60, 10
DEFPUSHBUTTON "开始", IDOK, 35, 36, 50, 20
}