Что происходит, когда Windows встречает неизвестную инструкцию в двоичном файле? - PullRequest
2 голосов
/ 28 сентября 2010

У нас есть двоичный файл, скомпилированный с оптимизацией SSE3, который в итоге использует инструкцию LDDQU.Теперь, когда этот код выполняется в системе Windows (одноядерный, XP2), которая имеет только поддержку SSE1,2 (как видно из инструмента CPU-Z), тогда происходит сбой приложения.

(924.4f0): недопустимая последовательность блокировки - код c000001e (первый шанс) ... 001700a10 f20ff00430 lddqu xmm0, xmmword ptr [eax + esi] ds: 0023: 1e08d200 = 270a57364a4a77896db676459d8403 * 940c4031004 * Может кто-нибудь просветить меня, что означает этот сбой и возможные исправления?

Ответы [ 3 ]

3 голосов
/ 28 сентября 2010

Приложение скомпилировано с поддержкой SSE3 и аварийно завершает работу при запуске на процессоре, не поддерживающем SSE3.Ну и дела, так странно!Опции компилятора для выбора набора команд должны быть там только потому, что одному программисту в Microsoft однажды надоело чертовски.

У вас есть несколько вариантов:

  • сделать одну версию приложенияиспользование только набора команд SSE2
  • делает разные версии приложения скомпилированными с разными наборами команд
  • использует структурированную обработку исключений (SEH) для реализации эмуляции режима неподдерживаемых команд в пользовательском режиме.*

    Последний подход занимает немного больше времени, чем первые два, имеет некоторые проблемы с производительностью, но эти недостатки намного меньше, чем преимущества, которые он дает вам.Если вы выберете третье решение, вы также сможете изобретать свои собственные коды операций! Идеальный способ запутать поток управления программой, что опять-таки очень полезно для предотвращения реинжиниринга вашей программы и, таким образом, защиты вашего IP.

0 голосов
/ 28 сентября 2010

Это должно вызвать исключение, обычно EXCEPTION_ILLEGAL_INSTRUCTION из msdn :

EXCEPTION_ILLEGAL_INSTRUCTION Поток пытался выполнить недействительный инструкция.

однако, в вашем случае ЦП не смог должным образом взаимодействовать с потоком выполнения и разбил его на более мелкие части, что привело к неопределенному поведению (в этом к некоторой инструкции добавлен префикс LOCK, из остаточного байта из SSE3 инструкция, но она не поддерживает префикс LOCK и исключение singals). на самом деле ничего не поделаешь, кроме как сделать версию SSE2 или проверить на наличие ошибок SSE и разбить код на основе того, что поддерживается)

0 голосов
/ 28 сентября 2010

Это аппаратное обеспечение, которое встречает команду, которую не знает.Точно так же, как вы не можете позволить чипу Motorola выполнять код x86, этот процессор не распознает инструкцию LDDQU.

ЦП вызовет прерывание, которое обрабатывается ОС и преобразуется в сообщение об ошибкеВы получили.

Что вы могли бы сделать?Вы также можете создать свой бинарный файл только для платформы «нижнего уровня».Вероятно, цель "x86" подойдет.Затем компилятор выдаст код, совместимый с x86.Возможно, вы захотите выпустить свое программное обеспечение в двух версиях: «оптимизированная» и «совместимая».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...