!!!!!!!!怎么在VC程序中取得CPU主频以及总线频率?!!!!!!!!!(解决立即结贴!) 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0 这个问题我以前回答过大概的方法就是用一个1秒的定时器,在利用586指令 rdtsc(asm)来计算我把代码 .586 .model flat, stdcall option casemap :none ; case sensitiveinclude windows.incinclude user32.incinclude kernel32.incinclude comctl32.incinclude comdlg32.incincludelib user32.libincludelib kernel32.libincludelib comctl32.libincludelib comdlg32.libDLG_MAIN equ 1000ID_SPEED equ 1001 .data?dwTickCount dd ?dwTSC dd ?,?hInstance dd ?szBuffer db 256 dup (?)_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD .dataszSpeed db "你的CPU主频为 %d MHz",0 .codeinclude Win.asm;********************************************************************_ProcDlgMain proc uses ebx edi esi, \ hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD local @stPoint:POINT local @hWindow mov eax,wMsg .if eax == WM_CLOSE invoke EndDialog,hWnd,NULL invoke KillTimer,hWnd,1 .elseif 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 .elseif 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 .if edx >= 500000h ;四舍五入 inc eax .endif mov ecx,1000 mul ecx ;1秒=1000毫秒 pop ecx ;pop出经过的毫秒数 div ecx invoke wsprintf,offset szBuffer,offset szSpeed,eax invoke SendDlgItemMessage,hWnd,ID_SPEED,\ WM_SETTEXT,0,offset szBuffer .else;********************************************************************; 注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息; 要返回 FALSE;******************************************************************** 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,0 invoke ExitProcess,NULL end start 如何在列表视图里添加、修改和删除一列 我写的控件,IE调用,debug 编译没错,release编译出错,什么原因? VC中字符数组如何转字符串问题,请指教! 自己制作 多文档程序的子窗口 怎么实现 请教一个简单问题,容易啊!! ITU的网站上的东西如何下载? 初级问题求教! WS_EX_TOPMOST 窗口 顶层问题 VC+ADO+SQL2000 如何把一个工程use mfc in a shared dll改为use mfc in a static library? 如何实现分布式的树? 再问一个问题!100分!!
来计算
我把代码
.586
.model flat, stdcall
option casemap :none ; case sensitiveinclude windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include comdlg32.incincludelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib comdlg32.libDLG_MAIN equ 1000
ID_SPEED equ 1001 .data?dwTickCount dd ?
dwTSC dd ?,?
hInstance dd ?
szBuffer db 256 dup (?)_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD .dataszSpeed db "你的CPU主频为 %d MHz",0 .codeinclude Win.asm;********************************************************************
_ProcDlgMain proc uses ebx edi esi, \
hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
local @stPoint:POINT
local @hWindow mov eax,wMsg
.if eax == WM_CLOSE
invoke EndDialog,hWnd,NULL
invoke KillTimer,hWnd,1
.elseif 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
.elseif 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
.if edx >= 500000h ;四舍五入
inc eax
.endif
mov ecx,1000
mul ecx ;1秒=1000毫秒
pop ecx ;pop出经过的毫秒数
div ecx invoke wsprintf,offset szBuffer,offset szSpeed,eax
invoke SendDlgItemMessage,hWnd,ID_SPEED,\
WM_SETTEXT,0,offset szBuffer
.else
;********************************************************************
; 注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息
; 要返回 FALSE
;********************************************************************
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,0
invoke ExitProcess,NULL end start