Is this a valid x86 assembly instruction?
我刚刚下载了最新版本的 SmartMusic (http://www.smartmusic.com) 并第一次尝试运行它。
问题是,在初始屏幕上有一个未处理的 Win32 异常。
作为一个极客/黑客(在这个词的原始意义上),我当然想知道为什么会这样,所以我打开了我的 Visual Studio 调试器来查看程序集并在调试器下运行它。
未处理的异常是\\'非法指令\\',导致它跳闸的指令是:
现在,我不太了解组装,但这对我来说似乎是一个有效的说明(这里有一些关于它的信息)所以我想知道是否有人知道这是怎么回事以及如何(如果可能)修复它。
(我宁愿修理一些东西然后把它解决掉,而不是花一个小时在技术支持的电话上,然后得到"我们会让人看看它,谢谢你打电话祝你有美好的一天
顺便说一句,我试过重新安装它,所以不是这样:)
这里是异常前后的代码
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 年之前左右)?
编辑:是的,这就是问题所在。 Athlon XP 线有 SSE,但没有 SSE2,这是非法指令的原因。我想是时候进行现代化改造了。越来越多的软件需要 SSE2 和 SSE3。
为什么这个可以生成 exc 的所有变体都列在您链接的页面上。 SIGILL 是
#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.