Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ПРИБОРОСТРОЕНИЯ ИНФОРМАТИКИ
Кафедра ТИ-1 «ТЕХНОЛОГИЧЕСКАЯ ИНФОРМАТИКА И ТЕХНОЛОГИЯ МАШИНОСТРОЕНИЯ»
УТВЕРЖДАЮ
Заведующий кафедрой ТИ-1
_________ (_____________)
«___»_________20__г.
Для студентов 3 курса факультета ТИ
Специальности 220301
К.т.н., доцент Холопов В.А.
(ученая степень, ученое звание, фамилия и инициалы автора)
ЛЕКЦИЯ № 7
по дисциплине 3421 «Вычислительные машины, системы и сети»
Раздел №2 Микропроцессоры с однозадачным режимом работы
(часть 3)
Обсуждена на заседании кафедры
(предметно-методической секции)
«__»___________20__г.
Протокол № __
МГУПИ 20__г.
Тема лекции: Микропроцессоры с однозадачным режимом работы (часть 3)
Время: 2 академических часа (90 мин.).
Литература (основная и дополнительная):
Новиков Ю.В. Основы микропроцессорной техники. Учебное пособие. М.: Интуит.ру, 2006 г. 357 с.
Корнеев В.В. Киселев А.В. Современные микропроцессоры. 3-е изд. И доп. СПб.: БХВ-Петербург, 2003. 448 с.: ил.
Гук М., Юров В. Процессоры Pentium 4, Athlon и Durun. СПб,: Питер Бук, 2002 512 с.: ил.
Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение СПб,: Питер, 2003. 736 с.: ил.
ПЛАН ЛЕКЦИИ:
Введение до 5 мин.
Основная часть (учебные вопросы) до 80 мин.
Заключение до 5 мин.
ТЕКСТ ЛЕКЦИИ
Введение до 5 мин.
Настоящая глава содержит подробное описание принципов работы 16-разрядных микропроцессоров 8086 и 8088 фирмы Intel и их советских аналогов К1810ВМ86 и К1810ВМ88. Микропроцессоры описываются с точки зрения программиста, но не электронщика, т. е. приводится описание регистров, системы команд и т. п., но отсутствуют сведения об организации обмена по внешним шинам, о количестве и расположении выводов микросхем и др.
Основная часть до 80 мин.
В зависимости от назначения все инструкции можно разделить на несколько групп:
инструкции пересылки;
арифметико-логические инструкции;
инструкции сдвигов;
инструкции обработки строк;
инструкции переходов;
инструкции управления и вспомогательные;
префиксы инструкций.
Первые три категории команд (пересылки, арифметико-логические и сдвигов) можно назвать инструкциями обработки данных. Инструкции обработки строк стоят несколько особняком, поскольку они отличаются от команд обработки данных способом определения местоположения своих операндов. Инструкции переходов осуществляют передачу управления в процессе выполнения программы. Инструкции управления и вспомогательные в обычных программах применяются редко, их основное назначение управление состоянием процессора. Префиксы инструкций самостоятельного значения не имеют и применяются в составе других команд, модифицируя их выполнение.
Выполнение каждой инструкции складывается из следующих шагов:
выборки из памяти и дешифровки кода команды;
определения местоположения операндов, если они явно задаются кодом команды (некоторые инструкции не имеют операндов вообще, в некоторых других местоположение операндов подразумевается);
вычисления эффективного адреса операнда в памяти, если таковой имеется;
собственно выполнения инструкции.
Большая часть инструкций имеет один или два явно заданных операнда. Операнды некоторых инструкций являются неявными, т.е. прямо в команде не указываются. Наконец, существуют инструкции, вообще не имеющие операндов.
Явно заданные операнды делятся на следующие группы:
регистровые операнды;
операнды в памяти;
непосредственные операнды;
адреса переходов.
Инструкции обработки строк, управления и вспомогательные либо имеют неявные операнды, либо вообще не имеют операндов. Большая часть команд других категорий использует явно заданные операнды.
Эффективное использование системы команд микропроцессора 8086 затрудняется “неортогональностью” применяемых способов адресации. Например, некоторые инструкции не допускают использования операндов в памяти или накладывают на их применение те или иные ограничения; в других невозможно использование непосредственных операндов; третьи используют в качестве операнда только один определённый регистр и не допускают применения других и т.д. В этом отношении разработки фирмы Intel существенно проигрывают появившимся за десятилетие до них мини-ЭВМ PDP-11 фирмы DEC, система команд которых намного удобнее и, несмотря на меньший набор команд, позволяет создавать значительно более эффективные программы.
Регистровые операнды
В командах обработки данных регистры общего назначения могут использоваться для хранения значений операндов. В этом случае говорят о регистровой адресации. Например, команда MOV AX,BX пересылает содержимое регистра BX в регистр AX.
Сегментные регистры могут использоваться в качестве операндов только в некоторых командах пересылки, а именно в инструкциях MOV, PUSH и POP. Сегментный регистр CS может служит источником в инструкции MOV, но не может служить приёмником. Он не может также использоваться в команде POP.
Регистр флагов и указатель инструкции не могут использоваться в качестве явно задаваемых операндов.
Операнды в памяти
Как уже отмечалось в подразделе “”, адрес памяти складывается из селектора сегмента и смещения. Смещение операнда в соответствующем сегменте называется эффективным адресом и вычисляется в процессе выполнения инструкции.
Для определения физического адреса явно заданного операнда, располагающегося в памяти, почти во всех случаях используется селектор сегмента, содержащийся в регистре сегмента данных DS. Исключением является лишь случай обращения к операнду, при вычислении эффективного адреса (смещения) которого используется содержимое регистра BP. В этом случае предполагается, что операнд располагается в сегменте стека, и используется селектор сегмента, хранящийся в регистре SS. В любом случае возможно использование префикса замены сегмента, явным образом определяющего, какой сегментный регистр содержит селектор, который должен использоваться при формировании физического адреса. На языке ассемблера префикс замены сегмента указывается с помощью мнемоники соответствующего сегментного регистра, предшествующей эффективному адресу операнда и отделяемой от него двоеточием. Например, в первой из следующих инструкций обращение осуществляется к сегменту данных, поскольку префикс замены сегмента не используется, а регистр BP в формировании эффективного адреса не участвует; во второй инструкции операнд находится в сегменте кода, поскольку сегмент задан явно. Эффективный адрес в обоих случаях является суммой содержимого регистра BX и константы 10h (называемой отклонением):
MOV 10h [BX], AX
MOV CS:10h [BX], AX
Эффективный адрес формируется суммированием содержимого одного или двух регистров общего назначения и 8- или 16-разрядного отклонения (константы, задаваемой кодом команды). Эффективный адрес всегда имеет размер 16 бит; перенос из старшего разряда, если он возникает, игнорируется.
Первым из регистров, участвующих в формировании эффективного адреса, может быть регистр BX или BP, вторым SI или DI. Другие регистры общего назначения в формировании эффективного адреса применяться не могут.
С любым из регистров или их комбинаций может использоваться 8- или 16-разрядное отклонение; отклонение может также отсутствовать. Исключением является случай использования регистра BP без регистра SI или DI: в такой ситуации всегда должно применяться 8- или 16-разрядное отклонение. Кроме того, эффективный адрес может быть задан 16-разрядным отклонением без использования каких-либо регистров.
На языке ассемблера регистр, участвующий в формировании эффективного адреса, заключается в квадратные скобки. Если применяются два регистра, то либо каждый из них заключается в свои собственные скобки, либо они находятся внутри одних скобок и соединяются там знаком “+”. Например, запись [BX] [SI] эквивалентна записи [BX+SI] и означает, что эффективный адрес является суммой содержимого регистров BX и SI.
Если эффективный адрес состоит из одного отклонения и это отклонение задаётся в числовом виде, а не как метка, перед ним обязательно должно стоять указание WORD PTR или BYTE PTR в зависимости от того, имеет ли этот операнд размер слово или байт. Это требование связано с тем, что числовая величина будет воспринята транслятором языка ассемблера не как отклонение, а как непосредственный операнд (см. следующий подраздел). Таким образом, для занесения содержимого регистра BH в ячейку памяти со смещением 100h в сегменте данных необходимо использовать следующую инструкцию:
MOV BYTE PTR 100h, BH
Если адресуемая ячейка памяти находится не в сегменте данных, указание BYTE PTR или WORD PTR не требуется, поскольку перед отклонением будет указан префикс замены сегмента, например:
MOV ES:100h, BH
В инструкции только один из операндов может располагаться в памяти. Вторым операндом обязательно должен быть либо регистровый, либо непосредственный операнд.
Способ формирования эффективного адреса определяется байтом ModRegR/M кода команды. Формат этого байта и назначение его полей будет описано ниже, в подразделе “”. Здесь отметим, что двухразрядное поле MOD определяет наличие и размер отклонения, а трёхразрядное поле R/M используемую комбинацию регистров. Поле Reg в формировании эффективного адреса не участвует.
Непосредственные операнды
Непосредственный операнд это константа, задаваемая кодом команды. Он может иметь длину 1 или 2 байта в зависимости от разрядности выполняемой операции. Естественно, непосредственный операнд может быть только источником, но не приёмником результата.
Если приёмником в инструкции, использующей непосредственный операнд, является ячейка памяти, а не регистр общего назначения, может потребоваться использование указания BYTE PTR или WORD PTR. Оно применяется в том случае, когда транслятор с языка ассемблера не может самостоятельно правильно определить разрядность операции. Например, в следующем примере первая команда обнулит байт памяти по смещению 1000h, а вторая слово по тому же адресу (т.е. байты со смещениями 1000h и 1001h):
MOV BYTE PTR 1000h, 0
MOV WORD PTR 1000h, 0
Адреса переходов
Различают переходы ближние (near, внутрисегментные) и дальние (far, межсегментные). Ближний переход осуществляется всегда в пределах текущего сегмента кода, т.е. содержимое регистра CS не изменяется. Дальний переход осуществляется в другой сегмент, т.е. при его выполняется изменяется содержимое не только указателя инструкции IP, но и регистра сегмента кода CS.
Инструкции безусловного перехода JMP и перехода к подпрограмме CALL позволяют выполнять как ближние, так и дальние переходы. При ближних переходах используется относительная или косвенная адресация, при дальних прямая или косвенная. Инструкции условных переходов и циклов осуществляют только ближние переходы, используя относительную адресацию.
При относительной адресации код команды содержит в своём составе 8- или 16-разрядное отклонение.
Если переход происходит (т.е. если использована инструкция CALL или JMP либо если в инструкции условного перехода или цикла условие перехода соблюдается), отклонение складывается с адресом команды, расположенной сразу за данной инструкцией перехода, и полученная сумма заносится в регистр указателя инструкции IP. Значение селектора сегмента кода, находящееся в регистре CS, не изменяется. Таким образом, происходит переход относительно адреса команды, расположенной за инструкцией перехода, откуда данный вид адресации и получил своё название.
Команда JMP позволяет использовать 8- и 16-разрядные отклонения, что позволяет осуществлять переход либо в пределах от 128 до +127, либо от 65536 до 65535 байтов относительно следующей инструкции в пределах одного и того же сегмента. Первые переходы носят название коротких, вторые длинных. Команда CALL использует только 16-разрядные отклонения. Инструкции условных переходов и циклов используют 8-разрядные отклонения. Таким образом, расстояние условного перехода оказывается весьма ограниченным, что иногда приводит к повышенному расходу памяти из-за необходимости использования пары команд условного и безусловного перехода.
Часто отклонение, используемое при относительной адресации, называют смещением. Однако это может привести к путанице, поскольку термин “смещение” при программировании для микропроцессора 8086 используется в первую очередь для обозначения одной из двух частей логического адреса (см. подраздел “”). Термин “отклонение”, правда, тоже используется для обозначения одного из компонентов эффективного адреса операнда, расположенного в памяти (см. параграф “” этого подраздела), однако значение этого термина оказывается в данном случае ближе к относительной адресации, поскольку и в том, и в другом случае отклонение фактически показывает, на сколько байтов в ту или иную сторону отстоит адресуемая ячейка от базового адреса, т.е. адреса следующей инструкции в команде относительного перехода или суммы содержимого регистров, используемых при формировании эффективного адреса операнда.
При прямой адресации код команды содержит полный адрес следующей выполняемой команды в формате “сегмент : смещение”, причём сначала располагается смещение, а потом селектор сегмента. Прямая адресация используется инструкциями JMP и CALL, позволяя передать им управление любой команде в памяти вычислительной машины.
Прямая адресация получила своё название в связи с тем, что в коде инструкции находится сам адрес перехода.
При косвенной адресации, доступной только инструкциям CALL и JMP, возможно выполнение как ближних, так и дальних переходов. В коде команды задаётся либо регистровый операнд (только для ближнего перехода), либо операнд в памяти (для ближнего или дальнего перехода), причём способ определения этого операнда не отличается от принятого для команд обработки данных (см. параграфы “” и “” этого подраздела).
Если выполняется ближний переход, то операнд является новым значением указателя инструкции IP, т.е. определяет смещение следующей выполняемой команды в текущем сегменте кода. Это смещение находится либо в регистре общего назначения (регистровый операнд), либо в слове памяти по заданному адресу (операнд в памяти).
Если выполняется дальний переход, адрес следующей инструкции занимает два слова памяти: в первом хранится смещение, а во втором селектор сегмента, которые загружаются соответственно в регистры IP и CS. Сама команда перехода задаёт адрес первого их этих слов (операнд в памяти).
Косвенной данный вид адресации назван по той причине, что код инструкции определяет не сам адрес перехода, а только его местоположение.
Общая структура кодов большинства команд обработки данных микропроцессора 8086 следующая:
┌──────────┐ ┌─────────┐ ┌───────────┐ ┌──────────────┐ ┌───────────┐
│ Prefixes │ │ Op Code │ │ ModRegR/M │ │ Displacement │ │ Immediate │
└──────────┘ └─────────┘ └───────────┘ └──────────────┘ └───────────┘
Как видно из приведённого рисунка, код команды в общем случае состоит из пяти частей:
префиксов (Prefixes) 03 байта;
кода операции (Op Code) 1 байт;
байта ModRegR/M 1 байт;
отклонения (Displacement) 02 байта;
непосредственного операнда (Immediate) 02 байта.
В любой инструкции присутствует код операции. Все остальные поля кода команды используются при возникновении такой необходимости. Длина кода команды колеблется от 1 до 9 байтов.
Инструкции переходов, использующие относительную адресацию, имеют следующий формат кода команды:
┌─────────┐ ┌──────────────┐
│ Op Code │ │ Displacement │
└─────────┘ └──────────────┘
Код таких команд состоит из двух полей: однобайтового кода операции и отклонения длиной 1 или 2 байта в зависимости от используемой команды. Отклонение, рассматриваемое как число со знаком, прибавляется к содержимому указателя инструкции IP, который в этот момент указывает на команду, следующую за инструкцией перехода. В результате образуется адрес следующей команды.
Команды, использующие 8-разрядное отклонение, обеспечивают выполнение так называемых коротких переходов, а команды с 16-разрядным отклонением длинных переходов. В любом случае переход является ближним (внутрисегментным).
Инструкции переходов, использующих прямую адресацию, имеют код команды размером 5 байт следующего формата:
┌─────────┐ ┌────────┐ ┌─────────┐
│ Op Code │ │ Offset │ │ Segment │
└─────────┘ └────────┘ └─────────┘
Поля смещения (Offset) и селектора сегмента (Segment) занимают по два байта и вместе составляют адрес команды, на которую производится дальний (межсегментный) переход.
Формат инструкций перехода, использующих косвенную адресацию, сводится к общему формату команды обработки данных. У них никогда не бывает поля непосредственного операнда, но всегда присутствует байт ModRegR/M; префиксы и отклонение могут присутствовать или отсутствовать. Если выполняется ближний (внутрисегментный) переход, т.е. если содержимое регистра CS не изменяется, смещение новой инструкции в текущем сегменте кода может содержаться либо в регистре общего назначения, либо в двухбайтовой области памяти, что определяется байтом ModRegR/M. Если же выполняется дальний (межсегментный) переход, то и новый селектор сегмента кода, и смещение находятся в четырёхбайтовой области памяти, адрес которой задаётся байтом ModRegR/M.
Некоторые инструкции имеют формат кода команды, отличающийся от вышеприведённых. Описание таких “нестандартных” форматов приводится при описании соответствующих инструкций.
Ниже более подробно рассматриваются компоненты кода команды обработки данных. Поля кодов инструкций переходов не рассматриваются, поскольку их назначение полностью ясно из приведённых выше рисунков и из описания в параграфе “” подраздела “”.
Префиксы
Префиксы модифицируют выполнение основной команды. Код каждого префикса занимает один байт.
Микропроцессор 8086 имеет 7 префиксов, делящихся на три группы. В коде одной команды могут присутствовать до трёх префиксов, обязательно относящихся к разным группам. Реакция микропроцессора на использование в команде нескольких префиксов из одной группы непредсказуема.
В первую группу входит единственный префикс блокировки шины LOCK (шестнадцатеричный код префикса F0). Когда он присутствует в команде, на всё время выполнения инструкции системная шина захватывается данным микропроцессором, блокируя запросы к ней со стороны других процессоров многопроцессорной системы.
Во вторую группу входят префиксы повторения операции REP/REPE/REPZ (F3) и REPNE/REPNZ (F2). Хотя для этой группы предусмотрено пять мнемоник, реально задействовано два кода префиксов. Они используются совместно со строковыми операциями с целью обработки нескольких байтов или слов одной командой.
Префиксы блокировки шины и повторения в программе на языке ассемблера располагаются непосредственно перед мнемоникой основной команды, совместно с которой они используются, например: LOCK OR [BX], AL.
К третьей группе относятся четыре префикса замены сегмента, имеющих следующие коды: 26 сегмент ES, 2E сегмент CS, 36 сегмент SS, 3E сегмент DS. В отличие от префиксов двух других групп, префиксы замены сегмента на языке ассемблера указываются уже после мнемоники основной команды и входят в состав операнда в памяти, сегмент которого они явно указывают, например: MOV ES:[BX], CX.
Некоторые сложности при программировании на языке ассемблера могут возникнуть при необходимости использовать префикс замены сегмента совместно со строковой операцией. Операнды строковых команд располагаются в сегментах DS и ES, причём заменить на другой можно только сегмент DS. Проблема заключается в том, что строковые инструкции не имеют явно задаваемых операндов, поэтому некуда включить префикс замены сегмента. Некоторые трансляторы с языка ассемблера, например MASM фирмы Microsoft и TASM фирмы Borland позволяют совместно с мнемоникой строковой операции указать формальные операнды, проверяемые синтаксически, но не играющие никакой роли при формировании кода операции. В этих операндах может быть указан и префикс замены сегмента. В некоторых случаях, однако, приходится вносить в программу непосредственно код префикса замены сегмента, предшествующий соответствующей строковой инструкции. Например, следующие две строки на языке ассемблера задают выполнение операции пересылки строк MOVSB с использованием префикса повторения REP и префикса замены сегмента CS:
DB 2Eh
REP MOVSB
Код операции
Код операции задаёт выполняемую процессором операцию, а также может полностью или частично определять операнды, используемые в данной операции.
Многие арифметико-логические инструкции способны обрабатывать данные размером байт или слово (два байта). Коды операций для этих команд отличаются значением младшего бита: нулевое значение соответствует обработке байтов, единичное слов. В некоторых инструкциях часть кода операции входит в состав байта ModRegR/M, занимая в нём три разряда, соответствующие полю Reg.
Некоторые команды, предназначенные для обработки содержимого заданного регистра общего назначения, имеют однобайтовый код операции, старшие пять разрядов которого определяют операцию, а младшие три задают номер используемого регистра. Например, инструкция DEC AX имеет код операции 48, инструкция DEC CX код операции 49 и т.п.
Полная сводка кодов операций микропроцессора 8086 приведена в приложении.
Байт ModRegR/M
Основное назначение байта ModRegR/M определять операнды, явно задаваемые в данной команде. Он состоит из трёх полей и имеет следующую структуру:
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ M o d │ R e g │ R / M │
└───┴───┴───┴───┴───┴───┴───┴───┘
7 6 5 4 3 2 1 0
Поле Mod определяет местоположение одного из операндов инструкции в регистре или в памяти; в последнем случае совместно с полем R/M оно определяет способ вычисления эффективного адреса операнда (см. параграф “” подраздела “”).
Поле Reg либо указывает регистр, являющийся операндом инструкции, либо является расширением кода операции. Как номер регистра-операнда поле Reg используется только в инструкциях вида “регистррегистр” или “регистрпамять”; в инструкциях вида “регистрнепосредственный операнд”, а также в инструкциях, имеющих только один явно заданный операнд, это поле является частью кода операции.
Поле R/M содержит либо номер регистраоперанда инструкции, либо совместно с полем Mod определяет способ вычисления эффективного адреса операнда, находящегося в памяти. Интерпретация поля R/M зависит от содержимого поля Mod.
Кодировка регистров общего назначения в полях Reg и R/M осуществляется следующим образом:
AX или AL 000;
CX или CL 001;
DX или DL 010;
BX или BL 011;
SP или AH 100;
BP или CH 101;
SI или DH 110;
DI или BH 111.
Разрядность используемого регистра (8- или 16-разрядный) определяется кодом операции.
Местоположение операнда определяется полями Mod и R/M следующим образом.
R/M |
Mod |
|||
00 |
01 |
10 |
11 |
|
000 |
[BX+SI] |
[BX+SI]+disp8 |
[BX+SI]+disp16 |
AX/AL |
001 |
[BX+DI] |
[BX+DI]+disp8 |
[BX+DI]+disp16 |
CX/CL |
010 |
[BP+SI] |
[BP+SI]+disp8 |
[BP+SI]+disp16 |
DX/DL |
011 |
[BP+DI] |
[BP+DI]+disp8 |
[BP+DI]+disp16 |
BX/BL |
100 |
[SI] |
[SI]+disp8 |
[SI]+disp16 |
SP/AH |
101 |
[DI] |
[DI]+disp8 |
[DI]+disp16 |
BP/CH |
110 |
disp16 |
[BP]+disp8 |
[BP]+disp16 |
SI/DH |
111 |
[BX] |
[BX]+disp8 |
[BX]+disp16 |
DI/BH |
Если поле Mod содержит значение 11, поле R/M определяет регистр общего назначения, являющийся операндом инструкции. Разрядность регистра зависит от разрядности выполняемой инструкции и определяется кодом операции.
Значения поля Mod, равные 00, 01 и 10, определяют операнд в памяти. Значение 00 указывает, что при вычислении эффективного адреса операнда отклонение не используется; значение 01 указывает, что используется 8-разрядное отклонение, находящееся в байте, следующем за байтом ModRegR/M; значение 10 указывает, что используется 16-разрядное отклонение, записанное в двух байтах, следующих за байтом ModRegR/M, в обычном порядке (“младшийстарший”).
Поле R/M для случая операнда в памяти определяет, содержимое каких регистров общего назначения будет использоваться при вычислении эффективного адреса операнда.
Комбинация Mod=00 и R/M=110 является исключением из общего правила: эффективный адрес операнда равен 16-разрядному отклонению, следующему в коде команды непосредственно за байтом ModRegR/M; содержимое регистров общего назначения в формировании эффективного адреса для этого случая не используется.
Когда в состав эффективного адреса входит содержимое регистра BP, для формирования физического адреса операнда используется селектор сегмента стека, находящийся в регистре SS. Если же при вычислении эффективного адреса регистр BP не используется, физический адрес формируется с помощью селектора сегмента данных их регистра DS. И в том, и в другом случае используемый по умолчанию сегментный регистр может быть изменён с помощью префикса замены сегмента, входящего в состав кода команды.
Отклонение
Отклонение является 8- или 16-разрядной величиной, используемой при вычислении эффективного адреса операнда. Один или два байта отклонения располагаются в коде команды сразу за байтом ModRegR/M; для 16-разрядного отклонения сначала идёт младший байт, а затем старший. Наличие отклонения определяется содержимым байта ModRegR/M.
16-разрядное отклонение присутствует в двух случаях: когда поле Mod байта ModRegR/M содержит значение 10 либо когда поле Mod содержит значение 00, а поле R/M значение 110.
8-разрядное отклонение присутствует, когда поле Mod содержит значение 01.
Непосредственный операнд
8- или 16-разрядный непосредственный операнд присутствует только в командах вида “регистрнепосредственный операнд” и “памятьнепосредственный операнд”. Его наличие определяется кодом операции, который состоит из байта кода операции и поля Reg байта ModRegR/M. Поля Mod и R/M этого байта определяют местоположение второго операнда инструкции в регистре общего назначения или в памяти.
Непосредственный операнд располагается в коде команды непосредственно за отклонением, а если последнее отсутствует за байтом ModRegR/M. Байты 16-разрядного непосредственного операнда хранятся в порядке “младшийстарший”.
В инструкциях, обрабатывающих байты, непосредственный операнд всегда имеет размер один байт. В инструкциях, обрабатывающих слова, непосредственный операнд может занимать один или два байта, при этом байтовый операнд, рассматриваемый как двоичное число со знаком, расширяется до слова.
Инициализация микропроцессора 8086 выполняется при поступлении аппаратного сигнала сброса. В результате выполнения внутренней микропрограммы сброса в регистрах устанавливаются следующие начальные значения (в шестнадцатеричном виде):
регистр флагов Flags F002;
регистр указателя инструкции IP 0000;
регистр селектора сегмента кода CS FFFF;
регистр селектора сегмента данных DS 0000;
регистр селектора сегмента стека SS 0000;
регистр селектора сегмента дополнительных данных ES 0000.
Содержимое других регистров микропроцессора непредсказуемо.
После установки начального содержимого перечисленных выше регистров микропроцессор производит выборку и выполнение первой инструкции. Её физический адрес равен FFFF0. В IBM-совместимых вычислительных машинах по этому адресу располагается ПЗУ BIOS, а первой выполняемой инструкцией является команда дальнего (межсегментного) безусловного перехода на программу самотестирования, являющуюся частью BIOS.
Современная ЭВМ представляет собой комплекс автономных устройств, каждое из которых выполняет свои функции под управлением местного устройства управления независимо от других устройств машины. Устройство включается в работу центральным процессором (ЦП). Он передает устройству команду и все необходимые для ее исполнения параметры. После начала работы устройства центральный процессор отключается от него и переходит к обслуживанию других устройств или к выполнению других функций.
Можно считать, что центральный процессор переключает свое внимание с устройства на устройство и с функции на функцию. На что именно обращено внимание ЦП в каждый данный момент, определяется выполняемой им программой.
Во время работы в ЦП поступает (и вырабатывается в нем самом) большое количество различных сигналов. Сигналы, которые выполняемая в ЦП программа способна воспринять, обработать и учесть, составляют поле зрения ЦП или, другими словами, входят в зону его внимания.
Например, если процессором исполняется программа сложения двух двойных слов, которая анализирует регистр флагов ЦП, то в ее «поле зрения» находятся флаги микропроцессора, определяющие знаки исходных данных и результата, наличие переноса из тетрады или байта, переполнения разрядной сетки и др. Такая программа готова реагировать на любой из сигналов, находящихся в ее зоне внимания (а поскольку именно программа управляет работой ЦП, то она определяет и «зону внимания» центрального процессора). Но если во время выполнения такой программы нажать какую-либо клавишу, то эта программа «не заметит» сигнала от этой клавиши, так как он не входит в ее «поле зрения».
Для того чтобы ЦП, выполняя свою работу, имел возможность реагировать на события, происходящие вне его зоны внимания, и наступления которых он «не ожидает», существует система прерываний ЭВМ. При отсутствии системы прерываний все заслуживающие внимания события должны находиться в поле зрения процессора, что сильно усложняет программы и требует большой их избыточности. Кроме того, поскольку момент наступления события заранее неизвестен, процессор в ожидании какого-либо события может находиться длительное время, и, чтобы не пропустить его появления, ЦП не может «отвлекаться» на выполнение другой работы. Такой режим работы (режим сканирования ожидаемого события) связан с большими потерями времени ЦП на ожидание.
Кроме сокращения потерь на ожидание, режим прерываний позволяет организовать выполнение такой работы, которую без него реализовать просто невозможно.
Например, при появлении неисправностей, нештатных ситуаций режим прерываний позволяет организовать работу по диагностике и автоматическому восстановлению в момент возникновения нештатной ситуации, прервав выполнение основной работы таким образом, чтобы сохранить полученные к этому времени правильные результаты. Тогда как без режима прерываний обратить внимание на наличие неисправности система могла только после окончания выполняемой работы (или ее этапа) и получения неправильного результата.
Таким образом, система прерываний позволяет микропроцессору выполнять основную работу, не отвлекаясь на проверку состояния сложных систем при отсутствии такой необходимости, или прервать выполняемую работу и переключиться на анализ возникшей ситуации сразу после ее появления.
Помимо требующих внимания нештатных ситуаций, которые могут возникнуть при работе микропроцессорной системы, процессору полезно уметь «переключать внимание» и на различные виды работ, одновременно выполняемые в системе. Поскольку управление работой системы осуществляется программой, этот вид прерываний должен формироваться программным путем.
В зависимости от места нахождения источника прерываний они могут быть разделены на:
Принцип действия системы прерываний заключается в следующем: при выполнении программы после каждого рабочего такта микропроцессора изменяется содержимое регистров, счетчиков, состояние отдельных управляющих триггеров, т.е. изменяется состояние процессора. Информация о состоянии процессора лежит в основе многих процедур управления вычислительным процессом. Не вся информация одинаково актуальна, есть существенные элементы, без которых невозможно продолжение работы. Эта информация должна сохраняться при каждом «переключении внимания процессора».
Совокупность значений наиболее существенных информационных элементов называется вектором состояния или словом состояния процессора (в некоторых случаях оно называется словом состояния программы).
Вектор состояния в каждый момент времени должен содержать информацию, достаточную для продолжения выполнения программы или повторного пуска ее с точки, соответствующей моменту формирования данного вектора.
Вектор состояния формируется в соответствующем регистре процессора или в группе регистров, которые могут использоваться и для других целей.
Наборы информационных элементов, образующих векторы состояния, отличаются у ЭВМ разных типов.
Например, в IBM PC вектор состояния включает содержимое счетчика команд, сегментных регистров, регистра флагов и аккумулятора (регистра АХ).
При возникновении события, требующего немедленной реакции со стороны машины, ЦП прекращает обработку текущей программы и переходит к выполнению другой программы, специально предназначенной для данного события, по завершении которой возвращается к выполнению отложенной программы. Такой режим работы называется прерыванием.
Каждое событие, требующее прерывания, сопровождается специальным сигналом, который называется запросом прерывания.
Программа, затребованная запросом прерывания, называется обработчиком прерывания.
Запросы на прерывание могут возникать из-за сбоев в аппаратуре (зафиксированных схемами контроля), переполнения разрядной сетки, деления на нуль, выхода за установленные для данной программы области памяти, затребования периферийным устройством операции ввода-вывода, завершения операции ввода-вывода или возникновения при этой операции особых условий и т.д.
Некоторые из этих запросов порождаются самой программой, но время их возникновения невозможно предсказать заранее.
При наличии нескольких источников запросов прерывания часть из них может поступать одновременно. Поэтому в ЭВМ устанавливается определенный порядок (дисциплина) обслуживания поступающих запросов. Кроме того, в ЭВМ предусматривается возможность разрешать или запрещать прерывания определенных видов.
ПЭВМ IBM PC может выполнять 256 различных прерываний, каждое из которых имеет свой номер (двухразрядное шестнадцатеричное число).
Все прерывания делятся на две группы:
Прерывания DOS имеют более высокий уровень организации, чем прерывания BIOS, они строятся на использовании модулей BIOS в качестве элементов.
Прерывания делятся на три типа: аппаратные, логические и программные.
Аппаратные прерывания вырабатываются устройствами, требующими внимания микропроцессора: прерывание № 2 - отказ питания; № 8 - от таймера; № 9 - от клавиатуры; № 12 - от адаптера связи; № 14 - от НГМД; № 15 - от устройства печати и др.
Запросы на логические прерывания вырабатываются внутри микропроцессора при появлении «нештатных» ситуаций: прерывание № 0 - при попытке деления на 0; № 4 - при переполнении разрядной сетки арифметико-логического устройства; № 1 - при переводе микропроцессора в пошаговый режим работы; № 3 - при достижении программой одной из контрольных точек. Последние два прерывания используются отладчиками программ для организации пошагового режима выполнения программ (трассировка) и для остановки программы в заранее намеченных контрольных точках.
Запрос на программное прерывание формируется по команде «INTn» (где n - номер вызываемого прерывания).
Запрос на аппаратное или логическое прерывание вырабатывается в виде специального электрического сигнала.
Аппаратные прерывания
Аппаратные прерывания обеспечивают реакцию процессора на события, происходящие асинхронно по отношению к исполняемому программному коду.
Процессоры семейства х86 поддерживают таблицу, содержащую определения до 256 процедур обслуживания, и различают четыре источника прерываний:
Последние из этого списка в прямом смысле прерываниями не являются, поскольку представляют собой лишь специфический способ вызова процедур - не по адресу, а по номеру в таблице.
Условия возникновения прерываний проверяются процессором на границе инструкций. Это означает, что все шинные операции текущей инструкции будут завершены до начала обработки прерывания. При обработке прерывания процессор сохраняет в стеке слово состояния (регистры флагов, кодового сегмента и указатель следующей инструкции), сбрасывает флаг разрешения прерываний IF и вызывает процедуру обслуживания, точка входа в которую описана в таблице прерываний, хранящейся в ОЗУ. Процедура обработки завершается инструкцией IRET, по которой из стека восстанавливаются автоматически сохраненные регистры (в регистре флагов прерывания разрешены) и процессор начинает выполнение инструкции, следующей за той, после которой исполнялось прерывание.
Конечно, программно во время обслуживания прерывания возможно умышленное или случайное изменение указателя или содержимого стека, и тогда инструкция IRET «отправит» процессор по другому адресу, в результате чего компьютер может и зависнуть. Прерывания могут быть и вложенными, если процедура обслуживания установит флаг IF. Тогда возникает опасность переполнения стека, поскольку каждое «вложение» будет использовать его для своих целей. Переполнение стека может также являться причиной зависаний. Длинные процедуры обработки со сброшенным флагом IF могут привести к потере системного времени, поскольку «часы» операционной системы используют аппаратные прерывания от таймера.
Процедура обслуживания для каждого источника аппаратных прерываний должна быть написана весьма осмотрительно, и учитывать нюансы работы остальных подсистем.
Внутренние прерывания процессора (исключения) генерируются при возникновении особых условий выполнения текущей инструкции. В большинстве своем они не столько асинхронны, сколько неожиданны для исполнения программного кода.
Под эти прерывания фирмой Intel были зарезервированы первые 32 вектора таблицы прерываний, однако в IBM PC/XT/AT многие из них пересекаются с внешними и программными прерываниями, что порождает некоторые проблемы.
Немаскируемые прерывания обрабатываются процессором независимо от состояния флага разрешения прерывания IF. К ним относятся прерывания, приходящие по линии NMI, а для процессоров, поддерживающих режим системного управления, еще и по линии SMI#.
Сигнал на линию NMI приходит от схем контроля паритета памяти, от линии IOCHK шины ISA или SERR шины PCI. В машинах класса AT сигнал NMI блокируется до входа процессора установкой в «I» бита 7 порта 070h, отдельные источники - битами 2, 3 порта 061h (см. примечание). Идентифицировать источник NMI позволяют биты 6, 7 регистра 061h.
В XT NMI вызывается еще и математическим сопроцессором при возникновении исключения. Запретить NMI позволяет обнуление бита 7 порта 0A0h; отдельные источники блокируются битами 4, 5 регистра 061h; идентифицируют источники биты 6, 7 регистра 062h (см. п. 2.7.1).
Если во время обработки немаскируемого прерывания повторно появляется сигнал NMI, то вложенного прерывания не будет - повторный вызов обработчика NMI возможен только после исполнения инструкции IRET.
Прерывание SMI возникает от схем чипсета, участвующих в управлении энергопотреблением. Это прерывание имеет наивысший приоритет и обслуживается несколько иначе, чем «классические» прерывания. Здесь процессор не выполняет вызов процедуры, описанной в таблице прерываний, а переходит в режим SMM. Первым делом в памяти SMRAM (а не в стеке!) автоматически сохраняется контекст процессора, после чего начинается исполнение кода по определенному адресу в памяти SMRAM. В режиме SMM обычные прерывания (в том числе и немаскируемые) запрещены, так что процессор не нуждается в обычной памяти, которая для него и недоступна. При необходимости обработка прерываний может быть и разрешена, но это требует некоторых действий с таблицей прерываний. Выход из режима SMM происходит по выполнении инструкции RSM, завершающей процедуру обработки SMI. По этой инструкции автоматически восстанавливается сохраненный (или умышленно модифицированный) контекст процессора, процессор выходит в обычное адресное пространство памяти (снимается сигнал SMIACT#) и переходит к выполнению прерванной программы. В отличие от обычных прерываний, по окончании обслуживания которых процессор переходит к исполнению инструкции, следующей за исполненной до начала обработки прерывания, расширенные средства SMM предполагают возможность рестарта некоторых инструкций. Рестарт (повторное исполнение) возможен для инструкции останова (HALT) и инструкций ввода/вывода. Возможность рестарта инструкции ввода/вывода используют, например, когда прикладная программа (или системный драйвер) пытается обратиться операцией ввода/вывода к периферийному устройству, находящемуся в «спящем» режиме. Системная логика в этом случае должна выработать сигнал SMI раньше сигнала готовности RDY#, завершающего шинный цикл рестартуе-мой инструкции ввода/вывода. Обработчик SMI «разбудит» устройство, после чего операция ввода/вывода рестартует и прикладное ПО (или драйвер) «не заметит», что устройство пребывало в спячке. Таким образом, управление потреблением может быть организовано на уровне BIOS способом, совершенно прозрачным для программного обеспечения (в том числе и ОС).
Обработка маскируемых прерываний может запрещаться инструкцией DI и разрешаться - EI (или другим способом воздействия на флаг процессора IF). Эти прерывания обслуживаются контроллером, программно-совместимым с микросхемой 8259А, входящей еще в комплект поддержки процессоров 8086/88.
Такой контроллер имеет 8 входов запросов прерывания IRQx от внешних источников и выход запроса INTR, по которому запрос поступает на одноименный вход процессора. При обработке запроса INTR процессор формирует шинный цикл подтверждения прерывания INTA, в котором контроллер передает по шине данных 8-битный вектор прерывания. Этот вектор и является номером, по которому ссылка на процедуру обработки прерывания хранится в таблице прерываний. Исторически сложилось так, что контроллер 8259А требует двух шинных циклов INTA, из которых процессоры 80х86 для передачи вектора используют только второй (первый цикл использовался для подачи кода инструкции прерывания еще в процессоре 8080, и циклов было даже три), В дань совместимости и современные процессоры выполняют этот лишний цикл системной шины.
Контроллеры 8259А допускают каскадное соединение: ведущий (Master) контроллер подключается ко входу запроса прерываний процессора, а ко входам этого контроллера могут подключаться ведомые (Slave) контроллеры. Таким образом, можно увеличить число линий источников прерываний до 88=64. Каскадирование применяется в машинах класса AT, где используются два контроллера. Ведущий контроллер 8259А#1 обслуживает запросы 0, 1, 3-7. К его входу 2 подключен ведомый контроллер 8259А#2, который обслуживает запросы 8-15. При этом используется вложенность приоритетов запросы 8-15 со своим рядом убывающих приоритетов вклиниваются между запросами 1 и 3 ведущего контроллера, приоритеты запросов которого также убывают с ростом номера. В XT каскадирование не применялось, и один 8259А обслуживал все 8 линий запросов.
На входы контроллеров прерываний поступают запросы от системных устройств (клавиатура, системный таймер, CMOS-таймер, сопроцессор) и от плат расширения. Традиционно все линии запросов, не занятые перечисленными системными устройствами, присутствуют на слотах шины ISA/EISA. Эти линии обозначаются как IRQx и имеют общепринятые предназначения, приведенные в табл. 7.1. В таблице отражены и приоритеты прерываний - запросы расположены в порядке их убывания. Номера векторов, соответствующих линиям запросов контроллеров, система приоритетов и некоторые другие параметры задаются программно при инициализации контроллеров. Эти основные настройки сохраняются традиционными для обеспечения совместимости с программным обеспечением.
Назначения номеров прерываний выполняются с двух сторон: во-первых, адаптер, нуждающийся в использовании прерываний, должен быть сконфигурирован на использование конкретной линии шины (джамперами или программно). Во-вторых, программное обеспечение, поддерживающее данный адаптер, должно быть проинформировано о номере используемого вектора. Поскольку линии запросов прерываний в компьютере, насыщенном дополнительными адаптерами, являются самым дефицитным ресурсом, возникает желание использовать эти линии разделяемо между несколькими устройствами. Тогда обработчик прерывания одного устройства, определив, что источник - не его, вызывал бы обработчик другого устройства, конкурирующего по линии запроса. Однако в шине ISA прерывание вырабатывается по положительному перепаду сигнала на линии запроса - разработчики XT сэкономили целую микросхему ТТЛ (своеобразный «плевок в вечность»). Это плохо по двум причинам: во-первых, как известно из общей цифровой схемотехники, такой способ подачи сигнала имеет меньшую помехозащищенность, чем срабатывание по отрицательному перепаду. Если кто обращал внимание на сообщение «Spurious Interrupt was detected on controller...», иногда появляющееся на консоли сервера NetWare, то оно относится именно к обнаружению этих помех. В операционных системах, неактивно использующих прерывания (а к ним, в первую очередь, относится MS-DOS), эти явления незаметны и обычными тестами (PC Check, Checkit) не выявляются. Во-вторых, такой способ подачи сигнала отрезает путь к нормальному разделяемому использованию линий, для которого полностью пригоден способ подачи сигнала по низкому уровню. Поскольку традиционный контроллер позволяет задавать чувствительность - уровень (Level) или перепад (Edge) - только для всех входов одновременно, в общем случае разделяемые прерывания на шине ISA вместе с корректной работой системных устройств использоваться не могут. Однако некоторые чипсеты системных плат, реализующие и функции контроллеров прерываний, допускают индивидуальное управление чувствительностью каждого входа. Тогда при соответствующих возможностях конфигурируемости BIOS Setup и применяемых адаптеров разделяемые прерывания технически реализуемы.
При чувствительности к уровню сигнал запроса аппаратного прерывания IRQx должен удерживаться схемой, его генерирующей, по крайней мере до цикла подтверждения прерывания процессором. В противном случае источник прерывания корректно идентифицирован не будет. Обычно адаптеры строят так, что сигнал запроса сбрасывается при обращении программы обслуживания прерывания к соответствующим регистрам адаптера.
Для запросов прерывания с шины PCI используются 4 линии запросов прерывания, которые обозначают как INTR А, В, С, D. Эти линии работают по низкому уровню, что дает возможность их разделяемого использования. Линии циклически сдвигаются в слотах (рис. 7.1) и независимо коммутируются на доступные линии IRQx с помощью конфигурационных регистров чипсета. Линии IRQx, используемые шиной PCI, становятся недоступными для шины ISA. «Дележку» линий между шинами, а также управление чувствительностью отдельных линий выполняют настройки опций BIOS Setup, а также система РnР. В опциях настройки «ISA» или «Legacy» подразумевают использование линий IRQx традиционными адаптерами шины ISA (статическое распределение), a «PCI/PnP» - использование адаптерами шины PCI или адаптерами РnР для шины ISA (динамическое распределение).
Как уже говорилось, в AT используются контроллеры прерываний, совместимые с 8259А. На современных системных платах их функции возлагаются на чипсет, который может иметь и более гибкие возможности управления. В любом случае в операционном режиме сохраняется программная совместимость с 8259А, а инициализация может и отличаться, но ей занимается POST, который «знает» особенности системной платы. В симметричных мультипроцессорных системах аппаратные прерывания работают сложнее, поскольку их могут обслуживать различные процессоры.
Для реализации системы прерываний процессоры Pentium, Pentium Pro и Pentium II имеют встроенный контроллер прерываний APIC (Advanced Programmable Interruption Controller). Внутренние контроллеры процессоров связаны между собой по шине APIC, к которой подключена и «ответная часть» чипсета, преобразующая запросы аппаратных прерываний в сигналы протокола APIC. В операционном режиме такая связка также совместима с 8259А.
Микропроцессор 8086 обрабатывает три вида исключений по ошибке деления, по точке остановка и по переполнению. Кроме того, в нём реализовано прерывание по трассировке.
Прерывание по ошибке деления
Прерывание по ошибке деления возникает при выполнении инструкции DIV или IDIV, если результат прерывает максимально допустимую величину, а также при попытке деления на нуль.
Выполнение инструкции деления прекращается, управление передаётся обработчику прерывания по вектору 0. В стеке будет сохранён адрес инструкции деления, вызвавшей прерывание.
Прерывание по точке останова
Прерывание по точке останова возникает, если в программе встретилась инструкция INT3. Выполнение этой инструкции приводит к передаче управления обработчику прерывания по вектору 3. В стеке сохраняется адрес следующей инструкции.
Следует обратить внимание, что система команд микропроцессора 8086 обеспечивает два формата инструкции INT3 однобайтовый (код команды CC) и двухбайтовый (код команды CD 03). Функционально они ничем не отличаются, но двухбайтовый формат принято относить к программным прерываниям, а однобайтовый к исключениям.
Прерывание по переполнению
Прерывание по переполнению происходит, если при выполнении инструкции INTO флажок переполнения OF в регистре флагов установлен. Когда этот флажок сброшен, инструкция INTO никаких действий не производит. Обработчик прерывания по переполнению использует вектор 4.
При прерывании в стеке сохраняется адрес следующей инструкции.
Прерывание по трассировке
Прерывания по трассировке происходят после выполнения каждой инструкции, когда в регистре флагов установлен флажок трассировки TF. В этом случае, завершив выполнение инструкции, микропроцессор передаёт управление обработчик прерывания по вектору 1. В стеке сохраняется адрес следующей инструкции.
Особенностью микропроцессоров семейства 8086 является то, что впервые после установки флажка трассировки связанное с ним прерывание происходит не после инструкции, в ходе выполнения которой этот флажок был установлен, а по завершении следующей за ней инструкции. Например, если при завершении обработчика прерывания по трассировке с помощью команды IRET в восстановленном содержимом регистра флагов флажок TF окажется установлен, то новое прерывание по трассировке произойдёт не сразу после выполнения инструкции IRET, а по завершении команды, на которую инструкцией IRET будет возвращено управление. В процессорах других ЭВМ, не обеспечивающих подобной задержки прерывания по трассировке, обычно используются две инструкции возврата из прерывания одна для “обычного” возврата, другая для возврата с задержкой прерывания по трассировке. Например, в 16-разрядных мини-ЭВМ семейства PDP-11 фирмы DEC (советский аналог ЭВМ типа СМ-3, СМ-4, СМ-1420 и т.п.) имеются инструкции возврата из прерывания RTI и RTT, отличающиеся друг от друга именно реакцией на флажок трассировки.
Программные прерывания возникают при выполнении инструкций INT n, где n номер вектора прерывания, которое должно произойти. Коды этих команд состоят из двух байтов: первый содержит код операции (CD), второй номер вектора прерывания. При прерывании в стеке сохраняется адрес следующей инструкции.
Как уже упоминалось, микропроцессор 8086 использует векторную систему прерываний, при которой каждому обработчику прерывания назначается свой номер, называемый вектором. Всего имеется 256 векторов прерываний.
Таблица векторов прерываний занимает младший 1 Кбайт физического адресного пространства микропроцессора. Каждому вектору в ней соответствует четырёхбайтовая область. Первое слово любого вектора прерывания содержит смещение, а второе слово селектор сегмента обработчика прерывания, назначенного этому вектору. Таким образом, каждый вектор является дальним адресом (парой “сегмент : смещение”) соответствующего обработчика прерывания.
Независимо от причины возникновения прерывания микропроцессор обрабатывает их одинаковым образом.
Закончив выполнение инструкции, в ходе которого возник запрос прерывания, микропроцессор сохраняет в стеке текущее содержимое регистра флагов и дальний адрес текущей (для прерывания по ошибке деления) или следующей команды (для всех остальных причин возникновения прерывания), т.е. записывает в стек сначала содержимое регистра флагов, затем содержимое регистра CS, а в конце содержимое регистра IP. Затем в регистре флагов сбрасывается флажки разрешения прерывания IF и трассировки TF, чем обеспечивается блокировка возникновения новых маскируемых внешних прерываний и запрещаются пошаговые прерывания по выполнении каждой инструкции. Наконец, из таблицы векторов прерываний извлекается дальний адрес обработчика прерывания, и его компоненты загружаются в регистры CS и IP, благодаря чему производится переход на обработку прерывания.
Следует обратить внимание на то, что, когда происходит немаскируемое прерывание, следующие немаскируемые прерывания блокируются аппаратурой микропроцессора до выполнения инструкции возврата из прерывания IRET. Маскируемые прерывания при этом также оказываются запрещены, но за счёт сброса флажка IF в регистре флагов. Если этот флажок будет установлен, микропроцессор будет способен обрабатывать маскируемые прерывания, хотя останется заблокированным для немаскируемых прерываний.
Одновременно может возникать несколько запросов прерываний. В этом случае микропроцессор обслуживает их в соответствии с их приоритетами. Сначала обслуживается прерывание с высшим приоритетом, затем с более низким (если в результате обслуживания более приоритетного запроса процессор не оказался замаскирован для менее приоритетного прерывания).
Высший приоритет имеют исключения деления, точки останова и переполнения и программные прерывания. Поскольку они взаимно исключают друг друга (могут произойти при выполнении только определённых инструкций микропроцессора), ситуация, когда необходимо обслужить одновременно несколько прерываний этих видов, возникнуть не может.
Следом по приоритету следует немаскируемое внешнее прерывание. Как уже отмечалось, если такое прерывание произошло, следующее немаскируемое прерывание может быть выполнено только после выполнения команды IRET, при этом не играет роли, обработку какого запроса прерывания данная команда завершает (аппаратура микропроцессора реагирует на сам факт выполнения инструкции IRET).
На третьем месте стоят маскируемые внешние прерывания. Поскольку выполнение прерывания приводит к сбросу флажка IF в регистре флагов, выполнение маскируемого прерывания откладывается до тех пор, пока флажок IF не будет вновь установлен.
Самый низкий приоритет имеет трассировочное прерывание.
К сожалению, архитектура процессоров семейства 80x86 не позволяет однозначно идентифицировать источник прерывания по его вектору. Например, прерывание по вектору 0 может произойти по одной из следующих причин:
по обнаружению ошибки во время выполнения инструкций деления DIV и IDIV (“штатная” причина для прерывания по этому вектору);
по инструкции INT 0;
при поступлении сигнала внешнего маскируемого прерывания, сопровождаемого передачей нулевого номера вектора прерывания.
В связи с отсутствием однозначной идентификации при возникновении прерывания его обработчик должен определить конкретную причину возникновения прерывания. Способ идентификации определяется программистом, однако в любом случае следует обратить внимание на следующие моменты.
Используемый в персональных компьютерах контроллер прерываний на базе микросхем типа 8259 (эмулируемый современными чипсетами) фиксирует факт обслуживания прерывания по каждой из своих линий запросов прерываний. Обработчик прерывания должен проверить состояние соответствующего внутреннего регистра контроллера прерываний, чтобы определить, послужил ли причиной прерывания внешний запрос или какое-нибудь событие внутри программы. Естественно, что если данному вектору прерывания не соответствует какая-либо линия запроса внешнего прерывания (IRQ), то и произойти это прерывание по внешнему запросу не может.
При прерывании по ошибке деления (вектор 0) сохранённый в стеке адрес будет указывать на команду деления, вызвавшую прерывание, в то время как при выполнении инструкции INT 0 на следующую за ней инструкцию, которая также может оказаться командой деления. Необходимо проанализировать код команды, на которую указывает сохранённый в стеке адрес инструкции если это не команда деления, то причиной прерывания является инструкция INT 0. Если же сохранён адрес команды деления, то требуется “ручная” проверка её параметров. Если они окажутся корректными, то прерывание возникло из-за инструкции INT 0, непосредственно предшествующей команде деления. Если же параметры некорректны, причиной могла послужить и предшествовавшая инструкция INT 0, и инструкция деления. Совершенно однозначная идентификация в такой ситуации невозможна: хотя последние два байта, предшествующие команде деления, могут совпасть с кодом команды INT 0 (CD 00), нельзя поручиться, что эти байты не являются частью многобайтового кода какой-нибудь другой команды.
Чтобы определить, произошло ли прерывание по вектору 1 в результате трассировки выполнения программы с помощью флажка TF или из-за выполнения инструкции INT 1, нужно проверить состояние флажка TF в содержимом регистра FLAGS, сохранённом в стеке в процессе прерывания. Если этот флажок там сброшен, прерывание было вызвано инструкцией INT 1. Если же флажок был установлен, то имело место прерывание трассировки, что, однако, не исключает вероятности того, что одновременно была выполнена и инструкция INT 1. Однозначная идентификация в такой ситуации невозможна по той же причине, что и для вектора 0.
Прерывание по вектору 2 может произойти либо при поступлении внешнего сигнала немаскируемого прерывания NMI, либо при выполнении двухбайтовой команды INT 2. Однозначная идентификация возможна только в том случае, если аппаратура вычислительной машины обеспечивает программно-доступную фиксацию сведений о возникшем немаскируемом прерывании подобно тому, как контроллер прерываний 8259 при соответствующем программировании фиксирует информацию о маскируемых запросах прерываний по линиям IRQ.
Прерывания по векторам 3 и 4 могут быть программно идентифицированы однозначно: они происходят либо из-за выполнения однобайтовых инструкций INT3 и INTO (коды CC и CE соответственно), либо из-за двухбайтовых инструкций INT 3 и INT 4 (коды CD 03 и CD 04 соответственно).
Таким образом, в общем случае абсолютно точно идентифицировать источник прерывания по векторам 02 невозможно. Как уже упоминалось, фирма Intel зарезервировала векторы 031 для “внутренних нужд” микропроцессора; часть из них задействована в современных образцах процессоров. Поэтому настоятельно не рекомендуется использовать инструкции INT с номерами 031, а также назначать этим векторам маскируемые аппаратные прерывания.
Заключение до 5 мин.
Лекция разработана «___»________20__г.
_______________________(___________)
(подпись, фамилия и инициалы автора)