【问题标题】:Which processor instructions are used most commonly?哪些处理器指令最常用?
【发布时间】:2020-06-05 03:32:57
【问题描述】:

我的目标是对一些指令集架构进行比较研究。
对于每种指令集架构,如何找到最常用的指令?

这是我正在考虑的步骤:

  • 查找所选域的通用 ISA
  • 为每个此类 ISA 查找热门程序
  • 反汇编程序指令(.code)(哪个工具?)
  • 收集有关指令格式、操作码、类型的统计信息。 (哪个工具?)

这是一个很好的关于 x86 机器码统计的研究: https://www.strchr.com/x86_machine_code_statistics

我尝试过以下命令进行反汇编,但似乎无法正确反汇编。反汇编代码显示了一些das 指令,这些指令不应该出现在实际代码中。

ndisasm -b32 -a $(which which)

【问题讨论】:

  • 反汇编程序不知道某些东西是数据还是代码。它们甚至可能是相同的——数据可以被视为代码,代码也可以被视为数据(当前所有 CPU 中实现的冯诺依曼架构)。这就是为什么您不能将通用反汇编程序指向可执行文件的随机部分并说“反汇编这个!”你可以但是,正如你所发现的,它会分解你指向的任何东西。
  • 啊,这是有道理的,但幸运的是objdump 可以识别 ELF 文件。 objdump --disassemble $(which ls) > ls.log 似乎做了正确的反汇编。
  • 您不能 100% 确定这一点;可能仍然有静态数据——甚至是未使用的代码! – 在可执行部分内。
  • @wolfram77:我认为“最常由编译器生成”和“最常由 CPU 执行”之间存在重大区别;你需要弄清楚哪个更适合你的目的。
  • @usr2564301:普通的非混淆编译器生成的 x86 可执行文件很容易反汇编。 x86 编译器不会混合代码和数据;与 ARM 不同,代码附近(函数之间)的文字池没有任何好处,因此编译器不会这样做。当然,您必须使用像 objdump 或 objconv 这样知道 ELF 元数据的反汇编程序,而 ndisasm 不知道! ndisasm 将所有内容都视为平面二进制文件,包括元数据和 .data 和 .rodata

标签: x86 profiling instruction-set usage-statistics quantitative


【解决方案1】:

你可以试试这个,从 .text 部分收集助记符:

objdump --no-show-raw-insn \
        -M intel           \
        -sDj .text $(which *program name*) | # <-- disassemble .text section
             sed -n '/<\.text>/, $ p'      | # <-- skip raw hex
             awk '{$1 = ""; print}'        | # <-- remove offsets
             sed '1d'                        # <-- delete annoying <.text> in first line

之后,您可以只获取助记符名称,附加awk '{print $1}' 到以前的命令,或以某种方式改变数据。

在所有这些之后,将sort | uniq -c 添加到前面的步骤中。 所以我得到的命令看起来像:

objdump --no-show-raw-insn \
        -M intel           \
        -sDj .text $(which *program name*) | 
             sed -n '/<\.text>/, $ p'      | 
             awk '{$1 = ""; print}'        |
             sed '1d'                      |
             awk '{print $1}' | sort | uniq -c

从程序的文本部分打印出每个助记符的频率

【讨论】:

  • 感谢您发布一个不错的解决方案。我删除了第一个sed,否则我什么也得不到。 .text 的内容也不是必需的,因此也不需要 -s。现在我确实得到了一份指令列表及其计数(以及一些额外内容)。
  • @wolfram77:请注意,此答案为您提供 static 指令计数。它对每条指令计数一次,无论是在紧密循环中还是在正常操作中根本不会执行的错误处理代码中。更多时候你想要 dynamic 指令计数,例如sde64 --mix How to characterize a workload by obtaining the instruction type breakdown? 和 How do I determine the number of x86 machine instructions executed in a C program?
  • 这看起来很有希望。 ls 上的 sde-mix-out.txt 列出了一堆操作码类型及其数量,其中有几个块。在目录的ls 上执行此操作时,似乎所有这些计数都匹配。当我进行比较时,我看到的唯一变化很可能是因为线程 ID 和内存地址发生了变化。谢谢,我会进一步研究,以了解输出。
  • 也许只能对另一种架构(如 Atmel AVR)进行静态指令使用统计,或者在模拟器上运行一些示例程序。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2018-03-25
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多