应用程序使用哪种增强指令集?

应用程序使用哪种增强指令集?

有没有可靠且简单如何确定 exe 或 dll 是否使用特定增强指令集(例如 SSE4.1)?

对其进行反汇编ndiasm似乎会产生一个列表,您可以测试是否存在特定的指令,但事实并非如此,因为“垃圾”被反编译(任何十六进制数据都被解释为指令)产生了误报。

答案1

只有通过运行程序并观察哪些实际指令被发送到 CPU 才能做到这一点。例如,您可以在 VMware 虚拟机中执行此操作,它允许您从主机在 CPU 指令级别进行调试。甚至有一个 Visual Studio 插件可用于此目的。常规的旧调试器会工作如果您有耐心在指令级单步执行代码;但是,调试器不会让您在特定的操作码或操作码范围内中断。

程序能够发出在运行时执行的本机指令,这些指令不包含在可执行文件的代码部分中。如果没有这种行为,Java、.NET 和 JavaScript 等解释型语言将非常慢。通过允许在运行时编写代码,高级脚本语言可以编译为本机代码并动态存储在 RAM 中,同时根据实际应用程序用例调整代码以最快运行(例如,如果某个分支永远不会被采用,则从本机代码中删除该分支)。这称为 JIT 编译。

甚至一些本机程序也会做一些事情相似的对于 JIT 编译,磁盘上的二进制文件中的原始代码可能一直兼容到 486,但程序将动态确定它在哪个处理器上运行,并生成在该处理器上运行的代码,或使用二进制文件“数据”部分中的某些代码作为可执行代码。

这里这就是为什么像传统的调试器这样的程序gdb不允许你在特定的操作码或汇编指令上中断。这个问题的半高性能解决方案可能涉及某种类型的虚拟机,因为虚拟机管理程序可以准确地看到虚拟机管理客户机正在运行的代码,并将其作为输出提供给主机上的程序或用户界面。

相关内容