Это действительная инструкция по сборке x86? - PullRequest
3 голосов
/ 04 августа 2011

Я только что скачал последнюю версию SmartMusic (http://www.smartmusic.com) и попытался запустить ее в первый раз.
Дело в том, что на заставке есть необработанное исключение Win32.
Будучи выродком / хакером (в первоначальном смысле этого слова) я, конечно, хотел выяснить, почему все так, поэтому я открыл свой отладчик Visual Studio, чтобы посмотреть на сборку и запустить ее под отладчиком.
Необработанное исключение - это «Незаконная инструкция», и команда, которая его вызывает:
cvtdq2ps xmm0,xmm0
Сейчас я не очень разбираюсь в сборке, но для меня это выглядит как правильная инструкция ( здесь - это некоторая информация), поэтому мне было интересно, знает ли кто-нибудь, как это неправильно и как (если возможно) ) чтобы исправить это.
(Я бы предпочел что-то исправить и просто покончить с этим, чем потратить час на телефон с техподдержкой и просто получить «у нас будет кто-нибудь, посмотрите, спасибо за звонок, хорошего дня * 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

Ответы [ 2 ]

6 голосов
/ 04 августа 2011

Вы работаете на очень старой машине (до 2005 года или около того)? cvtdq2ps требует SSE2; мне трудно представить, что кто-то все еще использует аппаратное обеспечение, которое не поддерживает SSE2, но это возможно.

Редактировать : да, это проблема. Линия Athlon XP имеет SSE, но не SSE2, что является причиной недопустимых инструкций. Думаю, пришло время модернизироваться. Все больше и больше программного обеспечения требует SSE2 и SSE3.

0 голосов
/ 04 августа 2011

Все варианты, почему этот может генерировать exc, перечислены на странице, на которую вы ссылаетесь.SIGILL равен #UD:

# UD Если исключение с плавающей запятой без маски и CR4.OSXM MEXCPT [бит 10] = 0. Если CR0.EM [бит 2] = 1. Если CR4.OSFXSR [бит 9] = 0. Если CPUID.01H: EDX.SSE2 [бит 26] = 0. Если используется префикс LOCK.

Дополнительная возможная причина:когда процессор не может декодировать инструкцию (не поддерживает 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 - Если без маскируемого исключения SIMD с плавающей точкой и OSXMMEXCPT в CR4 равен 0. Если EM в CR0 установлен.Если OSFXSR в CR4 равен 0. Если флаг функции CPUID SSE2 равен 0.

...