МУ к ЛР Сист прер

advertisement
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ им.
АКАДЕМИКА С.П. КОРОЛЕВА» (СГАУ)
Кафедра информационных систем и технологий
Система прерываний персональных ЭВМ IBM PC
Методические указания
к лабораторной работе
для студентов
Составитель: Павлов В.П.
Самара 2007
Цель работы - изучение и исследование принципов организации и функционирования
системы прерываний персональных ЭВМ типа IBM PC.
1 Организация системы прерывания программ
Назначение системы прерывания программ – оперативно реагировать на определенные
события, происходящие внутри и вне ЭВМ, путем выполнения специальной операции прерывания. Под операцией прерывания понимается (временное) прерывание процесса выполнения текущей программы и переключение процессора на выполнение другой программы, обслуживающей данную причину прерывания. По завершении обслуживания прерывания прерванный
процесс должен быть продолжен с того момента, в котором он был прерван. С этой целью в
момент прерывания процесса необходимо запомнить (сохранить) всю информацию, необходимую для его возобновления после обработки прерывания, т.е. информацию о состоянии процесса выполнения программы в момент прерывания.
Состояние программы (в текущий момент времени) – это набор параметров, основными из которых являются адрес текущей команды, формируемый счетчиком команд, признаки
результата (флаги), а также значения переменных, которые хранятся в ячейках памяти и регистрах процессора. В момент прерывания необходимо сохранить только ту информацию, которая размещена в регистрах процессора и будет (или может быть) изменена обработчиком прерывания. Эту информацию принято объединять в единое целое - слово состояния программы
(ССП). В ССП обычно включают адрес команды (содержимое счетчика команд), признаки
(флаги) результата и др. Значения переменных процесса, которые хранятся в регистрах общего
назначения, разделяемых во времени, также подлежат сохранению. Для сохранения ССП обычно используется основной памяти, организованная как стек.
Операция прерывания реализуется аппаратурой процессора и сводится к выполнению
следующих действий. Выполнение текущей программы прерывается. Прерывание обычно осуществляется по завершении текущей i-й команды программы. Выполнение i+1 команды не
начинается. В стеке сохраняется «старое» ССП (счетчик команд, содержащий i+1 - адрес следующей команды, признаки результата и т. п. информацию). Управление передается специальной программе (обработчику прерывания), обслуживающей данную причину прерывания. Для
этого используется соответствующее обработчику прерывания «новое» ССП, на основе которого в счетчик команд загружается пусковой адрес обработчика прерывания. Обработчик выполняет все действия, необходимые для обработки прерывания. Типичные действия обработчика
прерывания:
1) сохранение в стеке регистров, используемых в обработчике;
2) собственно обработка прерывания;
3) восстановление регистров и возврат из прерывания.
Возврат управления в прерванную программу осуществляется путем восстановления состояния программы на момент прерывания, которое возбуждается командой «возврат из прерывания» и реализуется выталкиванием из стека «старого» ССП.
Операция прерывания запускается (возбуждается) либо по сигналам прерывания, либо
по командам прерывания. Причины, по которым формируются (вырабатываются) сигналы прерываний, различны и делятся на внутренние и внешние. Внешние причины – это события, которые возникают вне процессора: в периферийных устройствах (например, в клавиатуре), в
других ЭВМ вычислительного комплекса, сигналы времени от таймера и т.п. Внутренние причины – это события, которые происходят внутри процессора.
Причины прерываний можно разделить на два типа: 1) события, при возникновении которых нормальное продолжение программы становится невозможным или бессмысленным (отказ аппаратуры, например); 2) события нормальные, естественные для вычислительного процесса, после обработки которых прерванная программа продолжается.
Для выявления отказов аппаратуры в состав ЭВМ обычно встраиваются специальные
схемы контроля, которые вырабатывают сигналы об ошибках (отказах) аппаратуры. По этим
сигналам происходит прерывание текущей программы и процессор переключается на выполне2
ние специальной программы диагностики неисправностей. Программа диагностики определяет
(локализует) место неисправности и сообщает об этом человеку – для ремонта (устранения отказа). До устранения отказа продолжение программы становится невозможным.
Другая группа событий, при появлении которых продолжение текущей программы становится бессмысленным, – это различного рода некорректности при выполнении программ,
программные ошибки. К ним относятся: переполнение разрядности сетки машины при обработке чисел, запрещенный код команды, неправильный адрес и т.п.
Нормальные (естественные) причины прерываний: это процессы ввода-вывода информации, которые часто инициируются по сигналам прерываний от устройств ввода-вывода, а
также обращения к различным программам ОС по командам прерывания. В ЭВМ типа IBM PC
для этих целей можно использовать команду прерывания типа INT N, которая встраивается в
пользовательскую программу в нужных местах. Эту группу причин прерываний принято называть «командные прерывания». Каждая причина (сигнал) прерывания идентифицируется номером прерывания N=0, 1, … . Номер прерывания N формируется в момент наступления события,
вызывающего прерывание.
Приоритеты прерываний. Прерывание происходит в момент окончания текущей команды. За время выполнения команды, а также за время выполнения обработчика прерывания,
в процессор может поступить несколько сигналов прерываний, одновременное обслуживание
которых невозможно. Для разрешения конфликтной ситуации сигналам (причинам) прерываний присваиваются различные приоритеты. Приоритет – это преимущественное право (перед
другими) на обслуживание – привилегия в обслуживании. Приоритет характеризуется целым
числом 0, 1, … . Чем меньше число, тем выше приоритет. Приоритеты распределяются между
причинами в зависимости от степени важности причины. В зависимости от динамики процессов быстропротекающим процессам обычно назначают более высокие приоритеты. Некорректность в работе аппаратуры (отказ) в отличие от некорректности в программе также необходимо
обслуживать в первую очередь. Некорректную программу можно снять со счета и начать выполнять другую программу. Отказ же аппаратуры делает невозможным выполнение любой программы. Поэтому реакция на отказ должна иметь преимущества перед другими причинами прерываний.
Маскирование прерываний. ЭВМ должна иметь средства, позволяющие избирательно,
гибко реагировать на различные сигналы (причины) прерывания. Например, если пришел сигнал прерывания от одной из схем контроля, то в этом случае нет необходимости реагировать на
другие сигналы прерываний (например, на переполнение разрядной сетки) до тех пор, пока неисправность аппаратуры не будет устранена. Следовательно, система прерываний должна обеспечивать возможность избирательно относиться к сигналам прерываний, т. е. в определенных
условиях реагировать на одни сигналы и не реагировать на другие. Для этих целей используется
маска прерываний – двоичный код М=m1…mk, , в котором каждой причине прерыв ния (тавится в соответо не бит маски mi. Если бит маски mi=0, то прерывание по i-й причине запрещено,
т.е. замаскировано. Если mi=1, то разрешено, т.е. не замаскировано. Таким образом, операция
прерывания возбуждается только незамаскированным сигналом прерывания.
Маска прерываний хранится в процессоре как составная часть ССП, куда она обычно загружается (привилегированной) командой «загрузить маску». Если все разряды маски равны
нулю, процессор не реагирует ни на одну причину прерывания. В простейших ЭВМ для маскирования прерываний используются две команды «запретить прерывания» и «разрешить прерывания», выполнение которых приводит к запрещению и разрешению прерываний сразу по всем
причинам.
Простейшая схема системы прерываний представлена на рисунке 1. Обслуживание прерываний в соответствии с их приоритетами обеспечивает арбитр. При появлении хотя бы одного незамаскированного сигнала прерывания λ`i на выходе элемента «ИЛИ» формируется активный сигнал, который подается в цепь запроса прерываний арбитра. По нему процессор прерывает выполнение текущей программы, сохраняет «старое» ССП в памяти, а арбитр приступает к
поиску источника (устройства), пославшего сигнал прерывания. Поиск осуществляется в по3
рядке установленных приоритетов, т.е. начинается с источника прерывания, имеющего
наивысший приоритет, и ведется в порядке убывания приоритетов. Поиск продолжается до тех
пор, пока не обнаружится устройство, пославшее сигнал прерывания (например, λ`2 =1). Другими словами, арбитр осуществляет поиск устройства с наивысшим в данный момент времени
приоритетом. Результатом поиска является номер прерывания N. По нему арбитр обращается к
специальной области памяти, в которой размещены ССП для разных причин прерывания, вы1
&
m1
2
&
’1
’2
1
Запрос
m2
…
…
АРБИТР
…
k
&
’k
mk
Маска
Рисунок 1
бирает оттуда соответствующее ССП и загружает его в процессор (в СК и др.). Тем самым запускается подпрограмма, обслуживающая данную причину прерывания. Следует отметить, что
в современных ЭВМ вместо термина ССП часто используется термин «вектор прерывания»
(ВП). Полный набор векторов называется таблицей векторов прерываний, которая размещается
в специальной области основной памяти.
Если в процессе обслуживания прерывания вырабатывается другой сигнал прерывания,
то возможны два варианта обслуживания. Первый - обслуживание по схеме с относительными
приоритетами (ОПР). Второй – обслуживание по схеме с абсолютными приоритетами (АПР). В
случае ОПР приоритет, который присваивается сигналу прерывания, относителен, т.е. действует не всегда, а только в момент одновременного поступления нескольких запросов прерываний.
Если же высокоприоритетный сигнал поступил позже, когда уже началось обслуживание сигнала с более низким приоритетом, то его обслуживание осуществляется без прерывания до завершения и только потом начинается обслуживание запроса с более высоким приоритетом. В
случае АПР приоритет абсолютен, т.е. действует всегда и вызывает прерывание подпрограммобработчиков прерывания с более низкими приоритетами. Схемы ОПР, АПР обеспечиваются
арбитром путем маскирования-демаскирования сигналов прерываний от других устройств на
время обслуживания текущего прерывания.
Обслуживание по схеме с относительными и абсолютными приоритетами иллюстрирует
временная диаграмма (рисунок 2). Как видно из временной диаграммы в случае АПР обслуживание запроса, поступившего в момент времени 3, приоритет которого выше запросов 1 и 2, завершается раньше, чем для случая ОПР. Напротив, обслуживание запросов 1 и 2 в случае АПР
задерживается ввиду их прерываний и завершается позже, чем в случае ОПР.
Для реализации функций арбитра можно применять два способа - программный и аппаратный. При программном способе функции арбитра выполняет специальная программа, которую реализует процессор – «программа-арбитр». Достоинство программной реализации - минимальные затраты оборудования. Недостаток - существенные затраты времени на арбитраж на поиск источника, пославшего запрос на прерывание, с наивысшим в данный момент времени
приоритетом. Для уменьшения времени арбитража естественно использовать аппаратную реа4
лизацию функций арбитра. Простейшая схема арбитра представлена на рисунке 3. В состав системы прерывания в этом случае вводится аппаратный арбитр, который кроме цепи запросов
прерываний ЗП, в которую по «ИЛИ» объединяются сигналы прерываний от устройств, содержит еще одну цепь – разрешение прерывания РП. Эта цепь последовательно подключается ко
всем устройствам в порядке установленных для них приоритетов.

1
2
3
t
ОПР
1
2
АПР
t
3
3
2
2
1
1
t
Общее время
Рисунок 2
Порядок функционирования схемы: устройство Ук посылает сигнал прерывания в цепь запросов прерываний ЗП и размыкает ключ в цепи РП. Арбитр, получив запрос на прерывание,
ждет завершения текущей команды в процессоре, после чего прерывает выполнение текущей
программы и заталкивает в стек «старое» ССП. После этого арбитр вырабатывает ответный
сигнал (импульс) «разрешение прерывания» и посылает его в цепь РП. Этот сигнал распространяется до ближайшего к арбитру устройства, пославшего запрос на прерывание (до устройства,
у которого разомкнут ключ в цепи РП), т. е. до устройства с наивысшим в данный момент вреЦП
Цепь запросов ЗП
Арбитр
У1
РП
…
УN
…
НП
НП
ШД
Рисунок 3
мени приоритетом. Получив сигнал по цепи РП, это устройство выставляет на шину данных
ШД процессора (и арбитра) свой индивидуальный номер прерывания НП. Он используется
процессором для извлечения из памяти «нового» ССП, которое загружается в процессор и
обеспечивает запуск обработчика прерывания с номером НП. Арбитраж на аппаратном уровне
реализуются значительно быстрее, поскольку осуществляется со скоростью распространения
электрических сигналов по электрическим цепям.
5
Более гибкая система приоритетов может быть организованна по многоуровневой схеме
(рисунок 4). В этом случае причины прерывания делятся на группы по уровням приоритетов.
Для каждой группы назначается свой уровень приоритета и используется своя цепь запросов
ЗПк, номер которой определяет приоритет – чем он меньше, тем выше приоритет. ОбслуживаЦепь запросов ЗП1
А
ЦП
Р
Б
…
У1
УN
Приоритеты
Схема
И
цепей
РП1
…
приоризапросов
Т
НП
НП
тетов
Р
…
Цепь запросов ЗПК
…
У1
НП
…
УМ
НП
ШД
Приоритеты устройств в цепи ЗП
Рисунок 4 – Многоуровневая система приоритетов
ние запросов в многоуровневой системе внутри группы осуществляется обычно по схеме с ОПР
(без прерываний обработчиков, образующих группу), а между группами – по схеме с АПР (с
прерыванием обработчиков из групп с более низким приоритетом).
2 Организация системы прерываний IBM PC
Процессоры, начиная с процессора i286, обеспечивают работу в трех режимах - реальный режим, защищенный и виртуальный 8086 (V8086). Организация и обслуживание прерываний в разных режимах различаются. Система прерываний реального режима такая же, как и в
процессоре i8086.
2.1 Система прерываний процессора i8086 (реальный режим i286+)
Каждой причине прерывания ставится в соответствие один из 256 векторов прерывания с
номером N, принимающим одно из значений 0, 1, … , 255. Вектор прерывания «БАС: D» – это
дальний адрес обработчика прерываний, состоит из двух 16-разрядных слов – базового адреса
сегмента БАС и смещения D. Векторы прерываний в виде таблицы векторов прерываний размешаются в области ОП с физическими адресами 0 – 3FFh. Вызов соответствующего обработчика прерываний осуществляется путем обращения к таблице векторов прерываний по N (т. е. к
ячейкам памяти по адресам 4N, 4N+2). Выбранный из таблицы по N вектор прерывания загружается в сегментный регистр CS (БАС) и в регистр-указатель команд IP (смещение D). Возврат
из прерывания осуществляется по команде IRET, которая ставится в конце обработчика прерывания.
Операция прерывания осуществляется в следующем порядке:
1) содержимое регистров Flags, CS и IP процессора (старое ССП) помещается в стек;
2) сбрасываются (обновляются) биты IF и TF регистра флагов (IF=0 - маскирует внешние
прерывания по входу INTR, TF=0 - запрещает трассировку, т. е. шаговый режим);
3) определяется причина (номер N) прерывания с наивысшим в данный момент времени
приоритетом (арбитраж);
4) по номеру N из таблицы извлекается вектор прерываний (из ячеек памяти с адресами
4N и 4N+2) и загружается в регистры CS, IP (новое значение ССП). Тем самым передается
управление подпрограмме обработки прерывания.
Возврат из обработчика прерывания осуществляется командой IRET, по которой из стека
в обратном порядке выталкиваются три слова (старое ССП) и загружаются в регистры IP, CS,
6
Flags соответственно.
Формат регистра флагов Flags процессора i8086 имеет вид:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
x x x x O D I T S Z x A x P x C
С - флаг переноса (при сложении, вычитании);
P - флаг четности (паритета);
A - флаг полупереноса (переноса между тетрадами – из 3 в 4 разряд байта);
Z - флаг нуля;
S - флаг знака (старшего разряда результата);
T - флаг трассировки (прерывание типа 1);
I - маска прерываний по входу INTR;
D - флаг направления (определяет порядок обработки строк);
O - флаг переполнения разрядной сетки;
x - не используется.
Причины прерываний для процессора i8086 делятся на программные, внутренние и
внешние.
Программные прерывания осуществляются по командам прерывания INTО, INT3, INT
N, используемым при программировании (встраиваемым в программы). Команда INT N (длиной два байта) вызывает обработчик прерываний с номером N(0,1, … ,256), указанным в адресной части команды. Используется обычно для вызова программ ОС. Команда INTО (прерывание по переполнению) является (безадресной) командой условного перехода. Обеспечивает
вызов подпрограммы (с фиксированным номером N=4) по условию (флагу) переполнения
OF=1. Команда INT3 (программный останов в контрольной точке) используется для отладки
программы и обслуживается вектором с фиксированным номером N=3.
Внутренние прерывания возбуждаются сигналами, генерируемыми в процессоре: 1) в
случае попытки деления на 0 (при выполнении операции деления результат не помещается в
операнд-приемник) процессор генерирует номер N=0, по которому вызывается обработчик; 2)
если для отладки программ используется шаговый режим, который задается битом трассировки
TF=1 в регистре флагов. Если TF=1, то после выполнения каждой команды программы вызывается обработчик с N=1, который отображает состояние текущей программы. Следует отметить,
что команды установки или сброса флага TF в системе команд отсутствуют. Поэтому управление флагом TF осуществляется опосредованно: путем пересылки регистра флагов через стек (по
команде PUSHF) в регистр общего назначения (по команде РОР R), установки требуемого значения TF в регистре R и обратной пересылки из регистра R в стек (PUSH R), а из стека в регистр флагов F (POPF).
Внешние (аппаратные) прерывания вызываются сигналами от внешних устройств.
Делятся на маскируемые и немаскируемые прерывания, вырабатываются асинхронно по отношению к исполняемой программе. Прерывание исполняемой программы по внешним сигналам
может наступить только после исполнения текущей команды. Длительные строковые команды
имеют специальные окна для прерываний.
Схема системы прерываний представлена на рисунке 5. Для внешних сигналов прерываний система прерываний является двухуровневой: арбитр системы прерываний имеет два входа
– NMI, INTR, на которые могут подаваться внешние сигналы прерываний.
Маскируемые прерывания вызываются сигналами, поступающими на вход INTR (Interrupt Request – запрос прерывания). На этот вход подается сигнал (запрос) прерывания с выхода
программируемого контроллера прерываний ПКП типа i8259А. Запросы прерываний от различных устройств У1, … , УК подаются на входы IRQk ПКП. Каждый из них может быть замаскирован маской m1 ... mk внутри ПКП. Объединенные по ИЛИ сигналы прерывания выдаются
на выход ПКП: =m11 … mkk, k=15, где 1 … k – сигналы прерываний на входах IRQk
ПКП. Запросом на прерывание является фронт сигнала . Он вызовет прерывание, если, в свою
7
очередь, не замаскирован битом маски IF из регистра флагов. Кроме маскирования контроллер
ПКП обеспечивает возможность программирования приоритетов сигналов по входам IRQ0
…IRQ15. По умолчанию (обычно) устанавливается следующая система приоритетов: запрос на
входе IRQ0 имеет наивысший приоритет и т. д. в порядке убывания приоритетов в соответствии
с таблицей 1.
INTR (ЗП1)
&
Деление на 0
IF
NMI (ЗП0)
TF=1
…
ПКП (маскирование сигналов и
гибкая система приоритетов)
INTA (ответ)
IRQ0
Арбитр
…
IRQ15
N
Внутренние
прерывания
У1
…
УК
ШД
Процессор
ЦП
Рисунок 5 – Схема системы прерываний IBM PC
Таблица 1 – Приоритеты прерываний (реальный режим MS DOS)
Номер преНомер входа
Причина прерывания
рывания N
IRQ
08
IRQ 0
Сигнал от таймеpа (вырабатывается 8.2 раза в
секунду)
09
IRQ 1
Сигнал от клавиатуры (вырабатывается при
нажатии и отжатии клавиши)
0A
IRQ 2
Используется для каскадирования контроллеров
i8259А
70
IRQ 8
Сигнал от часов реального времени
71
IRQ 9
Сигнал от контроллера монитора
72-74
IRQ 10...12
Резерв
75
IRQ 13
Сигнал от сопроцессора
76
IRQ 14
Пpеpывание от контроллера жесткого диска
77
IRQ 15
Резерв
0B
IRQ 3
Сигнал от порта COM 2
0C
IRQ 4
Сигнал от порта COM 1
0D
IRQ 5
Сигнал от порта LPT 2
0E
IRQ 6
Сигнал от контроллера гибких дисков
0F
IRQ 7
Сигнал от порта LPT 1
Контроллер ПКП выполнен на основе двух каскадом соединенных схем типа i8259А (рисунок 6). Вход IRQ2 ведущего ПКП используется для каскадного подключения ведомого ПКП с
целью увеличения числа входов IRQ (до 15-ти). В реальном режиме номера N и приоритеты
жестко закреплены за различными устройствами (таблица 1).
Каждый контроллер i8259А содержит в своем составе 8-разрядные регистры: регистр
IRR – запросов прерываний, регистр IMR – масок прерываний (по одной маске на каждый
вход), арбитр запросов прерываний, регистр принятых (не замаскированных) сигналов преры8
ваний, а также блоки управления, формирования выходных сигналов и др.
Немаскируемые прерывания вызываются сигналами, поступающими на вход NMI (Non
Процессор
INTR
INTA
INT
INTA
i8259A
(ведущий)
0 1 2 3 4 5 6 7
IRQ 0
1
2
3 4
5
6
INT
INTA
i8259А
(ведомый)
0 1 2 3 4 5 6 7
7
8 9 10 11 12 13 14 15
Рисунок 6
Mascable Interrupt – немаскируемое прерывание). На этот вход подаются сигналы прерываний
от источников, требующих безотлагательной обработки, поэтому по отношению к входу INTR
имеют более высокий приоритет. Маска IF на вход NMI не действует. На входе NMI запросом
на прерывание является высокий уровень сигнала. Запрос, поступивший на этот вход, обслуживается вектором прерываний с номером N=2. Этот номер формируется процессором автоматически. Обслуживание прерывания по входу NMI осуществляется без прерывания, так как этот
сигнал сбрасывается только после выполнения команды IRET.
Обслуживание внешних прерываний осуществляется следующим образом. Выполнение текущей команды завершается, запускается процедура прерывания: регистры флагов, CS, IP
заталкиваются в стек, сбрасываются биты IF, TF. Арбитр процессора осуществляет арбитраж.
Если прерывание пришло по входу NMI, приоритет которого
Вход (по N)
выше, то вызывается обработчик с N=2. Если прерывание
Сохранение РОН
пришло по входу INTR (IF=1), то арбитр процессора вырабатывает два ответных сигнала (импульса) INTA 1, INTA2, коSTI (IF=1)
торые посылаются в цепь разрешения прерывания INTA. Получив второй из них, ПКП сбрасывает сигнал запроса на выОбработка прерывания
ходе INT, осуществляет арбитраж запросов на входах IRQk (в
соответствии с таблицей 1 определяет, на каком из них имеетCLI (IF=0)
ся активный сигнал k с наивысшим в данный момент времени
приоритетом) и выдает на ШД процессора номер N вектора
прерываний. По нему процессор запускает соответствующий
Восстановление РОН
обработчик. Программа-обработчик сигнала, принятого по
входу INTR, не может быть прервана другим сигналом на вхоIRET
Возврат из
де INTR (так как бит маски IF=0) до тех пор, пока она сама не
прерывания
установит маску IF=1 (по команде STI). Поэтому рекомендуется следующая структура программы-обработчика прерываРисунок 7
ний по входу INTR (рисунок 7).
2.2 Система прерываний защищенного режима
В защищенном режиме используются два понятия - прерывание и исключение.
Прерываниями (interruption) называют системные ситуации, связанные с выполнением
команд прерывания (программный тип прерывания) или вызванные внешними сигналами (аппаратные прерывания).
Исключениями (exception) называют нештатные ситуации (ошибки), возникающие в
процессе работы процессора. При выявлении таких ошибок блоки процессора, контролирую9
щие правильную работу процессора, вырабатывают сигналы (запросы), по которым осуществляются прерывания и вызываются соответствующие подпрограммы обслуживания.
Программные прерывания осуществляются по командам прерывания INTО, INT3, INT
N, BOUND. Команда BOUND (в i8086 отсутствует) проверяет, находится ли адресуемый элемент (операнд, команда) в пределах сегмента. Если выходит за границы сегмента, то вызывается прерывание N=5 – «превышение границы» сегмента.
Запросы на выполнение аппаратных прерываний в однопроцессорных компьютерах поступают от внешних устройств на входы INTR, NMI процессора (как и в реальном режиме, рисунки 5, 6).
Исключения делятся на ошибки (faults), ловушки (traps) и отказы (aborts). Ошибки выявляются и обслуживаются (если возникли) до выполнения команды, которая является причиной их возникновения. Пример – обращение к сегменту или странице, которые отсутствуют в
основной памяти (бит присутствия P=0). В качестве адреса возврата сохраняется адрес
i=(CS:ЕIP) команды, которая вызвала данное исключение. Ловушка выявляется после исполнения команды. Пример: команда INTО (N=4) реализуется, если установлен флаг переполнения
OF=1. В качестве адреса возврата сохраняется адрес следующей команды i+1.
Ошибки
и
ловушки предусматривают продолжение прерванной программы (после обслуживания прерывания). Отказы информируют о возникновении серьёзных нарушений в работе системы. Примеры: отказ аппаратуры или появление исключения при обслуживании ранее поступившего запроса. Отказ не предусматривает продолжения прерванной программы, поэтому после него
обычно производится повторный запуск (рестарт) процессора.
Организация внешних прерываний в мультипроцессорных системах. При построении многопроцессорных систем на основе процессоров Intel используется наиболее простая организация – симметричная. Объединение процессоров в систему осуществляется на основе общей локальной шины. Каждый процессор выполняет свою задачу, назначаемую ОС. При этом
процессоры совместно используют общие ресурсы системы – память, внешние устройства, обращение к которым реализуется ОС. В каждый момент времени только один из процессоров
является ведущим (master) и имеет доступ к системной шине. Другие процессоры для обращения к шине выдают соответствующий запрос в арбитр шины. Поддержку работы мультипроцессорных систем обеспечивают современные ОС – Windows NT, Novell Netware и другие.
Обработка внешних прерываний в мультипроцессорных системах с помощью ПКП (PIC)
типа i8259А невозможна, поэтому был разработан контроллер APIC с расширенными возможностями – Advanced PIC. В симметричной мультипроцессорной системе передача сигналов
прерываний происходит по схеме, представленной на рисунке 8.
ЦП1
IRQi (ISA)
INTj (PCI)
Системный контроллер
APIC
ЛокальLINT0,1 ный
APIC
ЦП2
Шина
APIC
ЛокальLINT0,1 ный
APIC
Рисунок 8
В этой схеме используется несколько контроллеров APIC. Внешние прерывания под10
ключаются на входы системного контроллера APIC, который реализован в виде отдельной микросхемы и размещен на системной плате компьютера. Каждый из процессоров содержит локальный APIC, имеющий два входа прерываний LINT0, LINT1, на которые подаются локальные
запросы прерываний, обслуживаемые только данным процессором. В однопроцессорной системе локальные APIC отключаются и входы LINT0, LINT1 используются как входы NMI, INTR.
Общие запросы прерываний поступают на системный APIC, который их анализирует и ретранслирует через внутреннюю шину APIC соответствующему (свободному) процессору на обслуживание. С точки зрения внешних устройств система выглядит как один процессор, обслуживающий запросы прерываний.
В процессорах семейства Р6 номера прерываний распределены следующим образом.
Первые 32 номера закреплены за исключениями процессора (таблица 2), а номера 32-255 – за
прерываниями пользователя.
Таблица 2
Номер N и мнеПричина прерывания
Тип исключения Код ошибки
моника
0 #DE
Ошибка деления
Ошибка
Нет
1 #DB
Отладка
Ошибка/Ловушка Нет
2
Сигнал NMI
Прерывание
Нет
3 #BP
Команда INT3
Ловушка
Нет
4 #OF
Команда INTO
Ловушка
Нет
5 #BR
Команда BOUND
Ошибка
Нет
6 #UD
Недействительный код операции
Ошибка
Нет
7 #NM
FPU недоступен
Ошибка
Нет
8 #DF
Двойная ошибка
Отказ
Да (ноль)
9
Резерв
Нет
10 #TS
Недействительный сегмент TSS
Ошибка
Да
11 #NP
Отсутствие сегмента
Ошибка
Да
12 #SS
Ошибка при обращении к стеку
Ошибка
Да
13 #GP
Нарушение общей защиты
Ошибка
Да
14 #PF
Страничное нарушение
Ошибка
Да
15
Резерв
Нет
16 #MF
Исключение FPU
Ошибка
Нет
17 #AC
Ошибка выравнивания
Ошибка
Да (ноль)
18 #MC
Машинный контроль
Отказ
Нет
19 #XM
Исключение SSE
Ошибка
Нет
20-31
Резерв
Если одновременно произошло несколько запросов прерываний, то процессор обслуживает их последовательно в соответствии с приоритетами, указанными в таблице 3 (1 – высший
приоритет, 8 – низший).
Обработка прерываний в защищённом режиме. Роль вектора прерывания в защищенном режиме выполняет (специальный) дескриптор прерываний – шлюз, а роль таблицы ВП дескрипторная таблица прерываний IDT (Interrupt Descriptor Table). Подпрограмма обслуживания прерывания вызывается через IDT, которая может размещаться в любом месте ОП (рисунок
9). Базовый линейный адрес таблицы IDT размещается в специальном регистре IDTR, формат
которого имеет вид:
47
БА IDT
16 15
Lim
0
Поле БА IDT определяет базовый адрес таблицы IDT. Поле Lim определяет границу
(размер) таблицы IDT. Загрузка линейного адреса в регистр IDTR осуществляется с помощью
команды LIDT (загрузить IDTR), а его сохранение в памяти – с помощью команды SIDT. Команда LIDT является привилегированной (CPL=0), команда SIDT может выполняться на любом
уровне привилегий. Дескриптор прерываний (ДП) с номером N из таблицы IDT выбирается по
11
физическому адресу, сформированному путем сложения БА IDT (из регистра IDTR) и адреса
ДП, равного 8N (8 – длина ДП). Селектор и смещение (из дескриптора N, выбранного из таблицы IDT) загружаются в регистры CS, EIP и вызывают обработчик N.
Таблица 3 – Приоритеты прерываний защищенного режима
Приоритет
Причины прерываний
1
Аппаратный сброс (RESET) и машинный контроль # MС
2
Ловушка при переключении задач – бит Т=1 (в сегменте TSS)
3
Внешние сигналы процессора:
- очистка кэш-памяти FLUSH # = 0,
- включение энергосберегающего режима STOPCLK # = 0,
- вход в системный режим SMI # =0,
- инициализация процессора INIT = 1
4
Ловушки:
- останов в контрольной точке (INT3),
- исключение отладки (ТF=1 в регистре флагов),
- точка останова при выборке данных или вводе/выводе
5
Внешние сигналы прерываний:
- NMI = 1,
- INTR = 1
6
Ошибки при выборке следующей команды:
- точка останова при выборке команды,
- превышение границы сегмента,
- ошибка обращения к странице при выборке команды
7
Ошибки при декодировании команды:
- длина команды больше 15 байт,
- недействительный код операции #UD,
- процессор с плавающей запятой недоступен (FPU недоступен)
8
Ошибки при выполнении команды:
- исключение FPU, переполнение, выход за границы,
недействительный
TSS, отсутствие сегмента, ошибка обращения к стеку, нарушение общей защиты, ошибка обращения к странице, ошибка выравнивания
Регистр IDTR
Limit
ОП
0)
БА IDT
БА IDT
Адрес шлюза
Адрес ДП=8N
+
Таблица IDT
Дескриптор 0
...
Дескриптор N
Селектор в CS
Смещение в EIP
Обработчик N
Рисунок 9
12
Элементами таблицы IDT являются системные дескрипторы прерываний трёх типов:
вентиль (Gate) прерываний (шлюз прерываний), шлюз ловушки, шлюз задачи.
Тип шлюза указывается в поле TYPE в байте управления доступом БУД дескриптора:
7 6
5 4
3
0
P DPL
S=0
TYPE
TYPE=D110 – шлюз прерываний, TYPE=D111 – шлюз ловушки, TYPE=D101 – шлюз задачи. Бит D задаёт режим работы процессора при обслуживании прерываний:
- если бит D=0, то процессор работает как 16-разрядный процессор 80286,
- если бит D=1, то процессор работает как 32-разрядный процессор (386+).
Формат системного дескриптора типа шлюз:
31
Селектор
16 15
Смещение
0
63
Смещение
48 47 БУД
40 000
WС 32
В поле селектора размещается селектор сегмента, в котором размещён обработчик прерывания и его смещение (пусковой адрес) относительно начала сегмента. Селектор загружается
в CS, смещение – в регистр EIP.
Формат шлюза задачи:
31 Селектор TSS
16 15
0
БУД
В нём используются только поле селектора, в котором размещается селектор сегмента
состояния задачи (TSS) и байт БУД. Прерывание через шлюз задачи равносильно процедуре
переключения задач.
По запросу прерывания процессор сохраняет в стеке соответствующего уровня:
1) базовый адрес сегмента стека (SS → стек),
2) указатель стека (ESP → стек),
3) содержимое регистра флагов (EFLAGS → стек),
4) содержимое CS,
5) содержимое EIP,
6) код ошибки (если он формируется).
Стек
←ESP (до)
SS
ESP
EFlags
CS
EIP
Код ошибки
←ESP (после)
Содержимое регистров SS, ESP (см. пункты 1,2) заталкивается в стек только в случае изменения уровня привилегий процессора (CPL изменяется, если вызывается обработчик с другим уровнем привилегий). После этого в регистре флагов сбрасываются биты TF, VM, NT. Если
вызов подпрограммы осуществляется через шлюз прерывания, то бит маски IF=0 (сбрасывается). Если вызов осуществляется через шлюз ловушки (т.е. причина - внутри процессора), то
маска внешних прерываний IF остаётся без изменений.
Возврат из подпрограммы осуществляется по команде IRET. При выталкивании из стека
старого значения регистра флагов учитываются условия:
 поле IOPL восстанавливается только при условии CPL=0,
 флаг маски IF изменяется только при условии CPL≤IOPL.
Код ошибки содержит индекс селектора, указывающий на дескриптор, использование
которого вызвало исключение.
13
Формат регистра флагов Eflags:
31 30 29 28 27 26 25 24 23 22 21 20
19
18 17
16 15 14 13 12
0 0 0 0 0 0 0 0 0 0 ID VIP VIF AC VM R 0 NT IOPL
Младшие 12 разрядов имеют такой же смысл, как и в процессоре i8086. В процессоре
i286 новые флаги (12, 13 и 14 биты) имеют следующее значение:
IOPL – уровень привилегий ввода-вывода (2 бита);
NT (Nested Task) – флаг вложенной задачи.
В 32-разрядных процессорах (i386+) к регистру флагов добавили старшее слово (два
байта), содержащее новые флаги:
R – флаг маскирования (R=1) ошибок отладки;
VM (Virtual 8086 Mode) – флаг VM=1 задает режим V8086;
AC (Alignment) - флаг контроля выравнивания (по границе 2, 4, 8 байт);
VIF (Virtual Inerrupt Flag) – маска виртуального прерывания;
VIP (Virtual Inerrupt Pending) – виртуальный запрос прерывания;
ID - флаг допустимости идентификации (по команде CPUID).
Виртуальные прерывания. При обслуживании аппаратных и программных прерываний в защищённом режиме возникает ряд проблем. Обычно обслуживание внешних прерываний является функцией ОС, поэтому внешние (маскируемые) прерывания воспринимаются ОС.
Она определяет, какая программа выполняется в данный момент. Если это программа пользователя, то осуществляется её прерывание и обслуживание поступившего запроса. Однако программы пользователей должны иметь возможность защитить себя от прерывания, так как прекращение или задержка некоторых выполняемых ими действий (процедур) может привести к
нежелательным последствиям. В реальном режиме для этих целей используется маска прерываний IF (IF=0 или IF=1). Однако в защищённом режиме команды управления флагом IF (CLI,
STI) выполняются только при условии, что программа имеет уровень привилегий CPL≤IOPL
(т.е. такой же или выше IOPL). Если в регистре флагов IOPL<3, то управлять флагом IF (установку, сброс) могут только программы ОС с уровнем привилегий CPL, равным 0,1 или 2.
Обслуживание виртуальных прерываний от внешних источников (при условии IF=1)
осуществляется обработчиком прерываний, который проверяет маску виртуального прерывания
VIF (в регистре флагов). Если VIF=1 (т.е прервана программа пользователя с уровнем привилегий CPL=3, для которой разрешены внешние прерывания), то обработчик выполняет обслуживание прерывания и возвращает управление прерванной программе.
Если флаг VIF=0 (прервана программа пользователя с уровнем привилегий CPL=3, для
которой внешние прерывания запрещены), то обработчик прерываний в регистре флагов, хранимом в стеке, устанавливает бит VIP=1 (принят запрос на обслуживание внешнего прерывания, однако его обслуживание отложено) и возвращает управление прерванной программе
(фактически без обслуживания запроса на прерывание).
Его дообслуживание осуществляются следующим образом. Когда программа пользователя (прерывание которой фактически отложено) разрешит своё прерывание (установкой VIF=1
по команде STI), то действия системы прерываний в этом случае зависят от бита VIP регистра
флагов. Если VIP=1 (есть отложенные прерывания), то процессор реализует исключение «#GP –
нарушение общей защиты» (вызывает обработчик с N=13). Этот обработчик и должен выполнить обработку отложенного прерывания, т.е. вызвать соответствующий обработчик. Перед
возвратом из него в стеке, где хранится старое содержимое регистра флагов, подпрограмма
должна установить VIF=1 и сбросить VIP=0.
Если VIP=0 (нет отложенных прерываний), процессор устанавливает VIF=1 (разрешает
виртуальные прерывания).
2.3 Прерывания в режиме виртуального процессора 8086
Процессор, работающий в режиме V8086 (флаг VM=1), может обслуживать прерывания:
а) с использованием таблицы IDT (как в защищённом режиме), б) с использованием таблицы
14
векторов прерываний (как в реальном режиме), в) виртуальные прерывания с использованием
флагов VIF, VIP. Обслуживание прерываний зависит ещё от типа прерывания (программные
или внешние маскируемые) и уровня привилегий ввода-вывода IOPL. В результате возможны 6
вариантов (таблица 4) обработки прерываний, в зависимости от значений бита VME в регистре
управления CR4 (нулевой бит), поля IOPL в регистре флагов и содержимого бита bi битовой кары направления прерываний (БКНП), которая располагается в сегменте задачи TSS. Исключения обрабатываются только с помощью таблицы IDT как в защищённом режиме.
Таблица 4 – Варианты обработки прерываний V8086
Номер
VME IOPL
Бит bi
Программные
Аппаратные маскируемые
варианта
в БНКП
прерывания
прерывания
1
0
3
x
с использован. IDT
с использованием IDT
2
0
<3
x
вызывает исключ. #GP
с использованием IDT
3
1
3
1
вызывает исключ. #GP вирт.прер.с исп.VIF, VIP
4
1
<3
1
с использован. IDT
с использованием IDT
5
1
3
0
с использов. табл. ВП
с использованием IDT
6
1
<3
0
с использов. табл. ВП
вирт.прер.с исп.VIF, VIP
Если VME=1 (виртуальные прерывания разрешены), то для обработки программных
прерываний (по команде INT N) используется БКНП, а при обработке внешних прерываний используется таблица IDT (при условии IOPL=3) или виртуальный механизм прерываний по флагам VIF, VIP (если IOPL<3).
Если VME=0 (виртуальные прерывания запрещены), то для обработки программных
прерываний используется таблица IDT (если IOPL=3), либо вызывается исключение #GP
(N=13), а при обработке внешних прерываний используется таблица IDT.
Битовая карта БКНП (Interrupt Redirection Bit Map) длиной 32 байта (256 бит) размещена
в TSS непосредственно перед битовой картой ввода-вывода (БКВВ). Каждый бит bi этой карты
определяет, будет ли программное прерывание (по команде INT N=n) обрабатываться в защищенном режиме (через IDT) или в реальном режиме (через таблицу векторов прерываний).
Обработка прерываний в режимеV8086 с использованием IDT. Вызов подпрограммы
осуществляется либо через 1) шлюз ловушки, либо через 2) шлюз задачи.
В первом случае шлюз ловушки должен ссылаться на неподчинённый (в дескрипторе
бит С=0) сегмент с уровнем привилегий DPL=0. Если шлюз ловушки ссылается на подчинённый сегмент (С=1) или сегмент с DPL>0, то реализуется исключение #GP. В качестве кода
ошибки в этом случае указывается селектор сегмента, на который ссылается шлюз.
Операция прерывания:
 процессор переключается в защищённый режим с уровнем CPL=0;
 в стеке (с уровнем привилегий = 0) сохраняется содержимое регистров GS, FS, DS, ES,
SS, ESP, FLAGS, CS, EIP (9 регистров) и, если необходимо, код ошибки;
 сбрасываются регистры GS, FS, DS, ES (сегментов данных);
 в регистре флагов сбрасывается бит VM=0;
 управление подпрограмме передаётся через IDT (по номеру N).
Возврат из подпрограммы (по команде IRET) осуществляется только с уровнем привилегий CPL=0, иначе команда IRET не сможет изменить бит VM в регистре флагов (вернуть режим
V8086).
Прерывание через шлюз задачи. В этом случае процессор выполняет обычную процедуру переключения задач:
 содержимое регистра флагов (с битом VM=1) сохраняется в сегменте TSS текущей задачи;
 в поле обратной связи сегмента стека (уровня привилегий программы обработчика прерывания) загружается селектор сегмента TSS прерванной задачи;
 в регистр флагов загружается новое значение (в котором бит VM=0) из сегмента TSS
программы-обработчика;
15


в регистре флагов устанавливается бит NT=1 (признак вложенной задачи);
начинается выполнение подпрограммы (через шлюз задачи).
По команде IRET – обратное переключение задач. При выполнении команды IRET обработчик должен иметь CPL=0, иначе команда IRET не сможет изменить бит VM.
Обработка прерываний через таблицу векторов прерываний. В этом случае обработка прерывания осуществляется без выхода из режима V8086 (бит VM=1). Вызов подпрограммы осуществляется через таблицу векторов прерываний (как в реальном режиме). Действия процессора зависят от IOPL.
1) Если IOPL=3:
 в стеке сохраняется содержимое регистра флагов, в котором сбрасываются NT=0,
IOPL=0;
 в стеке сохраняется содержимое регистров CS, IP;
 в регистре флагов сбрасываются биты IF=0, TF=0;
 по номеру N из таблицы векторов прерываний загружаются новые значения в CS и IP
(а старшее слово EIP сбрасывается);
 начинается исполнение подпрограммы обработки прерывания.
2) Если IOPL<3:
 в стеке сохраняется содержимое регистра флагов, в котором IOPL=3, IF:=VIF;
 сохраняется CS, IP;
 сбрасываются флаги VIF=0, IF=0 в регистре флагов;
 по номеру N из таблицы векторов прерываний в CS, IP загружается адрес подпрограммы (а старшее слово EIP сбрасывается);
 начинается выполнение подпрограммы.
Возврат из подпрограммы – по команде IRET. При этом поле IOPL не восстанавливается, так как CPL≠0.
Обработка виртуальных прерываний (в V8086) с использованием VIF, VIP. Если
процессор в режиме V8086 обрабатывает маскируемое внешнее прерывание в виртуальном режиме с помощью VIF, VIP, то команды CLI, STI изменяют флаг VIF (а не флаг IF). Если программа попытается изменить флаг IF по командам PUSHF, POPF, то процессор, исполняя эти
команды, будет менять флаг VIF, не изменяя IF.
Выполнение команды STI (которая должна разрешить внешние прерывания) зависит от
бита VIP. Если VIP=0 (нет отложенных прерываний), команда устанавливает VIF=1. Если
VIP=1 (есть отложенные прерывания), то процессор реализует исключение #GP. Вызываемая по
номеру N=13 подпрограмма должна обеспечить дообслуживание отложенного прерывания. Перед возвратом из подпрограммы она должна установить VIF=1 и сбросить VIP=0 в содержимом
регистра флагов, которое хранится в стеке.
Обработка внешнего прерывания (если IF=1) осуществляется через таблицу IDT в следующей последовательности:
 процессор переключается в защищённый режим с уровнем CPL=0;
 в стеке (с уровнем привилегий равным нулю) сохраняется содержимое регистров CS,
FS, DS, ES, SS, ESP, EFLAGS, CS, EIP. В копии регистра флагов, хранимой в стеке,
устанавливается значения IOPL=3, IF присваивается значение VIF;
 сегментные регистры GS, FS, DS, ES сбрасываются;
 в регистре флагов сбрасывается бит VM=0;
 через таблицу IDT в CS, EIP загружается селектор и смещение обработчика и начинается его выполнение.
Этот обработчик должен проверить значение VIF в регистре флагов. Если VIF=1, то обработать прерывание. Если VIF=0, то установить VIP=1 в копии регистра флагов, хранящейся в
стеке, и вернуть управление прерванной программе.
16
ЗАДАНИЕ И ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Реальный режим. Для исследования системы прерываний написать и установить пользовательский обработчик прерываний с заданными номером N вектора прерываний и смещения
для стека. Номер N может быть любым, в том числе он может соответствовать и системному
обработчику. Вызов обработчика прерывания выполнить по команде «int N» из основной программы, представляющей собой цикл с заданным количеством повторений. Счетчик циклов
модифицировать в обработчике. Основную программу и обработчик разместить в разных сегментах памяти. Выполнить программу в шаговом режиме, фиксируя результаты выполнения
очередной команды в строке таблицы 5 («снять» трассу программы).
Основная программа должна обеспечить выполнение следующих действий:
- сохранение «старого» вектора прерываний в стеке. Это необходимо сделать для того,
чтобы перед завершением основной программы можно было восстановить старый обработчик и
тем самым восстановить нормальную работу компьютерной системы;
- установить пользовательский («новый») обработчик. Для этого на место старого вектора прерываний следует записать новый вектор;
- организовать цикл с заданным количеством повторений с командой «int N» внутри этого цикла;
- восстановить старый обработчик прерываний и завершить программу (вернуть управление ОС).
Сохранение старого вектора прерываний, запись нового и восстановление старого вектора в таблице векторов прерываний можно выполнить разными способами:
- с помощью стандартных функций с номерами 25h и 35h системного обработчика с
N=21h. Функция 35h читает из таблицы векторов прерываний вектор прерывания с заданным
номером N и записывает его в регистр ES (базовый адрес сегмента) и в регистр ВХ (смещение).
После этого из этих регистров он записывается в стек с целью сохранения. Функция 25h записывает в таблицу векторов прерываний базовый адрес сегмента из регистра DS и смещение из
регистра DX. Поэтому перед вызовом обработчика с N=21h в эти регистры следует загрузить
новый вектор прерывания;
- с помощью непосредственного обращения к таблице векторов прерываний (к ячейкам
памяти с адресами 4N, 4N+2). Следует отметить, что в этом случае на время манипуляций с
ячейками таблицы векторов прерываний внешние прерывания следует запретить.
В качестве примера ниже приведена программа 1, в которой для сохранения старого вектора с номером N=0Bh и записи нового используется второй способ – чтение вектора из таблицы (из ячеек памяти с адресами 4N, 4N+2), запись его в стек, а затем запись вектора нового прерывания на место старого. В программе 2 для этих же целей используется первый способ функции с номерами 25h и 35h системного обработчика с номером N=21h.
Программа 1:
.model large
; программы в разных сегментах
.stack 200h
; смещение (размер) стека
assume cs:main ; указание: сегмент main является сегментом кода
segment interruption page 'CODE'
intproc:
dec cx
iret
interruption ends
segment main page 'CODE'
start:
mov ax,0000h ;обнуление адреса сегмента данных, в котором размещена таблица ВП
mov ds,ax
cli
;запрет (маскирование) прерываний
;сохранение в стеке старого вектора прерывания
17
mov bx,000Bh
shl bx,2
mov ax,[bx]
; смещение
mov cx,[bx+2] ; базовый адрес сегмента
push bx
; bx - адрес вектора прерывания (старого)
push cx
push ax
; запись вектора нового прерывания на место старого
mov ax,offset intproc
mov cx,seg intproc
mov [bx],ax
mov [bx+2],cx
sti
; разрешение прерываний
; основной цикл
mov cx,2
m1: int 0Bh
cmp cx,0
JnZ m1
Cli
; запрет прерываний
; восстановление вектора старого прерывания
pop ax
pop cx
pop bx
mov [bx],ax
mov [bx+2],cx
sti
; разрешение прерываний
mov ax,4c00h
; выход из программы (возврат управления в ОС)
int 21h
main ends
end start
Программа 2:
.model large ; позволяет размещать программы в разных сегментах
.stack 200h
assume cs:main ;указание: сегмент main является сегментом кода
segment interruption page 'CODE'
intproc:
dec cx
iret
interruption ends
segment main page 'CODE'
start:
mov ax,seg main ;сохранение в стеке вектора прерывания
mov ds,ax
mov ax,350Bh
int 21h
push es ; адрес сегмента
push bx ; смещение
; установка нового прерывания
mov ax,seg intproc
mov ds,ax
mov dx,offset intproc
mov ax,250Bh
18
int 21h
mov ax,0h ; обнуление адреса сегмента данных для просмотра таблицы ВП
mov ds,ax
mov cx,2
; цикл основной программы
m1: int 0Bh
cmp cx,0
JnZ m1
;восстановление вектора старого прерывания
mov ax,250Bh
pop ds
pop dx
int 21h
mov ax,4c00h ; возврат управления в ОС
int 21h
main ends
end start
Порядок выполнения программы (в оболочке Far). В выбранный для исполнения вариант
программы внести заданные значения N и размер стека. Текст программы сохранить в файле с
расширением «.asm», т. е. в виде <имя программы. asm >. Выполнить трансляцию программы (в
два этапа):
- tasm.exe имя.asm. Результатом этапа является файл «имя.obj»,
- tlink.exe имя.obj. Результатом этапа компоновки является файл «имя.exe» (машинный
код программы).
Для снятия трассы программы использовать программу-отладчик (td.exe - турбоотладчик). Вход в турбо-отладчик осуществляется командой: td < имя программы.exe >. Отладчик позволяет выполнять программу (или ее часть) в шаговом режиме. Если в шаговом режиме
требуется выполнить только часть программы, то в программе указывается точка останова, достигнув которой, процессор останавливается, и каждая очередная команда программы будет
выполняться только после нажатия любой клавиши: F7 - trace, F8 – step, или автоматически –
клавиша F9 - run. Точка останова в программе выделяется красным цветом.
Основные функции турбо-отладчика:
F1 - помощь;
F2 - установка (снятие) точки останова;
F7 (F8) - исполнить очередную команду программы;
F9 - исполнить программу до точки останова (если её нет, то исполнится вся программа);
F10 - главное меню;
Alt-X - выход из турбо-отладчика.
Точек останова в программе может быть сколько угодно. Снятие точки останова достигается ее повторной "установкой" на том же самом месте. Для просмотра содержимого регистров, стека и др. нужно выбрать в главном меню пункт View, далее выбрать пункт CPU. При
этом справа можно увидеть содержимое регистров и флагов, внизу справа - содержимое стека,
внизу слева - содержимое сегмента данных. Только что записанные в стек данные помечены
символом "►".
Следует отметить, что переход на подпрограмму по прерыванию отменяет шаговый режим. Поэтому для снятия трассы подпрограммы необходимо сначала установить точку останова на нужной команде подпрограммы, начиная с которой возобновится шаговый режим.
19
Таблица 5 – Трасса выполнения программы 2
Адрес коРезультаты выполнения команд
манды
Команда
Состояние процессора
Таблица ВП
БА
D
Ассембл
IP ZF IF
AX BX CX ES CS DS DX SP
4N
4N+2
(SP) +2
Ячейки стека
+4
+6
+8
IF*
Download