通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
资源搜索:
热门搜索:Linux VB C语言 PhotoShop Flash TCP/IP
   首页 | 文章 | 软件 | 动画 | 资源 | 励志 | 骗术 | 论坛 | 邮箱 | 会员中心 | 军事 | 科技 | 博客 | 图片 | 商城 | 最新更新 | 800g资源 | 爱心黑客
您现在的位置: 爱国者黑客 >> 资源 >> 安全技术 >> 软件破解 >> 破解实例 >> 文章正文
如何检测CPU的主频
责任编辑:ncic   更新日期:2007-4-5

  概述:

  说到检测CPU的速度,一般是测试在单位时间内运算的指令条数,但用这种方法有太大的局限性,由于受到很多因素的影响,准确度比较低,特别是在Windows环境下,你不知道在你的程序外别的程序占用了多少的时间片。其实,在586及以上档次处理器中,已经有了一条专用的指令来测试主频,那就是 RDTSC指令,意思是读取时间标记计数器(Read Time-Stamp Counter),Time-stamp counter 是处理器内部的一个64位的MSR (model specific register),它每个时钟增加一个记数。在处理器复位的时候,初始值为0,RDTSC 指令把 TSC的值低32位装入EAX中,高32位装入EDX中。如果CPU的主频是200MHz,那么在一秒钟内,TSC的值增加 200,000,000 次。所以在计算的时候,把两次的TSC差值除以两次的时间差值就是CPU的主频。

  程序的结构如下: 初始化的时候设置一个定时器,定时时间为1秒,然后在定时器消息中利用 RDTSC 取得 TSC计数,再和上次保留的值相减,然后除以时间差即可。

  这里是本文中的所有的源程序。

  源程序:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  Programmed by 罗云彬, bigluo@telekbird.com.cn
;  Website: http://asm.yeah.net
;  LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  版本信息
;  CPU 频率 - 利用586指令 rdtsc 计算CPU的频率
;    V1.0 ------  2000年6月21日
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .586
    .model flat, stdcall
    option casemap :none  ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;  Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include    windows.inc
include    user32.inc
include    kernel32.inc
include    comctl32.inc
include    comdlg32.inc
includelib  user32.lib
includelib  kernel32.lib
includelib  comctl32.lib
includelib  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
include    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

  • 上一篇文章:
  • 下一篇文章:
  • 热门文章
    Olldbg常见问题
    汇编语言的艺术(组合语言的艺术)--观
    汇编语言的艺术(组合语言的艺术)--准
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言---程式设计 (4)
    虚拟8086模式
    SYS命令使用说明
    javascript + CSS 实现动态菜单显
    推荐文章
    自制Windows XP SP2自动安装光盘
    SQLServer注入工具改进版 v1.02
    使用photoshop CS进行自然美肤
    Photoshop绘制诺基亚手机
    PHOTOSHOP制作秋日之梦
    PHOTOSHOP鼠绘名模王爱萍
    Photoshop制作晶莹飞溅的水珠
    教你用PHOTOSHOP做放大镜
    鼠绘美女及服装修画全过程