当Windows遇到二进制文件中的未知指令时会发生什么?

时间:2010-09-28 08:56:27

标签: c++ winapi operating-system

我们有一个使用SSE3优化编译的二进制文件,最终使用指令LDDQU。现在,当这个代码在Windows系统(单核,XP2)上执行时,它只支持SSE1,2(通过CPU-Z工具看到),然后应用程序崩溃。

(924.4f0):锁序列无效 - 代码c000001e(第一次机会) ... 001700a10 f20ff00430 lddqu xmm0,xmmword ptr [eax + esi] ds:0023:1e08d200 = 270a57364a4a77896db676459d8c40a9 ......

有人可以告诉我这次崩溃意味着什么和可能的修复?

3 个答案:

答案 0 :(得分:3)

在不支持SSE3的CPU上运行时,应用程序使用SSE3支持进行编译并崩溃。哎呀,好奇怪!用于选择指令集的编译器选项必须在那里,因为微软的一些程序员有一天觉得很无聊。

您有几种选择:

  • 仅使用SSE2指令集制作单个版本的应用程序
  • 使用不同的指令集编译不同版本的应用程序
  • 使用结构化异常处理(SEH)来实现不受支持的指令的用户模式模拟。

最后一种方法比前两种方法更耗时,但有一些性能问题,但这些方面的缺点远小于它给你的优势。如果您选择第三个解决方案,您还可以创建自己的操作码!模糊程序控制流程的完美方式,这对阻碍程序的逆向工程非常有用,从而保护您的IP

答案 1 :(得分:0)

这是遇到它不知道的指令的硬件。就像你不能让motorola芯片执行x86代码一样,这个处理器不能识别LDDQU指令。

CPU将引发一个由OS处理的中断,并转换为您收到的错误消息。

你能做什么?您也只能为“较低级别”平台构建二进制文件。可能目标“x86”会做。然后编译器将发出符合x86的代码。您可能希望以两个版本发布您的软件:“优化”和“兼容”。

答案 2 :(得分:0)

引发异常,通常EXCEPTION_ILLEGAL_INSTRUCTION来自msdn

  

EXCEPTION_ILLEGAL_INSTRUCTION   线程试图执行无效   指令。

但是,在你的情况下,CPU无法正确地插入执行流并将其分解成更小的部分,从而导致未定义的行为(在此,一些指令从SSE3的残余字节中添加了LOCK前缀)指令,但它不支持LOCK前缀和单一异常)。除了制作SSE2版本,或测试SSE falgs并根据支持的内容编写代码之外,真的没什么可做的。