我编了一个RDTSC指令的测试程序,不过得出的结果想和大家探讨一下。

dhbellwyc 2008-03-07 09:05:24
该程序首先申请一个整型变量 i 。
接下来的关键代码是:

rdtsc;
mov ebx,eax;
rdtsc;
sub eax,ebx;
mov i,eax;

就是计算一条mov指令的精确执行时间,得出结果总是80。居然我把这个程序放到网吧的电脑上,结果还是80。我总感觉有些不太对劲。按道理讲,一条寄存器到寄存器的mov指令也就只要一个周期吧,这个80到底是怎么来的,我就是不太清楚,会不会是取指令时读存储器时耗费掉的啊?
我想这个程序肯定哪个地方错了,因为我在两个RDTSC指令之间增加了一条指令,居然结果还是80。不知道到底是哪里的问题。大家能不能帮帮忙啊?
我把附件传上来了。
...全文
429 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
清钟沁桐 2008-08-31
  • 打赏
  • 举报
回复
可用
void GetCylc( unsigned int *lowPart, unsigned int *highPart )
{
__asm {
cpuid // 强制CPU开始新的周期
mov ecx, lowPart;
mov ebx, highPart;
rdtsc
mov [ecx], eax;
mov [ebx], edx;
}
}
测试
dhbellwyc 2008-03-09
  • 打赏
  • 举报
回复
感谢楼上的回答,我回去重新做了一个试验,果真如此,我将两条rdtsc指令之间加了一条rdtsc指令,结果时间就从80变成了160,看来在我的机器上一条rdtsc指令的时间就是80。不过很奇怪怎么会花费这么长的时间啊?

还有,如果我将新加入的RDTSC换成一条存储器访问指令,就是将MOV的源做成一个内存地址,居然程序运行后得出的结果还是80啊,如果说寄存器之间移动几乎不花费时间,那从存储器到寄存器移动的时间为什么还是反映不出来呢,存储器的速度比CPU要慢好多啊?哪位高人能解答一下,感激不尽。
cnzdgs 2008-03-07
  • 打赏
  • 举报
回复
80是mov和rdtsc这两条指令的时间,寄存器之间mov非常快,所以基本上是rdtsc的时间。你应该先测出rdtsc的时间然后从测试结果中把这个时间减去。注意,测试中途可能有中断产生占用时间;另外rdtsc的返回值不是精确到1的。

21,459

社区成员

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

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