Почему неопределённая инструкция x86 называется ud2?

Why is the x86 undefined instruction called ud2? Why 2?

Инструкция ud2 гарантированно вызывает исключение «invalid opcode» и используется компиляторами для пометки недостижимого кода. Раньше программисты полагались на последовательности 0F FF и 0F B9, которые неофициально вызывали то же исключение. Когда Intel столкнулась с зависимостью от этих байтов, она официально закрепила их как ud0 и ud1, а рекомендованной сделала ud2 — двухбайтовую инструкцию без параметров.

С достаточным числом пользователей любое наблюдаемое поведение станет от кого-то зависеть.
  1. hacker_homie

    Вот так наконец верующие в 0F FF были вознаграждены честью получить опкод UD0, сделавший его единственным и истинным оригинальным невалидным опкодом, навечно опозорив приверженцев 0F B9 стыдом UD1.

  2. gtirloni

    Недавно мне пришлось отлаживать сборки, которые случайно падали, и ud2 из V8 уже поджидал меня.

  3. 349ru3h4f03

    Сейчас UD0, UD1, UD2 есть в SDM и APM.

    У нас также есть UDB (D6) — однобайтовый вариант, появившийся вместе с x86-64 для 64-битного режима.

    И у нас всегда был UDW (FF FF), он же группа #5 (первый FF) с байтом modrm mod=11b r/m=111b (/7) reg=111b (второй FF) — этот важен для памяти, где все биты выставлены в 1, или для шин, подтянутых ко всем 1, когда ни одно устройство не заявляет доступ.

  4. Neywiny

    Я не особо человек по x86, но на других архитектурах можно вызывать программные прерывания/исключения. Разве в x86 этого нет, или эти возможности не покрывали достаточно сценариев использования?

  5. ordu

    > Называется ud2, потому что вариант 0F FF был задним числом назван ud0, а вариант 0F B9 задним числом назван ud1, оставив ud2 рекомендованным неопределённым опкодом.

    Для меня как читателя это было неожиданностью. Когда я дошёл до этого предложения, я предположил, что 0f ff станет #1, а 0fb9 — #2. Но нет, Intel считает с нуля, так что есть третий ud.

Ещё за этот день

2026-09-13