x86 汇编指令执行次数
Posted
技术标签:
【中文标题】x86 汇编指令执行次数【英文标题】:x86 assembly instruction execution count 【发布时间】:2010-12-25 14:38:39 【问题描述】:大家好 我有一个代码,我想找到每条装配线执行的次数。我不在乎是通过分析还是仿真,但我想要高精度的结果。我曾经遇到过一个论坛,它提供了一些脚本代码来执行此操作,但我丢失了链接。谁能帮我集思广益一些方法吗? 问候
编辑: 好吧,我想我已经成功了一半。根据一篇帖子,我对英特尔手册 3A 第 16.4.5 节提供的 BTS(分支跟踪存储)进行了一些研究。此功能提供分支历史记录。所以现在我需要你的帮助,看看是否有任何开源脚本或工具可以做到这一点。等待查看您的反馈
干杯=)!
【问题讨论】:
【参考方案1】:如果您的处理器支持,您可以启用 Branch Trace Store (BTS)。 BTS 将所有已采用分支的日志存储在内存中的预定义区域中。每个条目都包含分支源和目标。使用它,您可以计算您在每个代码段中的次数。
查看Intel Software Developer's Manual 的volume 3A,第 16.4.5 节(在当前版本中)以了解有关如何启用它的详细信息。
【讨论】:
听起来很有趣!你知道任何使用它的软件还是我必须自己编写代码?但我仍然认为这还不够,因为我会忽略条件语句! @Syntax:我不知道有没有实现它的包。你会忽略哪些条件语句? 如果你有 cmova 操作码,这是一个有条件的移动,所以它只会在正确的标志出现时执行。所以即使它在一个函数中,它也不会总是执行 @Syntax:它将总是执行。您无法计算将跳过条件不成立的条件移动的指令。 这听起来很gd我会尝试找到读取BTS的包..如果你找到任何让我知道!【参考方案2】:如果你不关心性能,你可以做一个小技巧来计算它。引发单步异常,并在输入您的自定义 seh 处理程序后,引发另一个异常并跳至下一个命令。
也许某些分析器工具(例如 pin 或 valgrind)会以更简单的方式为您做到这一点。我建议你看看。
【讨论】:
我会调查一下别针!你用过be4吗? 我没有广泛使用它,但我已经使用它了。另外,我使用了另一种技术,只需一步即可创建一些向后运行的代码。这就是为什么我提出这种方法的原因,它可以很容易地计算你执行的命令。【参考方案3】:一种(虽然很慢)方法是编写自己的调试器。然后它将断点程序的入口点,当它被击中时,它会在上下文中的 EFlags 上设置跟踪标志,因此它也会在下一条指令上中断到调试器。然后,您可以使用带有 EIP 的哈希表来计算命中次数。 唯一的问题是开销会非常大,应用程序会运行得很慢。
【讨论】:
以上是关于x86 汇编指令执行次数的主要内容,如果未能解决你的问题,请参考以下文章
汇编 (x86): <label> db 'string',0 除非有跳转指令,否则不会执行
Android 逆向x86 汇编 ( cmp 比较指令 | test 比较指令 )