Assembler - язык неограниченных возможностей


Обработка прерываний и исключений - часть 8



INT 0Ch — ошибка #SS «Ошибка стека»

Это исключение вызывается при попытке выхода за пределы сегмента стека при выполнении любой команды, работающей со стеком, — как явно (POP, PUSH, ENTER, LEAVE), так и неявно (MOV AX,[BP + 6]), а также при попытке загрузить в регистр SS селектор сегмента, помеченного как отсутствующий (не только при выполнении команд MOV, POP и LSS, но и при переключении задач, вызове и возврате из процедуры на другом уровне привилегий).

Обработчик этого исключения получает код ошибки.

Код ошибки равен селектору сегмента, вызвавшего ошибку, если она произошла из-за отсутствия сегмента или при переполнении нового стека в межуровневой команде CALL. Во всех остальных случаях код ошибки — ноль.


INT 0Dh — исключение #GP «Общая ошибка защиты»

Все ошибки и ловушки, не приводящие к другим исключениям, вызывают #GP — в основном нарушения привилегий.

Обработчик этого исключения получает код ошибки.

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


INT 0Eh — ошибка #PF «Ошибка страничной адресации»

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

Обработчик этого исключения получает код ошибки.

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

бит 0: 1, если причина ошибки — нарушение привилегий;
0, если было обращение к отсутствующей странице
бит 1: 1, если выполнялась операция записи,
0, если чтения
бит 2: 1, если операция выполнялась из CPL = 3,
0, если CPL < 3
бит 3: 0, если ошибку вызвала попытка установить зарезервированный бит в каталоге страниц
  остальные биты зарезервированы

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




Начало  Назад  Вперед