【问题标题】:Is this a valid x86 assembly instruction?这是一个有效的 x86 汇编指令吗?
【发布时间】:2011-08-03 23:38:15
【问题描述】:

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

这是异常前后的代码

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

【问题讨论】:

  • 你想让我们调试一个给定一行汇编的程序吗?
  • 如果你愿意,我会在它之前和之后发布前约 20 行。这是一个巨大的程序(从第 0x004DBB24 行抛出异常),所以我不能发布整个内容。主要是我想知道这条指令是否合法
  • cvtdq2ps命令是否允许输入和输出操作数引用同一个寄存器?
  • @aroth:是的,cvtdq2ps 可以就地操作。

标签: exception binary x86


【解决方案1】:

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

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

【讨论】:

  • 我不记得我是什么时候拿到这个盒子的,但它可能已经很旧了......它有一个 AMD Athlon XP 2800+ 处理器,如果你说的是这个的话
  • @Nate Koppenhaver:是的,这就是问题所在。 Athlon XP 不支持 SSE2。
  • 好的,谢谢!我父母让我买一个新的 Windows 盒子的另一个理由;)
【解决方案2】:

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

#UD 如果未屏蔽 SIMD 浮点异常且 CR4.OSXM MEXCPT[bit 10] = 0。如果 CR0.EM[bit 2] = 1。如果 CR4.OSFXSR[bit 9 ] = 0。如果 CPUID.01H:EDX.SSE2[bit 26] = 0。如果使用 LOCK 前缀。

其他可能的原因是处理器无法解码指令(2003 年之前不支持 SSE2;Pentium3 或 AMD)。更好的手册列出了这一点: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 - 如果一个未屏蔽的 SIMD 浮点异常并且 CR4 中的 OSXMMEXCPT 为 0。如果 CR0 中的 EM 已设置。如果 CR4 中的 OSFXSR 为 0。如果 CPUID 功能标志 SSE2 为 0。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2015-06-29
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多