QueryPerformanceCounter 微秒计数器

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
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注