我们有一个使用SSE3优化编译的二进制文件,最终使用指令LDDQU。现在,当这个代码在Windows系统(单核,XP2)上执行时,它只支持SSE1,2(通过CPU-Z工具看到),然后应用程序崩溃。
(924.4f0):锁序列无效 - 代码c000001e(第一次机会) ... 001700a10 f20ff00430 lddqu xmm0,xmmword ptr [eax + esi] ds:0023:1e08d200 = 270a57364a4a77896db676459d8c40a9 ......
有人可以告诉我这次崩溃意味着什么和可能的修复?
答案 0 :(得分:3)
在不支持SSE3的CPU上运行时,应用程序使用SSE3支持进行编译并崩溃。哎呀,好奇怪!用于选择指令集的编译器选项必须在那里,因为微软的一些程序员有一天觉得很无聊。
您有几种选择:
最后一种方法比前两种方法更耗时,但有一些性能问题,但这些方面的缺点远小于它给你的优势。如果您选择第三个解决方案,您还可以创建自己的操作码!模糊程序控制流程的完美方式,这对阻碍程序的逆向工程非常有用,从而保护您的IP
答案 1 :(得分:0)
这是遇到它不知道的指令的硬件。就像你不能让motorola芯片执行x86代码一样,这个处理器不能识别LDDQU指令。
CPU将引发一个由OS处理的中断,并转换为您收到的错误消息。
你能做什么?您也只能为“较低级别”平台构建二进制文件。可能目标“x86”会做。然后编译器将发出符合x86的代码。您可能希望以两个版本发布您的软件:“优化”和“兼容”。答案 2 :(得分:0)
应引发异常,通常EXCEPTION_ILLEGAL_INSTRUCTION
来自msdn:
但是,在你的情况下,CPU无法正确地插入执行流并将其分解成更小的部分,从而导致未定义的行为(在此,一些指令从SSE3的残余字节中添加了LOCK前缀)指令,但它不支持LOCK前缀和单一异常)。除了制作SSE2版本,或测试SSE falgs并根据支持的内容编写代码之外,真的没什么可做的。EXCEPTION_ILLEGAL_INSTRUCTION 线程试图执行无效 指令。