Почему неопределённая инструкция x86 называется ud2?
Why is the x86 undefined instruction called ud2? Why 2?
Инструкция ud2 гарантированно вызывает исключение «invalid opcode» и используется компиляторами для пометки недостижимого кода. Раньше программисты полагались на последовательности 0F FF и 0F B9, которые неофициально вызывали то же исключение. Когда Intel столкнулась с зависимостью от этих байтов, она официально закрепила их как ud0 и ud1, а рекомендованной сделала ud2 — двухбайтовую инструкцию без параметров.
С достаточным числом пользователей любое наблюдаемое поведение станет от кого-то зависеть.
- hacker_homie
Вот так наконец верующие в 0F FF были вознаграждены честью получить опкод UD0, сделавший его единственным и истинным оригинальным невалидным опкодом, навечно опозорив приверженцев 0F B9 стыдом UD1.
- gtirloni
Недавно мне пришлось отлаживать сборки, которые случайно падали, и ud2 из V8 уже поджидал меня.
- 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, когда ни одно устройство не заявляет доступ.
- Neywiny
Я не особо человек по x86, но на других архитектурах можно вызывать программные прерывания/исключения. Разве в x86 этого нет, или эти возможности не покрывали достаточно сценариев использования?
- ordu
> Называется ud2, потому что вариант 0F FF был задним числом назван ud0, а вариант 0F B9 задним числом назван ud1, оставив ud2 рекомендованным неопределённым опкодом.
Для меня как читателя это было неожиданностью. Когда я дошёл до этого предложения, я предположил, что 0f ff станет #1, а 0fb9 — #2. Но нет, Intel считает с нуля, так что есть третий ud.