确定CPU的操作码周期计数

时间:2010-02-24 04:44:18

标签: emulation opcode

我想知道在哪里可以获得各种机器的CPU操作码周期数。我正在谈论的一个例子可以在这个链接上看到:

http://www.obelisk.demon.co.uk/6502/reference.html

如果检查MAME源代码,特别是在src \ emu \ cpu下,您将看到大多数CPU模型以类似的方式跟踪循环计数。我的问题是如何获取这些信息,或者如果它不可用则对其进行逆向工程?我从未见过任何“官方”ASM程序员指南包含循环计数信息。我最初的猜测是,一个小程序被扔进真正的硬件bootrom,如果它包含一个等同于RDTSC的操作码,那么就完成了这样的事情:

RDTSC

//opcode of choosing

RDTSC

但如果没有这样的支持,你会怎么做?我知道对于较旧的硬件,MAME团队除了roms和分散的文档外无法访问任何内容。

2 个答案:

答案 0 :(得分:3)

关于奔腾,对于英特尔和AMD处理器(以及大多数竞争对手)来说,很容易找到周期数。然而,从Pentium Pro和AMD K5开始,CPU进入动态执行模型,其中指令可以不按顺序执行。在这种情况下,执行指令所花费的时间在很大程度上取决于它使用的数据,以及(例如)它是否依赖于来自先前指令的数据(在这种情况下,它必须等待该指令完成才能使用执行)。

对于每个周期可以解码多少指令(例如,至少一个,只要它们“简单”多两个)以及每个周期可以退出多少指令(通常大约三个或四个)。

因此,在现代CPU上,单独讨论给定指令的周期几乎毫无意义。有意义的结果需要一组指令,因此您不仅要查看该指令,还要查看它之前和之后的指令。在一个指令流中存在严重瓶颈的指令可能在另一个流中基本上是免费的(例如,如果你有一个乘法与很多加法混合在一起,乘法可能几乎是免费的 - 但如果它被许多其他乘法所包围,它可能相对昂贵)。

答案 1 :(得分:1)

接受的RDTSC计数应该有一个序列化指令,以确保所有先前的指令在计数之前已经退出。这会增加计数的开销,但您可以简单地“计算”零指令并从测量指令中减去该值。

一些非常好的pdf手册。

http://www.agner.org/optimize/#manuals