Undefined instruction
Oct 20, 2008 · CommentsАссемблерПрограммированиеx86
Набор команд x86-совместимых процессоров за годы эволюции набрал немалое количество всякой экзотики. Один из примеров такой экзотики – инструкция UD2. Задача этой инструкции состоит в том, чтобы… быть несуществующей инструкцией. Выполнение UD2 всегда приводит к генерации исключения «Invalid opcode». Отличие UD2 от любой другой несуществующей инструкции в том, что эта инструкция гарантированно не станет корректной инструкцией в будущем.
Интересна мнемоника этой команды. Суффикс «2» подразумевает, что есть еще и как минимум UD1 или UD, но ни Intel ни AMD не описывают такой инструкцию. Поиск по интернету показывает, что некоторые компиляторы поддерживают (или поддерживали) три варианта этой команды:
-
UD0 (0F FF)
-
UD1 или UD2B (0F B9)
-
UD2 или UD2A (0F 0B)
Ни одна из этих команд не является корректной командой, но все они по-разному описывается в документации Intel и AMD. Инструкции UD0 (0F FF) соответствует пустая ячейка в таблице двухбайтных команд. Т.е. эта инструкция не определена сейчас, но может быть переопределена в будущем.
Мнемоника UD1 не упоминается в “Programmer’s Manual”, но комбинация 0F B9 указана в таблице двухбайтных инструкций как «Undefined instruction opcode» и, соответственно, она не может быть переопределена впоследствии. Кроме этого указывается, что за 0F B9 должен следовать ModRM байт, определяющий расширение этой инструкции. Впрочем, все возможные комбинации ModRM байта в сочетании с кодом инструкции 0F B9 всё равно объявлены как «Undefined instruction». Закавыка правда в том, что в примерах, найденных в интернете, за 0F B9 не следует ничего. Кому верить – не понятно.
UD2, похоже, наиболее полно описанный вариант «неопределенной инструкции». Она занимает ровно два байта, её мнемоника легализована и она прочно занимает свою ячейку в таблице двухбайтных команд.