测试cpu主频的程序

vs02055219 2007-07-18 09:37:04
在版上问了好多问题
终于把程序写出来了
但是还是有问题
在奔腾芯片上运行
测出来的主频大的夸张
在486上
打印的却是乱码
请高手看一下是怎么回事
谢谢
另外,非常感谢delphiguy
这个思路就是你提供的
我另一个号没分了
只能用这个了



#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define vk_esc 0x11b /* escape key */
#define timer 0x1c /* 时钟中断的中断号 */

int timercounter=0; /* 计时变量,每秒钟增加18。 */
/* 指向原来时钟中断处理过程入口的中断处理函数指针(句柄) */
void interrupt ( *oldhandler)();
/* 新的时钟中断处理函数 */
void interrupt newhandler( )
{
int i=0,j=0;
/* increase the global counter */
timercounter++;
/* call the old routine */
if (timercounter>18) /* 1秒钟处理一次 */
{
/* 恢复计时变量 */
asm mov i,bx
asm mov j,cx
printf("%d %d\n",i,j); /*记录每一秒钟bx cx寄存器的变化
timercounter=0;
}
oldhandler();
}
/* 设置新的时钟中断处理过程 */
void settimer(void interrupt (*intproc)())
{
oldhandler=getvect(timer);
disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */
setvect(timer,intproc);
enable(); /* 开启中断 */
}
/* 恢复原有的时钟中断处理过程 */
void killtimer()
{
disable();
setvect(timer,oldhandler);
enable();
}

void main(void)
{
settimer(newhandler); /* 修改时钟中断 */
asm mov bx ,10000
l0:
asm mov cx ,30000
l1:
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop
asm nop

asm loop l1
asm dec bx
asm jnz l0
for (;;)
{

}
killtimer(); /* 恢复时钟中断 */
}

...全文
478 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ReverseEngineering 2007-08-05
  • 打赏
  • 举报
回复
学习一下。
  • 打赏
  • 举报
回复
他是要做DOS下的。
liangbch 2007-08-02
  • 打赏
  • 举报
回复
下面一段代码可准确测出CPU的频率,完整的代码见:http://blog.csdn.net/liangbch/archive/2007/04/13/1563407.aspx

// maxDetermainTime:最大测定时间,单位毫秒,在首次调用该函数时,
// 将花费maxDetermineTime的时间来测定CPU频率,以后的调用将直接返加静态变量的值
double GetCPUFrequency(DWORD maxDetermineTime )
{
static double CPU_freq;
LARGE_INTEGER period,t1,t2;
register LARGE_INTEGER goal,current;

if (CPU_freq>1000) //this value have been initilization
return CPU_freq;
if (!QueryPerformanceFrequency(&period) || !checkRDSTC())
{
CPU_freq=-1.00;
return CPU_freq;
}
QueryPerformanceCounter(&goal);
goal.QuadPart += period.QuadPart * maxDetermineTime/1000;
getTime3( &t1); //开始计时
do //延时maxDetermineTime毫秒
{
QueryPerformanceCounter(¤t);
} while(current.QuadPart<goal.QuadPart);
getTime3(&t2); //结束计时

CPU_freq=double((t2.QuadPart-t1.QuadPart)*1000/maxDetermineTime);

char buff[100];
sprintf(buff,"Estimated the processor clock frequency =%gHz\n",CPU_freq);
::MessageBox(NULL,buff,"",MB_OK);
return CPU_freq;
}
hotnoise 2007-07-20
  • 打赏
  • 举报
回复
有点晕,c的库应该生成中断的保护现场代码吧,那样的话cx,bx就会在中断退出时恢复,还能达到你的目的吗?
  • 打赏
  • 举报
回复
1. 在INT 1Ch中断处理中的bx、cx不是确定值,因为INT 1Ch是在INT 08h内部被调用的。
即便你使用INT 08h,也不能简单地认为肯定是你的代码循环中的值。
2. 在中断处理中最好不要使用printf这类库函数,有可能造成DOS重入。

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧