Условия возникновения исключений

Ниже подробнее опишем условия генерации тех или иных исключений. Каждое описание классифицирует исключение как сбой, ловушку или аварийное завершение. Такая классификация обеспечивает информацию, необходимую системным программистам для рестарта процедуры, в которой встретилось данное исключение.

Сбои - Сохраненное содержимое регистров CS и EIP указывает на команду, сгенерировавшую сбой.

Ловушки - Сохраненное содержимое регистров CS и EIP, записанное в момент срабатывания ловушки, указывает на команду, которая должна быть выполнена после команды, сгенерировавшей ловушку. Если ловушка обнаружена в команде передачи управления, сохраненное содержимое регистров CS и EIP отражает эту передачу управления. Например, если ловушка сработала в команде JMP, то сохраненное значение регистров CS и EIP указывает на адрес назначения перехода команды JMP, а не на команду в следующем адресе после команды JMP.

Аварийные завершения - это исключения, не позволяющие ни точного определения команды, вызвавшей его, ни рестарта программы, в которой произошло это исключение. Аварийные завершения используются для сообщения о серьезных ошибках, таких как аппаратные ошибки или противоречивые или недопустимые значения в системных таблицах.

Исключение 0 - Ошибка деления

Сбой типа "ошибки деления" встречается в командах DIV или IDIV, при делителе равном 0.

Исключение 1 - Отладочные исключения

Процессор генерирует исключения для нескольких условий: то, является ли данное исключение сбоем или ловушкой, зависит от условия, как показано ниже:

· Сбой в контрольной точке адреса команды;

· Ловушка в контрольной точке адреса данных;

· Ловушка шага выполнения;

· Ловушка контрольной точки переключения задачи.

Процессор не помещает код ошибки для данного исключения в стек. Обработчик прерывания может исследовать отладочные регистры для того, чтобы определить, какое условие вызвало исключение.

Исключение 3 - Контрольная точка

Команда INT 3 генерирует ловушку типа контрольной точки. Команда INT 3 имеет длину один байт, что упрощает замену кода операции в кодовом сегменте в оперативной памяти кодом операции контрольной точки. Операционная система или система отладки может использовать сегмент данных, отображенный в том же физическом адресном пространстве, что и кодовый сегмент, для помещения команды INT 3 в точках, где желательно вызвать отладчик. Отладчики используют контрольные точки для приостановки выполнения программы, чтобы иметь возможность исследовать регистры, переменные программы и т.д.

Сохраненное содержимое регистров CS и EIP указывает на байт, следующий за контрольной точкой. Если отладчик позволяет возобновление приостановленной программы, он заменяет команду INT 3 исходным кодом операции по адресу контрольной точки, а также декрементирует сохраненное содержимое регистра EIP перед возвратом.

Исключение 4 - Переполнение

Ловушка переполнения происходит, когда процессор выполняет команду INTO при установленном флаге IF. Поскольку арифметические операции со знаком и без знака используют некоторые общие команды, процессор не в состоянии определить, когда фактически происходит переполнение. Вместо этого он устанавливает флаг OF, когда результаты, интерпретируемые как числа со знаком, выходят за пределы допустимого диапазона. При выполнении арифметических операций с операндами, имеющими знак, флаг OF можно тестировать непосредственно, либо при помощи команды INTO.

Исключение 5 - Контроль диапазона

Сбой типа "контроля диапазона" генерируется процессором, когда при выполнении команды BOUND обнаруживается, что операнд превышает заданные границы. Программа может использовать команду BOUND для контроля того, что индекс массива, имеющий знак, находится в пределах, определенных для этого блока памяти.

Исключение 6 - Неверный код операции

Сбой "неверного кода операции" генерируется, когда исполнительный модуль обнаруживает неверный код операции. (Данное исключение не будет обнаружено до тех пор, пока не будет сделана попытка выполнить неверный код операции; т.е. предварительная выборка неверного кода операции, без выполнения, не ведет к данному исключению). Код ошибки в данном случае на стек не помещается. Такое исключение может обрабатываться в пределах той же задачи.

Это исключение происходит также при неверном типе операнда для данного кода операции. Примером может служить команда межсегментного перехода JMP, использующая регистровый операнд, либо команда LES с регистровым исходным операндом.

Третье условие генерации данного исключения состоит в использовании префикса LOCK с командой, для которой захват шины невозможен. Только определенные команды могут работать с захватом шины, и из них могут использоваться только те, что выполняют запись по адресу назначения в памяти. Все прочие использования префикса LOCK приводят к генерации исключения неверного кода операции.

Неопределенные коды операций:

-----------------------------------------------------------------

Однобайтовые

-----------------------------------------------------------------

D6

F1

-----------------------------------------------------------------

Двухбайтовые

-----------------------------------------------------------------

F 07

F 10

F 11

F 12

F 13

F6 XX

F7 XX

C0 XX

C1 XX

D0 XX

D1 XX

D2 XX

D3 XX

-----------------------------------------------------------------

Наши рекомендации