关于异常:这是有效的 x86 汇编指令吗?

Is this a valid x86 assembly instruction?

我刚刚下载了最新版本的 SmartMusic (http://www.smartmusic.com) 并第一次尝试运行它。
问题是,在初始屏幕上有一个未处理的 Win32 异常。
作为一个极客/黑客(在这个词的原始意义上),我当然想知道为什么会这样,所以我打开了我的 Visual Studio 调试器来查看程序集并在调试器下运行它。
未处理的异常是\\'非法指令\\',导致它跳闸的指令是:
cvtdq2ps xmm0,xmm0
现在,我不太了解组装,但这对我来说似乎是一个有效的说明(这里有一些关于它的信息)所以我想知道是否有人知道这是怎么回事以及如何(如果可能)修复它。
(我宁愿修理一些东西然后把它解决掉,而不是花一个小时在技术支持的电话上,然后得到"我们会让人看看它,谢谢你打电话祝你有美好的一天*点击* ")
顺便说一句,我试过重新安装它,所以不是这样:)

这里是异常前后的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
je          004DBAEA  
mov         edx,dword ptr [esp+8]  
push        edx  
call        007806A0  
mov         eax,dword ptr [esi+4]  
mov         ecx,dword ptr [eax+3EF0h]  
test        ecx,ecx  
je          004DBAFC  
call        007506A0  
mov         eax,dword ptr [esi+1CCh]  
mov         ecx,dword ptr [esi+4]  
mov         edx,dword ptr [ecx]  
push        eax  
mov         eax,dword ptr [edx+218h]  
call        eax  
mov         ecx,dword ptr [esi+4]  
mov         edx,dword ptr [ecx]  
movd        xmm0,dword ptr [esi+1B8h]  
mov         eax,dword ptr [edx+26Ch]  
push        ecx  
cvtdq2ps    xmm0,xmm0   ; this is the instruction it chokes on
movss       dword ptr [esp],xmm0  
call        eax  
mov         ecx,dword ptr [esi+4]  
movss       xmm0,dword ptr [esi+1ACh]  
movss       dword ptr [ecx+4ACh],xmm0  
xor         eax,eax  
cmp         dword ptr [esi+1B0h],eax  
setne       al  
cmp         eax,1  
mov         dword ptr [esi+1B0h],eax  
mov         eax,dword ptr [esi+4]  
sete        dl  
mov         byte ptr [eax+0ED2h],dl  
mov         edx,dword ptr [esi+4]  
xor         eax,eax  
cmp         dword ptr [esi+1B4h],eax  
setne       al  
cmp         eax,1


您是否在一台非常旧的机器上运行(2005 年之前左右)? cvtdq2ps 需要 SSE2;我很难想象有人仍在使用缺乏 SSE2 支持的硬件,但这是可能的。

编辑:是的,这就是问题所在。 Athlon XP 线有 SSE,但没有 SSE2,这是非法指令的原因。我想是时候进行现代化改造了。越来越多的软件需要 SSE2 和 SSE3。


为什么这个可以生成 exc 的所有变体都列在您链接的页面上。 SIGILL 是 #UD:

#UD If an unmasked SIMD floating-point exception and CR4.OSXM MEXCPT[bit 10] = 0. If CR0.EM[bit 2] = 1. If CR4.OSFXSR[bit 9] = 0. If CPUID.01H:EDX.SSE2[bit 26] = 0. If the LOCK prefix is used.

另外一个可能的原因是处理器无法解码指令(不支持 SSE2;Pentium3 或 AMD 2003 年之前)。更好的手册列出了这一点:http://www.jaist.ac.jp/iscenter-new/mpc/altix/altixdata/opt/intel/vtune/doc/users_guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/mergedProjects/instructions/instruct32_hh /vc48.htm

#UD - If an unmasked SIMD floating-point exception and OSXMMEXCPT in CR4 is 0. If EM in CR0 is set. If OSFXSR in CR4 is 0. If CPUID feature flag SSE2 is 0.