0x cc против 0x cd 03 (int 3) - PullRequest
       13

0x cc против 0x cd 03 (int 3)

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

Отладчики генерируют инструкцию int3 в точке останова, чтобы элемент управления перешел к отладчику обработчика исключений.Для int3 отладчики вставят 0x куб.Почему они не вставляют 0x cd 03, что также означает int3?Что будет, если они вставят 0x cd 03 вместо 0x cc?

1 Ответ

2 голосов
/ 29 сентября 2019

Документация 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.(Да, это то, что вы можете сделать. Большинство отладчиков позволяют вам возобновить работу, пропустив эту инструкцию.)

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