【发布时间】: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