Документация Intel для этой инструкции отвечает на ваш вопрос для вас: в разделе «Описание» в записи руководства vol.2 для int
/ int3
написано:
Инструкция INT3 использует однобайтовый код операции (CC) и предназначена для вызова обработчика исключений отладки с исключением точки останова (#BP).(Эта однобайтовая форма полезна, поскольку она может заменить первый байт любой инструкции, для которой требуется точка останова, включая другие однобайтовые инструкции, без перезаписи других инструкций .)
Существуют некоторые однобайтовые инструкции x86, такие как push reg
.Или в 16/32-битном режиме inc/dec reg
. Если 1-байтовая инструкция была последней инструкцией перед целью ветвления , перезапись ее более длинной инструкцией повредила бы первый байт инструкции, которая может выполняться без достижения точки останова.
Существуют и другие отличия для режима vm86 между двухбайтовой кодировкой cd 03
int 3
по сравнению с 1-байтовой кодировкой int3
, снова документированной прямо в руководстве.(Предположительно, чтобы было проще писать отладчики, которые отлаживают гостевую версию vm86 извне среды vm86.)
Прерывание, сгенерированное инструкцией INTO
, INT3
или INT1
, отличается отодин генерируется INT n
следующими способами:
- Обычные проверки IOPL не выполняются в режиме virtual-8086.Прерывание берется (без ошибок) с любым значением IOPL.
- Перенаправление прерываний, включенное расширениями режима виртуальной машины 8086 (VME), не происходит.Прерывание всегда обрабатывается обработчиком защищенного режима.
(Эти функции не относятся к CD03
, «нормальному» 2-байтовому коду операции для INT 3. Сборщики Intel и Microsoft не будутсгенерируйте код операции CD03
из любой мнемоники, но этот код операции может быть создан путем прямого определения числового кода или с помощью самоизменяющегося кода.)
Кстати, в NASM / YASM вы делаете необходимо использовать мнемонику int3
для кодирования 1 байта;int 3
собирается до CD 03
GAS собирает int $3
так же, как int3
, до 0xcc
Но, конечно, отладчики работают с двоичным машинным кодом, а не с ассемблеромисточник.Мнемоника ассемблера применяется только к ручному включению точки останова в исходный код asm.(Да, это то, что вы можете сделать. Большинство отладчиков позволяют вам возобновить работу, пропустив эту инструкцию.)