x86 исключения и флаги

1298
user32569

пожалуйста, я знаю, что когда вы, например, делите на ноль, флаг апроптиата устанавливается в регистр флага процессора. Но сегодня я прочитал, что есть специальные векторы прерываний (я думаю, первые 16 в IVT), которые используются для таких условий, как деление на ноль. Итак, что я хочу спросить, так это то, что любая ситуация, которая вызывает изменение флага сома, также вызывает соответствующее прерывание? Так как в школе мы использовали условные переходы, которые проверяют, был ли установлен флаг переноса или нет, и я не помню, чтобы было какое-то прерывание, вызванное этим. Так что я сейчас в замешательстве.

3
Пример минимального 16-битного реального режима деления на ноль: https://github.com/cirosantilli/x86-bare-metal-examples/blob/9e58c1dc656dab54aa69daa38f84eb8c0aa6151e/interrupt_zero_divide.S 32-битная версия: https://github.com/ cirosantilli / х86-обнаженный металл примеры / блобы / 9e58c1dc656dab54aa69daa38f84eb8c0aa6151e / idt.S Ciro Santilli 新疆改造中心 六四事件 法轮功 8 лет назад 0

1 ответ на вопрос

3
qbeuek

Есть два типа прерываний.

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

Второй тип - это прерывания для сигнализации о каком-то непредвиденном состоянии. Вот некоторые примеры: доступ к недопустимой памяти, деление на ноль (на самом деле это «переполнение деления», которое происходит не только при делении на ноль, но даже при делении очень большого значения на очень маленькое значение), инструкция точки останова, аппаратная точка останова и т. д. Этот тип исключений выдается процессором, когда он не может выполнить текущую инструкцию и обычно приводит к прекращению текущего процесса или к отладчику. Они на самом деле не связаны с флагами процессора, которые содержат результаты последней инструкции.

Похожие вопросы