2.2. Назначение входов/выходов ВМ86 в минимальном режиме
2.3. Назначение входов/выходов ВМ86 в максимальном режиме
2.4. Внутренняя архитектура МП ВМ86
2.6. Программная модель МП ВМ86
2.7. Организация оперативной памяти
2.8. Организация адресного пространства портов ВУ
2.9. Методы обмена информацией между МП и портами ВУ
2.10. Параллельный программируемый адаптер К1810ВВ55 (i8255)
2.11. Пример использования и программирования адаптера
2.12. Программируемый таймер К1810ВИ54 (i8254)
2.13. Пример использования таймера
2.16. Контроллер прерываний К1810ВН59 (i8259)
2.17. Дополнительная информация о настройке ВН59
2.19. Контроллер прямого доступа к памяти К1810ВТ37 (i8237)
2.20. Программирование КПДП ВТ37
2.21. Организация процессорного модуля ВМ86
2.22. Организация шинного интерфейса в максимальном режиме
2.23. Слабо связанные конфигурации
2.1. Микропроцессор К1810ВМ86
Зарубежный аналог этой микросхемы имеет обозначение i8086. Этот микропроцессор (МП) относится к CISC-типу. Он имеет 20 адресных линий (т.е. может адресовать 220 = 1 Мбайт ячеек ОП) и 16 линий данных. МП может работать в двух режимах: минимальном и максимальном.
Минимальный режим используется, когда на основе МП реализуется несложная однопроцессорная система. Для сложных однопроцессорных и многопроцессорных систем используется максимальный режим.
2.2. Назначение входов/выходов ВМ86 в минимальном режиме
Обозначение МП ВМ86 на функциональных схемах приведено на рис.2.1. Рассмотрим назначение входов-выходов МП в минимальном режиме.
CLK (clock – частота) – вход тактовых импульсов. Синхросерия на этот вход обычно подается с микросхемы генератора К1810ГФ84 (i8284).
INTR (interrupt request – запрос на прерывание) – маски-руемый вход запросов на прерывание. Все запросы на прерывание от внешних устройств заводятся на этот вход через схему ИЛИ. Внутри процессора имеется флаг if. Если этот флаг установлен в единицу, МП воспринимает запросы на входе INTR, если установлен в ноль – игнорирует. Вход INTR называют статическим. Процессор опрашивает сигнал на этом входе на границах команд. Cигнал на этом входе должен иметь достаточную длительность, иначе процессор может его «не заметить».
Рис. 2.1
INTA (interrupt acknowledge – прерывание подтверждаю) – выход подтверждения прерывания. Если МП воспринял запрос на входе INTR, то он вырабатывает два сигнала на выходе INTA, подтверждая тем самым прерывание. Эти сигналы предназначены для контроллера прерываний К1810ВН59 (i8259).
NMI (non-maskable interrupt ‑ немаскируемое прерывание) – немаскируемый вход запросов на прерывание. МП всегда воспринимает запросы, поступающие на этот вход, независимо от состояния флага if. Сигналы подтверждения прерывания при этом не вырабатываются. Этот вход называют динамическим. Внутри процессора есть триггер, срабатывающий по переднему фронту сигнала на входе NMI. На границах команд процессор опрашивает состояние этого триггера. Таким образом, требования к длительности сигнала на входе NMI существенно ниже чем к длительности сигнала на входе INTR.
RESET – сброс микропроцессора. Сигнал на этот вход подается при включении питания или при нажатии кнопки RESET. Этот сигнал формируется генератором ГФ84. По этому сигналу происходит сброс в ноль всех флагов (т.е. внешние прерывания запрещаются), в регистры ip, es, ds и ss загружаются нули, а в регистр cs – единицы. Так как МП всегда формирует адрес следующей команды по формуле A = (cs)×16+(ip), то нетрудно видеть, что после сброса МП всегда стартует с адреса A = ffff0h+0000h = ffff0h.
READY – вход готовности. При обращении к памяти или порту внешнего устройства МП всегда выполняет так называемый цикл шины. Этот цикл состоит из четырех тактов (Т1, Т2, Т3 и Т4). Вначале такта Т4 происходит обмен информацией между МП и ОП или ВУ. Однако если в системе стоит медленная память, она может к этому моменту оказаться не готовой к обмену. В этом случае внешние схемы должны сформировать нулевой сигнал на входе READY, означающий, что устройство к обмену не готово. В такте Т3 МП проверяет вход READY и, если на нем единица, переходит к такту Т4. В противном случае МП вводит между тактами Т3 и Т4 такты ожидания. В каждом такте ожидания МП опрашивает вход READY и так до тех пор, пока на READY не появится единица.
TEST – МП проверяет сигнал на входе TEST, только когда он выполняет команду wait. Если при этом на входе TEST стоит ноль, МП переходит к следующей команде. В противном случае МП вводит «холостые» такты и через каждые пять тактов снова опрашивает вход TEST. Обычно этот вход используется при стандартном подключении арифметического сопроцессора К1810ВМ87 (i8087).
MN/MX (minimum/maximum) – если на этот вход «запаяна» единица, МП работает в минимальном режиме, если ноль – в максимальном.
HOLD – захват. В минимальном режиме это вход. Если на этот вход приходит единица, то МП прекращает выполнение текущей команды и отключается от шин. После этого МП находится в состоянии «спячки» до тех пор, пока на HOLD не появится ноль. Сигнал на вход HOLD формирует контроллер прямого доступа к памяти.
HLDA (hold acknowledge) – подтверждение захвата. В минимальном режиме это выход. Этот сигнал обычно заводится на контроллер прямого доступа к памяти и сообщает последнему, что он может брать управление системной шиной на себя.
A/D 15-0 (address/data) – 16-разрядная мультиплексная шина адрес/данные. По этим линиям передается как адрес, так и данные, но в разные моменты времени. На эти линии МП выставляет 16 младших разрядов адреса при обращении к ОП и весь адрес при обращении к порту ВУ. Адрес на эти линии выставляется в такте Т1 в сопровождении стробирующего сигнала на выходе ALE. В такте Т2 адрес снимается, и далее по этим линиям происходит передача данных в сопровождении сигнала на выходе DEN. Поскольку адрес необходим нам до конца цикла шины (до такта Т4), его приходится запоминать во внешнем регистре. Кроме того, для правильной работы системы шину адрес/данные демультиплексируют, т.е. разделяют на шину адреса (ША) и шину данных (ШД), как показано на рис. 2.2. Здесь ШФ – шинные формирователи.
Рис. 2.2
А16 – А19 – при обращении к ОП на эти линии МП выставляет старшие четыре разряда адреса. В такте Т2 адрес с этих линий снимается (т.е. его также надо запоминать во внешнем регистре), и на эти линии МП выставляет сигналы состояния S3 – S6 (state). Последние обычно используются только при отладке системы.
BHE (bus high enable) – разрешение старшей половины шины данных. МП может производить обмен по ШД как словами (2 байта), так и отдельными байтами. В последнем случае байт может передаваться по старшей или по младшей половине ШД. Для решения этой проблемы и предназначен сигнал BHE. Если на BHE стоит ноль, то в данном цикле шины по старшей половине ШД будут передаваться данные. Совместно с сигналом на линии А0 сигнал BHE задает формат передачи информации по шине данных (табл. 2.1). В такте Т2 сигнал BHE снимается и, следовательно, его надо запоминать во внешнем регистре. Далее на эту линию выставляется зарезервированный фирмой сигнал состояния S7.
Таблица 2.1
BHE |
A0 |
Формат передачи |
0 |
0 |
Слово (по D15-0) |
0 |
1 |
Байт по старшей половине ШД (D15-8) |
1 |
0 |
Байт по младшей половине ШД (D7-0) |
1 |
1 |
Нет передачи по ШД |
RD (read) – чтение. Сигнал вырабатывается, когда МП выполняет операцию считывания информации из ОП или порта ВУ.
WR (write) – запись. Сигнал вырабатывается, когда МП выполняет операцию записи информации в ОП или порт ВУ.
M/IO (memory/input-output) – память/ВУ. Если МП обращается к ОП, на этот выход выставляется единица, если к ВУ – ноль. Данный сигнал позволяет разделить адресное пространство портов и адресное пространство памяти.
Сигналы RD, WR и M/IO подаются на внешние логические схемы, которые формируют системные управляющие сигналы MR («читаю память»), MW («пишу в память»), IOR («читаю порт») и IOW (« пишу в порт»).
DT/R (data transmit/receive – отправка/получение информации) – сигнал, дублирующий пару сигналов RD и WR. Если на выходе DT/R стоит единица, МП выдает информацию, если ноль – принимает. Сигнал используется для управления шинными формирователями, стоящими на ШД, задавая направление передачи информации, он более удобен для этой цели чем RD и WR, поскольку имеет большую длительность.
DEN (data enable – информация доступна) – сигнал, стробирующий передачу информации по ШД.
ALE (address latch enable – разрешено защелкнуть адрес) – сигнал, стробирующий выдачу адреса.
2.3. Назначение входов/выходов ВМ86 в максимальном режиме
В максимальном режиме МП не вырабатывает сигналы WR, M/IO, DT/R, DEN, INTA и ALE. Вместо них он вырабатывает соответственно сигналы LOCK, ST2, ST1, ST0, QS1 и QS0. Кроме того, вход HOLD и выход HLDA становятся двунаправленными линиями, соответственно, RQ/GT0 и RQ/GT1.
LOCK – выход блокировки. Активный сигнал на этом выходе вырабатывается, если МП выполняет команду, перед которой программист поставил префикс lock. Этот префикс означает, что программист не хочет, что бы какое-либо событие прерывало выполнение данной команды. К таковым событиям относится, например, отключение МП от системной шины при прямом доступе к памяти или при захвате системной шины микропроцессором с более высоким приоритетом. В последнем случае сигнал с выхода LOCK должен быть заведен на внешние схемы арбитража, которые и обеспечивают удержание шины до конца блокированной команды. В минимальном режиме префикс lock блокирует восприятие запроса на входе HOLD.
S2, S1, S0 – сигналы состояния. Как уже говорилось выше, в максимальном режиме МП не вырабатывает ряд управляющих сигналов. В то же время эти сигналы необходимы системе для правильного функционирования. Поэтому в максимальном режиме в систему всегда вводится специальная микросхема системного контроллера К1810ВГ88 (i8288), которая и формирует недостающие сигналы. Сигналы на выходах S2-S0 характеризуют цикл шины, который в данный момент выполняет МП (табл. 2.2). Эти сигналы подаются на системный контроллер, и именно на основании этих сигналов последний формирует необходимые на данный момент системные управляющие сигналы.
Таблица 2.2
S2 |
S1 |
S0 |
Цикл шины |
0 |
0 |
0 |
Цикл подтверждения прерывания |
0 |
0 |
1 |
Цикл чтения из порта ВУ |
0 |
1 |
0 |
Цикл записи в порт ВУ |
0 |
1 |
1 |
Цикл останова (процессор выполняет команду hlt) |
1 |
0 |
0 |
Цикл выборки команды из ОП |
1 |
0 |
1 |
Цикл чтения из ОП |
1 |
1 |
0 |
Цикл записи в ОП |
1 |
1 |
1 |
Нет цикла шины |
RQ/GT0 и RQ/GT1 (request/grant-запрос/предоставление шины) – двунаправленные линии. Каждая из этих линий заменяет собой пару линий (HOLD, HLDA) минимального режима. Обычно используются при стандартном подключении арифметического сопроцессора и при организации прямого доступа к памяти. Если устройству, подключенному к линии RQ/GT, требуется системная шина, оно выставляет сигнал на эту линию.
Получив этот сигнал, МП прекращает выполнение текущей команды (если перед ней не стоит префикс lock), отключается от шин и подтверждает захват, выставляя сигнал на ту же линию RQ/GT. Когда устройство освобождает системную шину, оно формирует еще один сигнал на этой же линии, подключая тем самым МП к системной шине. Отличие RQ/GT0 от RQ/GT1 заключается в том, что последняя линия имеет более низкий приоритет. То есть при одновременном приходе запросов на обеих линиях, будет обслужен запрос на линии RQ/GT0.
QS1, QS2 (queue state) – сигналы на этих линиях характеризуют состояние очереди команд МП. Эти две линии используются при стандартном подключении арифметического сопроцессора ВМ87, который анализирует состояние очереди, отслеживая момент начала выполнения «своей» команды.
2.4. Внутренняя архитектура МП ВМ86
МП ВМ86 состоит из двух основных блоков:
- операционного устройства (ОУ);
- устройства шинного интерфейса (УШИ).
ОУ включает в себя восемь регистров общего назначения, регистр флагов, шестнадцатиразрядное АЛУ и микропрограммное УУ. Задачей ОУ является выполнение заданных в команде операций. УШИ содержит блок сегментных регистров, указатель команд (программный счетчик), сумматор адресов, очередь команд и буферы, обеспечивающие связь с шиной. УШИ обеспечивает обмен информацией между МП и ОП или портами ВУ. То есть УШИ выполняет циклы шины.
Оба этих устройства могут работать параллельно. Такая структура МП позволяет организовать так называемый конвейер команд. В процессе выполнения любой команды всегда имеется промежуток времени, при котором системная шина оказывается свободна. Длительность этого промежутка зависит от сложности команды. Обычно, чем сложнее команда, тем длиннее данный промежуток. ШИ использует эти промежутки для опережающей выборки команд из памяти. Пока одна команда выполняется, другие команды считываются из памяти, поэтому к моменту начала выполнения команды она уже находится внутри МП и не надо тратить время на ее выборку из ОП. Конвейер команд позволяет повысить общее быстродействие системы. В МП ВМ86 реализован простой 2-ступенчатый конвейер. В современных МП число ступеней конвейера значительно больше (одна команда выполняется, другая выбирается из ОП, третья дешифрируется, для четвертой формируется адрес операнда и т.д.).
Выбранные с опережением из ОП команды надо хранить в МП. С этой целью в состав МП введена очередь команд, представляющая из себя стек, реализующий процедуру FIFO и имеющий глубину шесть байт. Машинные команды МП ВМ86 занимают от одного до шести байтов (без учета префиксов). В очереди может одновременно находиться от одной до шести команд. Очередь хорошо заполняется, когда МП выполняет сложные команды (умножение, деление), и может оставаться наполовину пустой при выполнении последовательности простых команд.
Если процессор выполняет команду перехода (jmp, call и т.д.), то информация в очереди оказывается ненужной. Поэтому в этом случае МП автоматически очищает очередь команд и начинает заполнять ее заново.
2.5. Сегментация памяти
Как уже отмечалось выше, МП 8086 имеет 20 адресных линий, т.е. может адресовать ОП объемом 1 Мбайт. Эта память логическим образом разбивается на сегменты, объемом 64 Кбайт каждый, которые могут располагаться практически в любом месте памяти. Одновременно МП может работать с четырьмя такими сегментами. Они называются:
- сегмент кода, в котором располагается программа, выполняемая МП;
- сегмент стека, в котором организуется стек;
- сегмент данных, в котором располагаются данные;
- дополнительный сегмент, обычно используемый как дополнительный сегмент данных.
Каждому из этих сегментов ставится в соответствие находящийся внутри МП 16-разрядный сегментный регистр. Сегментный регистр cs соответствует сегменту кода, ss – сегменту стека, ds – сегменту данных и es – дополнительному сегменту.
Содержимое сегментного регистра задает начальный (базовый) адрес соответствующего сегмента в ОП. Однако сегментный регистр 16 разрядный, а адрес ОП должен быть 20-разрядным. Чтобы из шестнадцати разрядов получить двадцать, содержимое сегментного регистра при формировании адреса ОП сдвигают на 4 разряда влево (умножают на 16). Например, пусть cs = 2231h, тогда начальный адрес сегмента кода равен 22310h. Можно сделать вывод, что начальный адрес любого сегмента всегда кратен шестнадцати. Это единственное ограничение на расположение сегментов в памяти. Других ограничений не существует, то есть сегменты могут быть полностью независимы друг от друга, а могут частично и даже полностью перекрываться.
При выполнении команды, если в ней требуется обращение к памяти, МП формирует по адресному коду, заданному в команде, так называемый эффективный адрес (Аэф). Например, пусть
ds = 2200h, bx = 1000h, si = 0770h
и выполняется команда: mov ax,[bx+si+2], тогда
Аэф = (bx)+(si)+2 = 1000h+0770h+2 = 1772h.
Сформированный Аэф рассматривается как внутрисегментное смещение, поэтому далее МП формирует физический адрес (Аф) по следующей формуле:
Аф = (сегментный регистр)×16+Аэф.
Аф и является адресом ячейки ОП, к которой обращается МП. Для нашего примера (по умолчанию здесь в качестве сегментного регистра берется сегментный регистр ds):
Аф = (ds)×16+Аэф = 22000h+1772h = 23772h.
В процессе формирования Аэф возможно возникновение переноса из старшего разряда. При этом данный перенос попросту отбрасывается. Таким образом, после Аэф = ffffh идет Аэф = 0000h. Иначе говоря, достигнув конца сегмента, автоматически переходим на его начало. Это кольцевая организация сегмента. Существует только один способ выйти за пределы текущего сегмента – сменить содержимое соответствующего сегментного регистра.
В процессе формирования Аф возможно возникновение переноса из старшего разряда. Как и в предыдущем случае, этот перенос попросту отбрасывается, Получается кольцевая организация памяти. Иначе говоря, никаким способом невозможно сформировать адрес за пределами 1 Мбайта.
2.6. Программная модель МП ВМ86
Программная модель ВМ86 представлена на рис. 2.3. Все регистры ВМ86 можно разбить на группы. Первую группу составляют регистры общего назначения (РОН), к которым относятся регистры ax, bx, cx и dx. Любой из этих регистров можно рассматривать и как один шестнадцатиразрядный, и как пару восьмиразрядных регистров. Основное назначение РОН – временное хранение информации, однако на каждый из этих регистров в ВМ86 возлагается и ряд специальных функций.
15 8 |
7 0 |
15 0 |
||
ax |
ah |
al |
f |
|
cx |
ch |
cl |
ip |
|
dx |
dh |
dl |
||
bx |
bh |
bl |
||
sp |
cs |
|||
bp |
ds |
|||
si |
||||
di |
es |
Рис. 2.3
В регистре ax – в нем формируется результат (или его часть) в командах умножения и деления. Кроме того, обмен информацией между МП и портами ВУ можно проводить только через регистры ax и al. То есть допустимы команды
out 20h,al и in ax,70h
и недопустимы
out 20h,ah и in bx,70h.
Регистр bx ‑ первый базовый регистр процессора. Это единственный регистр из группы РОН, который можно использовать для косвенной и базовой адресации. То есть допустимы команды
mov al,[bx] и add [bx +7],dx
и недопустимы
mov al,[ax] и add [bh +7],dx.
Если для адресации используется регистр bx, то, по умолчанию, в качестве сегментного регистра берется регистр ds.
Регистр cx используется в качестве счетчика в команде цикла loop и командах, перед которыми поставлен префикс повторения rep. То есть цикл или команда с префиксом будет повторяться до тех пор, пока сх не обнулится (естественно, после каждого прохода содержимое сх автоматически уменьшается). Кроме того, регистр cl используется в командах сдвига для задания числа сдвигов.
Регистр dx – это единственный регистр МП, который можно использовать для косвенной адресации портов ВУ. То есть, допустимы команды out [dx],ax и in al,[dx].
Регистры bp, sp, si и di составляют группу регистров-указателей. Основное их назначение – участвовать в формировании Аэф. Однако если для этой цели они не нужны, их можно использовать в качестве РОН. Регистры этой группы могут быть только шестнадцатиразрядными.
Регистр bp ‑ второй базовый регистр процессора. Если для адресации используется регистр bp, то, по умолчанию, в качестве сегментного берется регистр ss. Таким образом, использование для адресации регистра bp позволяет обращаться к области стека, как к обычной памяти.
Регистры si и di – индексные регистры процессора. Используются для косвенной и базово-индексной адресации. Необходимо соблюдать следующее правило: в любой команде для адресации можно использовать только один базовый и только один индексный регистр. То есть, допустимы команды sub [di],7 и mov cx,[bp + si +7] и недопустимы mov [bx+bp],al и mov dh,[si + di].
Регистр sp – указатель стека. Использовать его в качестве РОН не рекомендуется.
Регистр ip не относится ни к какой группе и называется указателем команд. По своей сути – это программный счетчик. В нем всегда формируется смещение в кодовом сегменте и ip всегда задает адрес следующей команды программы. Сменить содержимое ip можно только командами перехода, т.е. командами jmp, call, ret и др.
Регистры cs, ss, ds и es составляют группу сегментных регистров. Регистр cs всегда используется вместе с регист-ром ip при формировании адреса следующей команды программы. Данный адрес формируется следующим образом: Аф = (cs)×16+(ip). То есть содержимое cs задает начальный адрес сегмента кода.
Сегментный регистр ss задает начальный адрес сегмента стека и всегда используется вместе с регистром sp для формирования Аф при обращении к стеку:
Аф = (ss)×16+(sp).
Содержимое сегментного регистра ds задает начальный адрес сегмента данных. В командах, оперирующих с данными, при формировании физического адреса ОП в качестве сегментного регистра по умолчанию (кроме случая, когда в качестве базового используется регистр bp) берется ds. Однако при этом мы всегда имеем возможность сменить сегмент, прямо указав сегментный регистр, который должен использоваться для формирования Аф, с помощью префикса замены сегмента. Например:
mov [bx],ax
Аф = (ds)×16+(bx);
mov ss:[bx],ax
Аф = (ss)×16+(bx).
Содержимое сегментного регистра es задает начальный адрес дополнительного сегмента. По умолчанию этот регистр используется только при формировании физического адреса приемника в строковых командах. В остальных случаях использование es задается с помощью префикса замены сегмента. В табл. 2.3 показаны все возможные случаи формирования Аф и компоненты, принимающие участие в этом процессе.
Таблица 2.3
Вид операции |
Сегментный регистр по умолчанию |
Возможность смены сегментного регистра с помощью префикса |
Внутри-сегментное смещениие |
Выборка команды |
cs |
нет |
ip |
Стековая операция |
ss |
нет |
Sp |
Обращение к памяти (кроме bp в качестве базового регистра) |
ds |
cs, ss, es |
Аэф |
Обращение к памяти при bp в качестве базового регистра |
ss |
cs, ds, es |
Аэф |
Источник в строковой команде |
ds |
cs, ss, es |
Si |
Приемник в строковой команде |
es |
нет |
Di |
Обращение к ВУ |
нет |
нет |
dx или прямая адресация |
Регистр f – регистр флагов. Его формат приведен на рис. 2.4. В этом регистре определены следующие флаги:
cf (carry) – флаг переноса. Этот флаг устанавливается в единицу, если в процессе операции возникает перенос из старшего разряда (или был заем в старший разряд при вычитании). С этим флагом работают некоторые команды условных переходов. Программист может непосредственно влиять на значение этого флага, используя команды stc, clc и cmc (установить, сбросить, инвертировать).
15 |
12 |
11 |
0 |
||||||||||||
резерв |
of |
df |
if |
tf |
sf |
zf |
- |
af |
- |
pf |
- |
cf |
Рис. 2.4
pf (parity) – флаг четности. Устанавливается в единицу, если в младшем байте результата получилось четное число единиц. Флаг можно использовать для организации «контроля по четности», с ним работают некоторые команды условных переходов.
af (adjust) – флаг межтетрадного переноса. Устанавливается в единицу, если в процессе операции возникает перенос из 3-го бита в 4-й (или при займе из 4-го бита при вычитании). С флагом работают команды коррекции для двоично-десятичной (BCD) арифметики.
zf (zero) – флаг нулевого результата. Устанавливается в единицу, если результат операции оказался равен нулю. С флагом работают некоторые команды условных переходов.
sf (sign)– флаг знака. Устанавливается в единицу, если в старшем разряде результата получилась единица, т.е. результат является отрицательным числом. С флагом работают некоторые команды условных переходов.
of (overflow) – флаг переполнения. Устанавливается в единицу, если в результате выполнения арифметической операции произошло переполнение разрядной сетки. С флагом работает команда into – «прерывание, если установлен флаг of», и команды переходов.
tf (trap) – флаг трассировки. Если этот флаг установлен в единицу, программа выполняется в «пошаговом режиме», так как после каждой команды МП автоматически генерирует прерывание типа 1. Таким образом, этот флаг используется для отладки. У программиста нет в распоряжении команд, влияющих на этот флаг. Поэтому изменить значение флага tf можно только косвенным образом, через стек. Например, следующий фрагмент программы сбрасывает tf в ноль:
pushf
mov bp,sp
and [bp],0feffh
popf
if (interrupt enable) – флаг разрешения внешних прерываний. Если этот флаг установлен в ноль, то МП игнорирует запросы на прерывание, приходящие на вход INTR. Для работы с этим флагом есть две команды:
sti - if ß 1 – разрешить внешние прерывания;
cli - if ß 0 – запретить внешние прерывания.
df (direction) – флаг направления, задает автоинкремент или автодекремент регистров si и di в строковых командах. Программист имеет возможность влиять на этот флаг с помощью команд std и cld.
2.7. Организация оперативной памяти
С точки зрения программиста оперативная память для ВМ86 представляет собой линейный массив ячеек форматом 1 байт каждая, с адресами от 00000h до fffffh (рис. 2.5). Информация, располагаемая в ОП, может иметь следующие форматы: байт; слово (2 байта); двойное слово (4 байта). При этом адресом слова или двойного слова считается адрес его младшего байта. Физически память для МП86 организуется иначе. Память реализуется в виде двух банков: старшего и младшего.
В младший банк входят все ячейки с четными адресами (00000h, 00002h, ..., ffffeh), в старший – все ячейки с нечетными адресами (00001h, 00003h, …. ,fffffh). Обращение к банкам определяется комбинацией сигналов на выходах BHE и A0 МП. Подключение банков к шине данных показано на рис. 2.6.
байт |
|
00000h |
|
00001h |
|
00002h |
|
. . . |
|
ffffeh |
|
fffffh |
Рис. 2.5
Рис. 2.6
Банк подключается к ШД, когда на его вход CS приходит активный (нулевой) сигнал. При этом младший банк подключается к младшей половине ШД, а старший – к старшей половине ШД. Такая организация позволяет производить обмен между МП и ОП как по всей ШД, так и по отдельным ее половинам. Эта архитектура приводит к следующему правилу: слова желательно располагать в памяти по четным адресам. Если слово располагается в ОП по четному адресу, то оно будет передаваться по ШД за один цикл шины, если же по нечетному – за два цикла шины. По той же причине двойные слова также желательно располагать по четным адресам.
2.8. Организация адресного пространства портов ВУ
Существует два основных способа организации адресного пространства портов ВУ.
1. Раздельная организация адресных пространств ОП и портов ВУ. К портам обращаются командами in и out, а к ОП – остальными командами. Соответственно МП выстав-ляет единицу на выходе M/IO, если он обращается к ОП, и ноль, если он обращается к порту. Таким образом, сигнал на выходе M/IO позволяет различить ячейку памяти и порт, даже если они имеют одинаковые системные адреса.
В командах in и out можно использовать два типа адресации: прямую и косвенную. При прямой адресации адрес порта указывается в команде непосредственно (например, in al,60h) и имеет размер 1 байт. Таким спосо-бом можем задать 256 различных адресов портов. Учитывая, что МП вырабатывает сигналы RD и WR, можем считать, что при прямой адресации в системе можно использовать 512 портов, половина из которых работает на ввод информации, а другая половина – на вывод.
При косвенной адресации адрес порта берется из регистра dx (например, out [dx],al). Поскольку данный регистр шестнадцатиразрядный, то, исходя из тех же соображений, в систему максимально можно поставить 128К портов, половина из которых работает на ввод, а другая половина – на вывод.
2. Отображение адресного пространства портов на адресное пространство памяти. При таком способе порты рассматриваются как ячейки ОП. Обращение к таким портам производится командами обращения к памяти, а не командами in и out. Сигнал на выходе M/IO при обращении к таким портам будет равен единице. Следовательно, такие порты и ячейки памяти не могут иметь одинаковые адреса. Такой способ позволяет наращивать число портов вплоть до 1 Мбайта за счет уменьшения объема ОП. Этот способ на практике применения не находит, его применяют в сочетании с первым способом.
2.9. Методы обмена информацией между МП и портами ВУ
Одна из основных проблем при обмене информацией между МП и ВУ заключается в том, что ВУ, как правило, работают значительно медленнее МП.
Прямой обмен. МП обращается к порту ВУ командой in или out и через определенный промежуток времени осуществляет обмен. Так как при этом он не выясняет, готово ВУ к обмену или нет, велика вероятность потери информации или неправильной ее передачи. Такой способ применяется при работе с ВУ, которые «всегда готовы к обмену». Например, так можно прочитать состояние переключателей конфигурации в IBM PC или вывести информацию на светодиоды. Инициатором обмена здесь является МП, он же и управляет обменом по СШ.
Обмен по опросу готовности. При этом способе ВУ подключается к ШД через два порта. Один из них предназначен для передачи данных, а другой порт хранит информацию, характеризующую текущее состояние ВУ. Один из битов этого порта показывает, готово ВУ к обмену или нет. Перед обменом МП читает порт состояния и анализирует бит готовности. Если выясняется, что ВУ к обмену не готово, МП снова читает порт состояния и снова анализирует готовность ВУ к обмену. И так до тех пор, пока ВУ не станет готово к обмену. Только после этого будет произведен обмен. Недостаток такого способа очевиден – МП, проверяя готовность ВУ к обмену, не выполняет никакой полезной работы. Поэтому этот способ применяется при обмене с быстродействующими ВУ, например ЦАП и АЦП. Инициатором обмена здесь является процессор, и обмен идет под его управлением.
Обмен по запросам на прерывание. ВУ, будучи готово к обмену, выставляет на МП запрос на прерывание. Получив этот запрос, МП прерывает выполнение текущей программы и переходит на подпрограмму обслуживания данного запроса, т.е. производит обмен. Такой способ применяется для медленных ВУ, например для клавиатуры. Инициатором обмена здесь является ВУ, но сам обмен, как и ранее, идет под управлением МП.
Прямой доступ к памяти. Это специфический вид обмена, когда передача информации ведется между ОП и быстродействующим ВУ, минуя МП. Последний в обмене участия не принимает, более того, он отключен от СШ и как бы находится в «спячке». Поскольку обменом нужно управлять, в состав системы вводится контроллер прямого доступа к памяти (КПДП), который и вырабатывает необходимые управляющие сигналы и адреса ОП.
2.10. Параллельный программируемый адаптер К1810ВВ55 (i8255)
Эта микросхема наиболее часто используется для организации параллельных портов ввода-вывода в системах, построенных на базе МП фирмы Intel.
Схема подключения адаптера к СШ представлена на рис. 2.7. Рассмотрим назначение входов/выходов адаптера.
Рис. 2.7
CS (chip select – выбор кристалла). На этом входе через схему селектора (дешифратора) формируется активный (нулевой) сигнал, когда МП выставляет на ША адрес одного из внутренних регистров адаптера. Сложность схемы селектора зависит от организации системы. В простых системах с малым числом портов селектор может отсутствовать. Активный сигнал на CS подключает адаптер к ШД. С точки зрения программиста внутри адаптера имеются четыре адресуемых устройства: порт A (PA), порт B (PB), порт С (РС) и регистр управляющего слова (РУС). К какому из четырех внутренних устройств обращается МП, когда на CS приходит активный сигнал, определяет информация на входах А1 и А0 (табл. 2.4).
Таблица 2.4
A1 |
A0 |
Адресуемое устройство |
0 |
0 |
PA |
0 |
1 |
PB |
1 |
0 |
PC |
1 |
1 |
РУС |
D 7-0 – восьмиразрядная шина данных. По ней производится обмен информацией, в том числе и управляющей, между МП и внутренними устройствами адаптера.
Вход RD – чтение. Задает вид операции. На этот вход заводится системный управляющий сигнал IOR.
Вход WR – запись. На этот вход заводится системный управляющий сигнал IOW.
RESET – сброс. По этому сигналу все порты адаптера настраиваются на ввод в режиме 0. Как правило, этот вход на практике не используется.
РА – восьмиразрядный порт, который может быть настроен на ввод или на вывод в одном из трех режимов: режиме 0, режиме 1 или режиме 2.
РВ – восьмиразрядный порт, который может быть настроен на ввод или на вывод в одном из двух режимов: режиме 0 или режиме1.
РС – восьмиразрядный порт, который можно настроить на ввод или на вывод в режиме 0. В отличие от РА и РВ порт С разбит на две половины: старшую (PC7-4) и младшую (PC3-0), каждую из которых можно независимо настроить на ввод или на вывод.
Режимы 1 и 2 на практике используются редко, поэтому здесь ограничимся рассмотрением режима 0.
Пусть, например, порт А настроен на ввод в режиме 0. Когда МП обращается к этому порту командой in al, port_A, то информация с внешних линий РА попадает на ШД. В этом случае порт работает как коммутатор и передаваемая информация внутри адаптера не фиксируется.
Пусть РА настроен на вывод в режиме 0. По команде out port_A, al информация с ШД поступит в РА и там защелкнется. Естественно, что эта информация появится при этом и на внешних линиях РА.
Перед началом работы все порты адаптера должны быть настроены. Для этого достаточно передать в РУС настроечное слово, формат которого приведен на рис. 2.8.
Рис. 2.8
Здесь D7 = 1. Эта единица и означает, что передается настроечное слово. При D7 = 0 передается специальная команда, которая здесь рассматриваться не будет.
D6, D5 – определяют режим работы РА: 00 – режим 0; 01 – режим 1; 10 – режим 2; 11 – тоже режим 2.
D4 = 1 – РА настраивается на ввод, D4 = 0 – РА настраивается на вывод.
D3 = 1 –старшая часть РС (линии РС 7-4) настраивается на ввод, D3 = 0 – старшая часть РС настраивается на вывод.
D2 = 1 – РВ настраивается на режим 1, D2 = 0 – РВ настраивается на режим 0.
D1 = 1 – РВ настраивается на ввод, D1 = 0 – РВ настраивается на вывод.
D0 = 1 – младшая часть РС (РС 3-0) настраивается на вывод, D0 = 0 – младшая часть РС настраивается на ввод.
В IBM PC/XT стоит микросхема ВВ55. При этом ее портам присвоены следующие системные адреса:
PA = 60h; PB = 61h; PC = 62h; РУС = 63h.
При начальном старте XT выполняет две команды: mov al, 99h и out 63h, al, т.е. в РУС загружается двоичное число 10011001. Таким образом, все порты настраиваются на работу в режиме 0, РА и обе половины РС на ввод, а РВ на вывод. Начиная с IBM PC/AT, микросхема ВВ55 в системе отсутствует, но порты 60h и 61h существуют и выполняют те же функции.
2.11. Пример использования и программирования адаптера
Пусть в системе имеются принтер и фотосчитыватель. Подключение их к системной шине через порты адаптера ВВ55 показано на рис. 2.9.
Рис. 2.9
В соответствии с этой схемой произведем настройку портов адаптера (системные адреса внутренних устройств адаптера будем считать совпадающими с IBM PC/XT):
mov al,83h out 63h,al |
; все порты на режим 0, РА – на вывод, ; РВ – на ввод, старшая часть РС – на ; вывод, младшая – на ввод. |
mov al,0 |
;обнуляем разряды РС 7-4. |
out 62h,al |
Пусть необходимо принять байт информации с фотосчитывателя. Обмен будем производить методом опроса готовности.
Когда фотосчитыватель готов к выдаче очередного байта, он выставляет сигнал READY2. МП считывает этот байт через РВ и формирует (программным образом) положительный импульс на линии STB2, получив который фотосчитыватель снимает текущий байт и начинает готовить следующий.
m1: in al,62h and al,8 jz m1 |
; проверка готовности ;фотосчитывателя к выдаче ;очередного байта. ; читаем РС ; бит 3 равен единице ? ; если нет – переход на m1 |
in al,61h mov [200h],al |
; читаем байт с фотосчитывателя и ; заносим в память, например, по ; адресу ds:200h ; читаем РВ и заносим считанный ; байт в ОП |
mov al, 10h out 62h,al mov al,0 out 62h,al |
; формируем импульс на линии PC4 ; выставляем единицу на РС4 ; выставляем ноль на РС4 |
Аналогично осуществляется вывод байта информации на принтер:
m2: in al,62h and al,4 jz m2 |
; проверяем READY1 |
mov al,ah out 60h,al |
;выводим на принтер байт ;информации ; например, из регистра ah |
mov al, 40h out 62h,al mov al,0 out 62h,al |
; формируем STB1 |
2.12. Программируемый таймер К1810ВИ54 (i8254)
Данная микросхема широко применяется в системах на основе МП фирмы Intel для организации временных задержек, организации службы системного времени и т.д.
Таймер содержит три независимых канала, соответственно канал 0, канал 1 и канал 2. Внутри каждого канала стоит шестнадцатиразрядный счетчик, работающий на вычитание. Счетчик можно программным образом настроить на счет в двоичной или двоично-десятичной системе счисления. Любой канал таймера можно запрограммировать на работу в одном из шести режимов, соответственно режим 0, режим 1, ..., режим 5.
При программировании канала в его регистр управляющего слова (РУС) передается настроечное слово (байт). Хотя у каждого канала свой РУС, все они имеют один системный адрес, и поэтому, с точки зрения программиста, внутри таймера один РУС. Таймер определяет, какому каналу предназначено настроечное слово по внутреннему содержимому этого слова.
Схема подключения таймера к СШ приведена на рис. 2.10.
Рис. 2.10
Информация на линиях А1 и А0 задает одно из четырех адресуемых устройства внутри таймера:
А1 = 0, А0 = 0 – канал 0; А1 = 0, А0 = 1 – канал 1;
А1 = 1, А0 = 0 – канал 2; А1 = 1, А0 = 1 – РУС.
CLK ‑ вход синхроимпульсов. На этот вход поступают импульсы, которые считает канал. Декремент счетчика происходит по заднему фронту импульсов на входе CLK.
GATE – управляющий вход. Если на этом входе единица, счетчик канала считает импульсы, приходящие на CLK, если ноль – не считает. В некоторых режимах снятие и подача единицы на входе GATE инициирует перезапуск счетчика.
OUT – выход канала. Вид сигнала на этом выходе зависит от режима, на который настроен канал.
Остальные входы/выходы таймера аналогичны одноименным входам/выходам адаптера ВВ55 (см. разд. 2.10). Формат настроечного слова канала приведен на рис. 2.11.
Рис. 2.11
Разряды D7, D6 задают номер канала, в который передается настроечное слово: D7 = 0, D6 = 0 – канал 0; D7 = 0, D6 = 1 – канал 1; D7 = 1, D6 = 0 – канал 2; D7 = 1, D6 = 1 – специальная команда (на практике используется редко).
Таймер связан с СШ восьмиразрядной шиной данных. В то же время формат счетчика канала – два байта. Поэтому имеются различные варианты загрузки счетчика и чтения его содержимого. Эти варианты задают разряды D5 и D4 настроечного слова:
D5 = 0, D4 = 0 – специальный режим «чтение на лету»;
D5 = 0, D4 = 1 – передается только старший байт;
D5 = 1, D4 = 0 – передается только младший байт;
D5 = 1, D4 = 1 – передаются оба байта (за две передачи, сначала младший, а потом старший).
Прочитать содержимое счетчика канала можно двумя способами. Первый способ требует остановки счета, для чего надо либо прекратить подачу импульсов на вход CLK, либо снять единицу со входа GATE. Второй способ не требует остановки счета и называется «чтение на лету». В этом случае в настроенный, работающий канал надо передать еще одно настроечное слово (рис. 2.12).
Рис. 2.12
Здесь, как и ранее, D7 и D6 задают номер канала, а звездочки означают безразличное значение. Получив такой приказ, канал автоматически фиксирует текущее значение счетчика в буфере, откуда его затем можно считать за одну или две передачи. Разряды D3 – D1 (см. рис. 2.11) задают режим, в котором будет работать канал (соответственно 000 – режим 0, …, 101 – режим 5). Разряд D0 задает систему счисления, в которой будет работать канал. При D0 = 0 задается двоичная, а при D0 = 1 – десятичная система счисления.
Приведем названия режимов и рассмотрим их смысл.
2.12.1. Режим 0 ‑ программируемая задержка.
После загрузки управляющего слова в регистр режима канала на выходе ОUT устанавливается напряжение низкого уровня; загрузка счетчика не изменяет это состояние. Затем, если GATE = 1, начинается декремент счетчика (последовательное вычитание из него единицы). В момент, когда счетчик обнулится, на выходе OUT устанавливается напряжение высокого уровня. Высокий уровень напряжения на выходе OUT сохраняется до загрузки счетчика новым значением. Счет разрешен только при наличии сигнала высокого уровня на входе GATE. Низкий уровень этого сигнала или ниспадающий фронт запрещают счет.
Счет будет продолжен при условии восстановления уровня логической 1 на входе GATE. Перезагрузка счетчика в процессе счета приводит к следующему: загрузка младшего байта останавливает текущий счет, загрузка старшего байта запускает новый цикл счета. Минимально допустимое значение счетчика равно 2.
Режим 1 ‑ программируемый одновибратор. На выходе счетчика формируется отрицательный импульс длительностью t = N×T, где N ‑ число, загруженное в счетчик, T ‑ период тактовых импульсов. Низкий уровень (логический 0) на выходе OUT устанавливается со следующего такта после подачи на вход GATE сигнала высокого уровня ("счет разрешен"). Загрузка в счетчик нового числа не влияет на длительность текущего импульса, а учитывается при следующем запуске. Перезапуск счетчика производится нарастающим фронтом входа GATE (без перезагрузки счетчика). Минимальное допустимое значение N равно 1.
Режим 2 ‑ программируемый делитель (генератор) частоты. Таймера работает как делитель частоты F на N, где N ‑ число, загружаемое в счетчик. При этом из сигнала, поступающего на вход CLK микросхемы, на ее выходе OUT формируется сигнал с частотой F/N. Длительность уровня логической единицы для формируемого сигнала равна (N - 1)×T, а длительность уровня логического 0 равна T, где Т ‑ один период синхронизации счетчика по входу CLK. Каждый раз при достижении счетчиком единицы, на выходе OUT появляется отрицательный импульс длительностью один такт.
Если в процессе работы счетчика осуществить его перезагрузку, то текущий период не изменяется, а следующий будет соответствовать новому значению N. Вход GATE используется для аппаратной синхронизации. Так, по сигналу GATE, равному 0, на выходе OUT устанавливается сигнал 1, а с переходом сигнала GATE к значению 1 счет возобновляется с начального значения N.
Режим 3 ‑ программируемый генератор меандра. В этом режиме программируемый интервальный таймер выполняет функции программируемого генератора частоты со скважностью 2. Период выходного сигнала t = N×T, при этом длительность положительного и отрицательного полупериодов равна T×N/2, если N ‑ четное число. При нечетном N положительный период (на выходе OUT установлен сигнал логической 1) равен T×(N+1)/2, а отрицательный (на выходе OUT установлен сигнал логического 0) ‑ T×(N - 1)/2. Перезагрузка счетчика в процессе счета новой величиной не оказывает влияния на текущий период. Изменен будет следующий период выходного сигнала. Низкий уровень сигнала на входе GATE запрещает счет, на выходе OUT устанавливается сигнал высокого уровня. Высокий уровень GATE разрешает счет, а нарастание его запускает счетчик с начального состояния N. Генератор меандра не работает при загрузке в счетчик числа N = 3.
Режим 4 ‑ генератор одиночного импульса (счетчик событий). По окончании отсчета числа N, загруженного в счетчик, на выходе OUT формируется сигнал 0 с длительностью, равной периоду T, а затем сигнал переходит в исходное состояние OUT = 1. Для повтора цикла необходима перезагрузка счетчика. Перезагрузка счетчика возможна только программным способом. Под программной перезагрузкой понимается загрузка нового значения константы пересчета N в счетчик с шины данных. Загрузка младшего байта не оказывает влияния на текущий счет, а загрузка старшего байта запускает новый цикл счета. Вход GATE имеет то же назначение , что и в режиме 0: при GATE = 0 счет запрещен, при GATE = 1 счет разрешен. Указанный режим может быть использован для формирования одиночного импульса, вырабатываемого через определенную задержку после перезагрузки счетчика. Минимальное допустимое значение N = 1.
Режим 5 ‑ генератор одиночного импульса (счетчик событий) с аппаратным перезапуском. Работа таймера в режиме 5 по выходному сигналу аналогична работе в режиме 4, а по действию сигнала GATE ‑ режиму 1, в котором, как у одновибратора, запуск счета выполняется передним фронтом сигнала GATE. Если счет не завершен до конца, то по переднему фронту сигнала GATE счет начинается сначала. Счетчик является перезапускаемым. Возможна перезагрузка счетчика новой величиной N во время счета, что не влияет на длительность текущего цикла, а новая загруженная величина N будет обработана в следующем цикле счета.
В любой IBM ‑ подобной ПЭВМ стоит микросхема тай-мера ВИ53. При этом внутренним устройствам таймера присвоены следующие системные адреса:
- канал 0 – 40h;
- канал 1 – 41h;
- канал 2 – 42h;
- РУС ‑ 43h.
Канал 0 отведен для службы системного времени. На выходе этого канала формируются импульсы с частотой, примерно равной 18,2 Гц. Эти импульсы подаются на вход IR0 контроллера прерываний ВН59 и представляют собой запросы на прерывание от таймера.
Канал 1 используется для регенерации динамической памяти. Сигнал с выхода этого канала подается на вход DREQ0 контроллера прямого доступа к памяти ВТ37 и является запросом на прямой доступ к памяти.
Канал 2 предназначен для выработки звуковых сигналов. Его выход заведен на встроенный динамик. Выдачей выходного сигнала канала 2 на динамик управляют биты 1 и 0 порта 61h. Схема использования таймера в IBM - подобных ПЭВМ приведена на рис. 2.13.
Как видно из схемы, биты 1 и 0 порта 61h управляют выдачей частоты на динамик. Для настройки канала 2 надо выполнить две команды:
Рис. 2.13
mov al,0b6h ;канал 2 настраивается на предачу обоих ;байтов, на режим 3, на двоичный счет.
out 43h,al
Запретить и разрешить звучание можно командами:
in al,61h ; запретить звучание;
and al,0fch
out al,61h
in al,61h ; разрешить звучание.
or al,3
out 61h,al
2.13. Пример использования таймера
Пусть, например, при наличии в системе fопорной = 1 МГц нам надо получить fвыходную = 1 Гц. То есть нам надо разделить fопорную на 106. Поскольку один канал такой коэффициент пересчета обеспечить не может, придется использовать два канала, например, каналы 0 и 1. Схема их соединения приведена на рис. 2.14.
Рис. 2.14
Оба канала настраиваются на работу в режиме 3, на десятичный счет и в каждый из них загружается коэффициент пересчета, равный 103. Произведение этих двух коэффициентов и дает в результате 106. Далее приводится программа настройки и загрузки каналов. При этом считаем, что каналы и РУС имеют системные адреса, соответствующие IBM ПЭВМ.
Программа настройки и загрузки каналов:
mov al,37h out 43h,al |
; настраиваем канал 0 |
mov al,77h out 43h,al |
; настраиваем канал 1 |
mov al,0 out 40h,al mov al,10h out 40h,al |
; загружаем (за две передачи) ;коэффициент пересчета в канал 0 |
mov al,0 out 41h,al mov al,10h out 41h,al |
; загружаем (за две передачи) ;коэффициент пересчета в канал 1 |
2.14. Обработка прерываний
Под прерыванием понимается некоторое событие, заставляющее МП прервать выполнение текущей программы и перейти к подпрограмме обработки (обработчику) этого события. После того как обработчик завершает свою работу, МП возвращается к прерванной программе в ту точку, где она была прервана.
Все прерывания в системе можно разделить на внутренние и внешние. Внешние прерывания вызываются событиями, внешними по отношению к МП, а внутренние – событиями, происходящими внутри МП.
Конечно, обработка прерываний в МП различных типов имеет свои особенности, однако общая схема действий для любых МП остается одной и той же.
При обработке внутреннего прерывания МП «известна» его причина, а следовательно, известен источник запроса. Поэтому укрупненно, при внутреннем прерывании МП выполняет следующие действия:
- запоминает в стеке адрес возврата в прерываемую программу;
- определяет начальный адрес обработчика для известного источника запроса и передает управление этому обработчику;
- когда обработчик завершает свою работу, достает из стека адрес возврата, возвращая тем самым управление прерванной программе.
Внешние прерывания отличаются от внутренних тем, что МП неизвестен источник запроса. Следовательно, для внешнего прерывания в приведенную выше схему действий добавляется еще один этап: прежде чем определить начальный адрес обработчика, МП должен определить источник запроса.
Существуют два метода определения внешнего источника запроса ‑ метод опроса и векторные прерывания.
Метод опроса. Этот метод можно реализовать, например, следующим образом. В систему вводится специальный порт (или несколько портов, при большом числе внешних источников прерываний). Все внешние запросы заводятся на входы этого порта, причем для каждого запроса отводится один бит порта. Одновременно все запросы через схему ИЛИ заводятся на вход INTR МП. На рис. 2.15 приводится подобная схема для восьми внешних источников прерываний (IR7 – IR0).
Восприняв запрос на входе INTR, МП выполняет следующий фрагмент программы:
in al, port_int shl al, 1 jc obr7 shl al, 1 jc obr6 |
;читаем port_int ;сдвигаем содержимое al на один ;разряд влево ;если флаг cf установлен в единицу, ;это запрос по линии IR7, и переходим ;к обработчику этого прерывания ;сдвигаем al еще на разряд влево, если ;cf установлен, это запрос по IR6 и.т.д. |
Рис. 2.15
Возможна ситуация, когда МП получает сразу несколько запросов на прерывание от разных внешних источников. Чтобы МП мог в такой ситуации функционировать, всем источникам запросов присваиваются приоритеты. При одновременном поступлении нескольких запросов, обслужен будет запрос с наивысшим приоритетом. В примере старший приоритет будет у IR7, а младший ‑ у IR0. Чтобы изменить приоритеты на противоположные, достаточно использовать команду сдвига вправо.
Достоинством метода опроса являются небольшие аппаратурные затраты, а недостатком – медленная реакция МП на запросы с низким приоритетом.
Векторные прерывания. Под вектором прерывания обычно понимают начальный адрес обработчика данного прерывания. При данном методе в систему вводится специальная схема, называемая контроллером прерываний. Когда МП выставляет сигнал подтверждения прерывания, контроллер прерываний выдает МП вектор данного прерывания или информацию, позволяющую определить этот вектор. Более подробно векторные прерывания будут рассмотрены ниже при рассмотрении контроллера прерываний.
2.15. Система прерываний ВМ86
В МП ВМ86 каждому источнику запроса на прерывание ставится в соответствие тип (номер) прерывания. Тип имеет формат 1 байт. Всего возможно 256 различных источников запросов. Чтобы МП по известному типу мог определить начальный адрес обработчика, в ОП создается таблица векторов прерываний. Каждый вектор представ-ляет собой пару «сегмент/смещение» и однозначно задает начальный адрес обработчика прерывания данного типа. В ОП вектор занимает 4 байта. Таблица прерываний ВМ86 всегда располагается в младшем килобайте ОП. Ее формат приведен на рис. 2.16. На рис. 2.16 displ и disph – соответ-ственно младший и старший байты смещения, а segl и segh – младший и старший байты сегмента. Из рис. 2.16 видно, что для определения адреса вектора достаточно взять тип и умножить его на 4. Так вычисляет адрес вектора МП.
Действия МП при любом прерывании можно формально описать следующим образом:
sp ß (sp) - 2 Аф = (ss)×16 + (sp) Аф ß (f) sp ß (sp) - 2 Аф = (ss)×16 + (sp) Аф ß (cs) sp ß (sp) - 2 Аф = (ss)×16 + (sp) Аф ß (ip) Аф = тип × 4 ip ß (Аф) Аф = тип × 4 + 2 cs ß (Аф) |
Рис. 2.16
Так как таблица прерываний располагается по младшим адресам ОП, то никакие сегментные регистры в формирова-нии адреса вектора участия не принимают. Помимо рассмотренных выше пунктов, МП также сбрасывает в ноль флаги if и tf, маскируя внешние прерывания и запрещая пошаговое выполнение обработчика.
Источники запросов для ВМ86 показаны в табл. 2.5. Рассмотрим кратко имеющиеся виды прерываний.
Прерывание по ошибке деления (divided overflow). Это прерывание возникает при выполнении команд деления div и idiv, если формат результата (частного) превышает формат регистра-приемника. То есть, с точки зрения МП, результат деления равен бесконечности. В частности, такая ситуация возникает при попытке деления на ноль.
Таблица 2.5
Источник запроса (вид прерывания) |
Тип |
Приоритет |
Прерывание по ошибке деления |
0 |
1 |
Прерывание по флагу tf |
1 |
4 |
Прерывание по входу NMI |
2 |
2 |
Прерывание по команде int3 |
3 |
1 |
Прерывание по команде into |
4 |
1 |
Программные прерывания (по команде int n, где n = 0 – 255) |
0 ‑ 255 |
1 |
Прерывания по входу INTR |
0 ‑ 255 |
3 |
Прерывание по флагу tf. Прерывание возникает после выполнения очередной команды программы, если флаг tf установлен в «1». При переходе к обработчику МП сбрасы-вает tf в ноль, поэтому обработчик выполняется не в пошаговом, а в автоматическом режиме. При возврате из обработчика по команде iret МП восстанавливает (выталкивает из стека) старое содержимое регистра флагов f. Флаг tf снова устанавливается в единицу и МП возвращается в пошаговый режим. Обработчик прерывания выводит на экран содержимое внутренних регистров МП.
Прерывание по команде int3. Это однобайтовая команда «прерывание в контрольной точке». Используется при отладке программы. Располагаются эти команды в критических местах программы (например, их туда может вставлять debugger). Обработчик этого прерывания также обычно выводит на экран содержимое регистров МП.
Прерывание по команде into. Команда проверяет состояние флага переполнения of, и если он установлен в единицу, происходит прерывание.
Прерывание по команде int n. Это двухбайтная команда, в которой n задает тип прерывания и может принимать значение от 0 до 255. Таким образом, с помощью такой команды можно вызвать любой обработчик. Команда int n представляет команду межсегментного вызова подпрограммы и подобна команде call far. Разница между этими командами в том, что int n занимает в памяти два байта, а call far – пять, int n сохраняет в стеке содержимое регистра флагов f, а call far не сохраняет. Команды int n используются для обращения к системным библиотечным подпрограммам (например, к средствам DOS и BIOS).
Прерывания по входам INTR и NMI были рассмотрены ранее.
2.16. Контроллер прерываний К1810ВН59 (i8259)
Эта микросхема предназначена для обслуживания двух групп МП. К первой группе относятся МП 580 и 8085, ко второй – 8086, 8088, 80286, 80386 и т.д. Рассмотрим работу ВН59 при обслуживании МП второй группы. Подключение ВН59 к системной шине показано на рис. 2.17.
Рис. 2.17
Контроллер имеет восемь входов запросов на прерывание (IR7 – IR0). Восприняв запрос на одном из этих входов ВН59, формирует сигнал на выходе INT. Этот сигнал подается на вход INTR ВМ86. Если внешние прерывания не замаскированы, то МП подтверждает прерывание, выставляя два сигнала на выходе INTA. Эти сигналы поступают на одноименный вход контроллера, и по второму из них ВН59 выставляет на ШД тип прерывания. Этот тип он формирует следующим образом: старшие пять разрядов типа задает программист при настройке контроллера, а на место младших трех разрядов ВН59 подставляет двоичный номер линии, по которой пришел запрос.
Несмотря на то, что внутренняя архитектура ВН59 включает в себя довольно много различных регистров, с точки зрения программиста, контроллер содержит всего два адресуемых устройства, выбор между которыми определяет сигнал на линии А0.
В системе могут использоваться несколько ВН59, соединенных каскадно. Один контроллер является ведущим, а все остальные ведомыми. Выходы INT ведомых контроллеров заводятся на входы IRi ведущего контроллера. Максимальное число контроллеров в системе равно девяти, а максимально возможное число источников внешних прерываний равно 64. На рис. 2.18 показан пример каскадного соединения контроллеров.
Перед началом работы все контроллеры должны быть настроены. Для этого на каждый ВН59 надо подать три или четыре команды инициализации (ICW1 – ICW4). Три команды подаются, если в системе один контроллер прерываний, четыре – если несколько.
Рис. 2.18
Рассмотрим упрощенные форматы этих команд для второй группы процессоров. ICW1 передается при А0 = 0 и имеет формат, приведенный на рис. 2.19.
0 |
0 |
0 |
1 |
0 |
0 |
D1 |
1 |
Рис. 2.19
При D1 = 0 – в системе несколько контроллеров и, следовательно, будет команда инициализации ICW3. При D1 = 1 – в системе один контроллер и ICW3 передаваться не будет.
ICW2 передается при А0 = 1 и имеет формат, приведенный на рис. 2.20. Здесь Т7 - Т3 – старшие пять разрядов типа прерывания.
Формат ICW3 различается для ведущего и ведомых контроллеров. Для ведущего: если в i-м разряде ICW3 стоит единица, значит к линии IRi подключен ведущий контроллер. Для ведомого ICW3 имеет формат, приведенный на рис. 2.21. Передается ICW3 при А0 = 1.
ICW4 передается при А0 = 1 и обычно имеет формат, приведенный на рис. 2.22.
T7 |
T6 |
T5 |
T4 |
T3 |
0 |
0 |
0 |
Рис. 2.20
0 |
0 |
0 |
0 |
0 |
N2 |
N1 |
N0 |
N 2-0 – двоичный номер линии IR ведущего контроллера, к которой подключен данный ведомый.
Рис. 2.21
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Рис. 2.22
В IBM PC/XT есть контроллер ВН59. Ему назначены системные адреса 20h (А0 = 0) и 21h (А0 = 1). Настройка ВН59 в XT производится последовательностью команд:
mov al, 13h |
; передаем ICW1, ICW3 не будет |
out 20h, al |
|
mov al, 8 |
; передаем ICW2. Старшие ;разряды типа задаем |
out 21h, al |
;равными 00001. Таким образом, ;для линии IR0 (прерывание от ;канала 0 таймера) контроллер ;будет вырабатывать тип, равный 08h, для ;линии IR1 (прерывание от ;клавиатуры) – тип, равный 09h, и т.д |
mov al,1 |
;передаем ICW4 |
out 21h, al |
Начиная с PC/AT, в системе стоит два ВН59. При этом все вышесказанное для ВН59 в ХТ является справедливым для ведущего в АТ.
После того как ВН59 настроен, все остальные настроечные слова он воспринимает как команды управления. Всего имеется три такие команды. Обычно их обозначают OCW1, OCW2 и OCW3.
OCW1 передается при А0 = 1. Если в i-м разряде OCW1 стоит единица, вход IRi контроллера маскируется и запросы на этом входе ВН59 восприниматься не будут до тех пор, пока программист его не размаскирует.
Во избежание конфликтов всем входам IR контроллера присваиваются приоритет. Если программист не задает приоритеты линий IR, то по умолчанию линии IR0 присваивается старший, а линии IR7 – младший приоритет. Команда OCW2 (передается при А0 = 0) позволяет менять приоритеты линий IR.
Пользователь должен знать о важной особенности работы контроллера ВН59. Если контроллер настроен на «обычный конец прерывания», то, восприняв запрос на линии Iri, он автоматически маскирует эту линию и все линии IR с более низкими приоритетами. Иногда говорят, что контроллер «ставит штору». Снимать штору самостоятельно контроллер не умеет. Это должен делать программист, передав в контроллер команду управления OCW2 формата 20h. Как правило, штора снимается в конце обработчика. Например, в конце обработчика прерывания от клавиатуры должны стоять две команды:
mov al,20h out 20h,al |
; снимаем штору в ХТ или у ;ведущего в АТ |
Если эти команды не поставить, то клавиатура будет заблокирована. OCW3 передается при А0 = 0 и на практике используется редко.
Вход ВН59 не предназначен для использования в многопроцессорных системах, поскольку «не умеет» распределять прерывания между имеющимися в системе процессорами. Поэтому (начиная с Pentium) в тех моделях процессоров, которые поддерживают многопроцессорные конфигурации, используется контроллер прерываний APIC (advanced programmable interrupt controller). При этом сам МП имеет встроенный APIC (local APIC) и, кроме того, в системе имеется общий внешний APIC (I/O APIC). Последний воспринимает прерывания от ВУ и, в зависимости от настройки, распределяет их обработку между процессорами (между встроенными APIC).
Общение между внешним и встроенным APIC осуществляется либо по СШ (Pentium IV), либо по специальной шине APIC (более ранние процессоры). Если МП стоит в однопроцессорной сиистеме, внутренний APIC может быть настроен на работу с ВН59. Настройка внутреннего APIC в защищенном режиме производится только на нулевом уровне привилегий.
2.17. Дополнительная информация о настройке ВН59
С практической точки зрения информации о ВН59, приведенной в разд. 2.16, вполне достаточно для работы с этой микросхемой. Рассмотрим сведения о настройке контроллера.
Формат ICW1.
A0 = 0 | A7 | A6 | A5 | 1 | УП | Ф | Е | ICW4 |
A7-5 – разряды адреса для МП 580.
УП = 0 – IR воспринимается уровнем.
УП = 1 – IR воспринимается фронтом.
Ф = 0 – восьмибайтная таблица (только для МП 580!).
Ф = 1 – четырехбайтная таблица (только для МП 580!).
Е = 0 – несколько КП.
Е = 1 – один КП.
ICW4 = 0 – нет ICW4 (МП 580).
ICW4 = 1 – есть ICW4.
Формат ICW 2 (имеется два варианта этой команды).
А0 = 1 | А15 |
А14 |
А13 |
А12 |
А11 |
А10 |
А9 |
А8 |
Это вариант для МП 580. Команда задает старший байт адреса для команды call addr16, которую формирует ВН59 для МП 580.
А0 = 1 | Т7 |
Т6 |
Т5 |
Т4 |
Т3 |
* |
* |
* |
Это вариант для ВМ86 и старше. В команде задаются пять старших разрядов типа прерывания для линии IR0. Значение трех младших разрядов команды безразличны. Вместо этих разрядов ВН59 автоматически подставляет номер линии, по которой он принял запрос. Например, если пришел запрос на линию IR2, ВН59 сформирует следующий тип прерывания: Т7 Т6 Т5 Т4 Т3 0 1 0.
Формат ICW3 (имеется два варианта этой команды).
А0 = 1 | I 7 |
I 6 |
I 5 |
I 4 |
I 3 |
I 2 |
I 1 |
I 0 |
Это вариант для ведущего КП. Если в разряде Ii стоит единица, то к входу IRi подключен ведомый КП. Например, ICW3 = 00101100 ‑ в системе три ведомых КП, подключенных к входам IR5, IR3 и IR2 ведущего КП.
А0 = 1 | * |
* |
* |
* |
* |
N2 |
N1 |
N0 |
Это вариант для ведомого КП. Три младших бита команды задают ведомому номер линии ведущего, к которой данный ведомый подключен. Остальные биты команды не имеют смысла. Например, ICW3 = 00000101 – ведомому КП сообщают, что он подключен к IR5 ведущего.
Формат ICW4.
А0 = 1 | 0 |
0 |
0 |
PSV |
EN |
M / S |
АКП |
М |
М = 0 – МП 580.
М = 1 – МП86 и старше.
АКП = 1 – разрешен автоконец прерывания (штора не ставится).
PSV = 1 – разрешен приоритет ведомого.
EN = 1; M/S = 0 – ведомый с буферным регистром EN.
EN = 1; M/S = 1 – ведущий с буферным регистром EN.
EN = 0; M/S = * – нет буферного регистра EN.
Формат OCW1.
А0 = 1 | M7 |
M6 |
M5 |
M4 |
M3 |
M2 |
M1 |
M0 |
Единица в i-м разряде OCW1 маскирует линию IRi. Напрмер, OCW1 = 00011001 – маскируются линии IR4, IR3 и IR0. Для того чтобы размаскировать все линии, надо подать OCW1 = 00000000.
Формат OCW2.
А0 = 0 | Ц |
СКП |
КП |
0 |
0 |
N2 |
N1 |
N0 |
№1 |
0 |
0 |
1 |
0 |
0 |
* |
* |
* |
№2 |
0 |
1 |
1 |
0 |
0 |
N2 |
N1 |
N0 |
№3 |
1 |
0 |
1 |
0 |
0 |
* |
* |
* |
№4 |
1 |
1 |
1 |
0 |
0 |
N2 |
N1 |
N0 |
№5 |
1 |
0 |
0 |
0 |
0 |
* |
* |
* |
№6 |
0 |
0 |
0 |
0 |
0 |
* |
* |
* |
№7 |
1 |
1 |
0 |
0 |
0 |
N2 |
N1 |
N0 |
Здесь Ц – циклический сдвиг приоритетов, СКП – специальный конец прерывания, КП – конец прерывания (снятие шторы), N2, N1, N0 – номер линии Iri:
- №1 – обычный конец прерывания (сброс шторы);
- №2 – специальный конец прерывания ( сброс шторы с i-й линии);
- №3 – циклический сдвиг уровней приоритета с обычным концом прерывания, установка дна приоритетного кольца по обслуженному запросу;
- №4 – циклический сдвиг уровней приоритета со специальным концом прерывания;
- №5 – разрешение вращения уровней приоритетов;
- №6 – сброс разрешения вращения уровней приори-тетов;
- №7 – циклический сдвиг уровней приоритетов без окончания прерывания, N2-0 – двоичный код дна приоритетного кольца.
Формат OCW3 (A0 = 0) здесь не приводится.
2.18. Прямой доступ к памяти
Обычно передача байта, например, из ВУ в ОП производится по следующей схеме. За один цикл шины информация считывается из порта ВУ и запоминается во внутреннем регистре процессора, затем, также за один цикл шины, эта информация передается из процессора в ОП. Данная схема требует двух циклов шины на передачу одного байта, но скорость обмена можно увеличить, если передавать байт из порта ВУ в ОП напрямую, минуя процессор. Обмен требует одного цикла шины. Такой ре-жим обмена называется прямым доступом к памяти (ПДП).
На время ПДП процессор отключается от системной шины, поэтому в систему вводится специальная схема контроллера ПДП (КПДП), которая и управляет обменом.
Пусть, например, надо передать байт информации из ОП в порт ВУ. Предварительно КПДП должен быть задан адрес ячейки ОП, откуда будет передаваться информация и направление передачи. Когда ВУ потребуется прочитать данный байт, оно формирует запрос на ПДП, поступающий на контроллер. Последний формирует активный сигнал на вход HOLD МП. Получив сигнал, МП прекращает выпол-нение программы, отключается от шин и вырабатывает сигнал подтверждения захвата HLDA. С этого момента управление системной шиной берет на себя КПДП. Для нашего примера КПДП выполняет следующие действия: вырабатывает сигнал подтверждения ПДП, подключающий порт ВУ к ШД, выставляет на ША адрес ячейки ОП, вырабатывает сигналы MR и IOW, задающие вид операции соответственно для ОП и ВУ. После передачи байта КПДП снимает активный сигнал с входа HOLD МП, возвращая последнему управление системной шиной. Передача байта из ВУ в ОП производится аналогично, меняются только сигналы, задающие вид операции для ОП и ВУ.
При ПДП возможна передача целого блока информации. В этом случае КПДП предварительно задается направление передачи, начальный адрес блока в ОП и размер блока. После передачи очередного байта сигнал HOLD не снимается, содержимое счетчика байтов уменьшается на единицу, а адрес ячейки ОП либо уменьшается, либо увеличивается (в зависимости от настройки КПДП) на единицу. Процесс обмена продолжается, пока счетчик байтов не обнуляется.
2.19. Контроллер прямого доступа к памяти К1810ВТ37 (i8237)
Данная микросхема включает в себя четыре независимых канала ПДП: соответственно канал 0, канал1, канал 2 и канал 3. Каждый канал может находиться в двух основных режимах: режиме программирования и режиме ПДП. В процессе программирования канал может быть настроен на работу в следующих режимах.
Режим одиночной передачи. В этом режиме канал осуществляет передачу байта информации между ОП и портом ВУ, после чего КПДП возвращает шину МП. В этом режиме можно задавать блок информации, но передаваться он будет побайтно.
Режим блоковой передачи. В этом режиме канал передаеи блок информации. КПДП не возвращает шину МП до тех пор, пока не будет передан весь блок.
Режим передачи по требованию. По смыслу это та же блоковая передача, однако после передачи каждого байта КПДП проверяет вход запроса на ПДП (DREQ) канала. Если на нем стоит активный сигнал, значит ВУ готово к дальнейшему обмену, и передача продолжается. Если на DREQ стоит пассивный сигнал, значит ВУ к дальнейшему обмену не готово, передача прекращается (до нового запроса от этого ВУ) и шина возвращается МП.
Каскадный режим. В системе может стоять несколько КПДП, но при этом они соединяются каскадно (один ведущий, остальные ведомые). Сигнал с выхода HRQ ведомого заводится не на вход HOLD МП, а на вход DREQ одного из каналов ведущего. Если какой-либо канал КПДП настроен на каскадный режим, значит к входу DREQ этого канала подключен ведомый контроллер.
Существует специфический вид передачи, который называется «память – память». Как следует из названия, обмен здесь идет не между ОП и ВУ, а между двумя областями ОП. Для такой передачи используются два фиксированных канала: канал 0 и канал 1. В канале 0 задается начальный адрес области ОП, откуда будет передаваться информация. В канале 1 – начальный адрес области ОП, куда будет передаваться информация, и размер передаваемого блока. Запрос на передачу «память – память» подается на канал 0. Получив этот запрос, КПДП за один цикл шины считывает из ОП байт, адрес которого он берет из канала 0, и помещает его в свой внутренний регистр временного хранения. Затем КПДП формирует второй цикл шины, в котором этот байт записывается в ОП, по адресу, взятому из канала 1. После этого производится автодекремент счетчика байтов и автоинкремент (или автодекремент) адресов в каналах 0 и 1, и т.д.
При передаче «память – память» можно использовать режим автофиксации, при котором в процессе передачи адрес в канале 0 не меняется. Этот режим позволяет заполнять заданную область памяти константой.
Режим «память – память» используется, например, для регенерации динамического ОЗУ.
Обычно по окончании передачи блока канал надо перепрограммировать. Однако, если канал настроен на автоинициализацию, перенастройка канала не требуется, поскольку канал автоматически перезагружается исходными данными. Во избежание конфликтных ситуаций, всем каналам КПДП присваивается приоритет. По умолчанию старший приоритет имеет канал 0, однако можно программно изменять приоритеты каналов.
На рис. 2.23 приведено обозначение ВТ37 на функциональных схемах.
Рассмотрим назначение входов/выходов ВТ37.
CLK – вход синхроимпульсов. Синхросерия подается с генератора ГФ84, КПДП использует эту синхросерию, находясь в режиме ПДП, для формирования циклов шины.
CS – выбор кристалла. Нужен в режиме программи-рования, активный сигнал на этом входе означает что процессор обращается к одному из внутренних регистров КПДП. В режиме ПДП вход CS блокируется.
RESET – сброс. По этому сигналу все каналы переводятся в режим программирования. Все каналы при этом маскируются, т.е. запрещается восприятие запросов от ВУ по линиям DREQ 3-0. Поэтому после программирования канала последний надо демаскировать.
Рис. 2.23
READY – готовность. Аналогичен одноименному входу ВМ86. Используется в режиме ПДП. С помощью этого входа синхронизируется работа КПДП и медленнодействующих ОП и ВУ.
HLDA – подтверждение захвата. Сигнал на этот вход заводится с одноименного выхода МП. Когда на HLDA приходит активный сигнал, КПДП берет управление системной шиной на себя.
IOR и IOW – в режиме программирования это входы. Сигналы на них задают КПДП вид операции, с которой обращается к нему МП. В режиме ПДП это выходы. На них КПДП выставляет сигналы, задающие вид операции порту ВУ.
DREQ 3-0 (DMA request) – входы запросов на ПДП для каналов 3-0. Активный уровень этих сигналов задается при программировании.
А3-0 и А7-4 – на этих линиях в режиме ПДП контроллер формирует младший байт адреса ОП. Адрес на этих линиях стоит до конца цикла шины и его не надо запоминать во внешнем регистре. В остальное время линии А3-0 являются входами. Комбинация сигналов на этих входах задает внутренний регистр КПДП. То есть внутри КПДП имеется шестнадцать адресуемых устройств.
D 7-0 – линии адрес/данные. В режиме ПДП в такте Т1 контроллер выставляет на эти линии старший байт адреса ОП. В такте Т2 адрес с этих линий снимается и его фиксируют во внешнем регистре. В остальное время эти линии представляют собой двунаправленную шину данных.
Из вышеизложенного следует, что ВТ37 вырабатывает 16-разрядный адрес и может адресовать только 64 Кбайта памяти. Для того чтобы КПДП мог адресовать 1 Мбайт, в систему вводят страничные регистры (по одному на каждый используемый канал). В эти регистры программист заранее загружает четыре старших разряда адреса. Чтобы обратиться к другой области памяти, надо сменить содержимое страничного регистра.
ADSTB – сигнал, сопровождающий выдачу адреса. Используется для фиксации старшего байта адреса, формируемого на линиях D 7-0 во внешнем регистре.
AEN (address enable) – активный сигнал на этот выход выставляется в режиме ПДП. Обычно этот сигнал используется для блокирования доступа к шине со стороны других устройств системы.
EOP (end of process) – конец операции. Активный сигнал на этом выходе устанавливается, когда счетчик байтов канала переходит через ноль. Этот сигнал может оповещать ВУ об окончании передачи. Линия EOP может использоваться и как вход. Если в режиме ПДП внешним образом сформировать на этой линии активный (нулевой) сигнал, передача прекращается.
HRQ (hold request) – запрос на захват. Подается на вход HOLD МП, отключая последний от системной шины.
MR и MW – сигналы на этих выходах в режиме ПДП задают вид операции для ОП.
DACK 3-0 (DMA acknowledge) – подтверждение ПДП для каналов 3-0. Используется для подключения портов ВУ к шине данных. Активный уровень сигнала на этих выходах задается при программировании контроллера.
В IBM PC/XT стоит один КПДП ВТ37. Его регистрам присвоены системные адреса 00h – 0fh. Страничные регистры (порты) в ХТ имеют системные адреса: 81h ‑ для канала 2; 82h – для канала 3; 83h – для канала 1; 87h – для канала 0. Начиная с PC/AT, в системе стоят два ВТ37, соединенных каскадно.
2.20. Программирование КПДП ВТ37
Часть внутренних регистров ВТ37 имеет формат 8 бит, другая часть – 16 бит. Для того чтобы по восьмиразрядной шине загрузить 16-разрядный регистр, требуется две передачи. Перед началом загрузки (или считывания) 16 битного регистра ВТ37 необходимо программным образом установить в ноль триггер «старший/младший», находящийся внутри ВТ37. Системные адреса 0h, 2h, 4h и 6h выделены 16-разрядным регистрам адреса, соответственно канала 0, канала 1 и т. д.
Системные адреса 1h, 3h, 5h и 7h присвоены счетчиком байтов соответствующих каналов. По этим адресам загружаются размеры передаваемых блоков (число байтов в блоке минус 1). Счетчики имеют формат 16 бит, но максимальный размер блока 214.
Все остальные регистры КПДП имеют формат 8 бит.
По адресу 8h загружается командное слово КПДП. Оно относится сразу ко всем каналам и имеет формат, показанный (в упрощенном виде!) на рис. 2.24.
1 |
0 |
0 |
0 |
0 |
0 |
D1 |
D0 |
Рис. 24
D1 = 1 – режим автофиксации при передаче «память –память». D1 = 0 – нет режима автофиксации. D0 = 1 – режим «память – память». D0 = 0 – нет режима «память – память». По адресу 0bh производится настройка каналов на режимы работы. Настройка по этому адресу производится для каждого канала. Настроечное слово имеет формат, показанный на рис. 2.25.
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
N1 |
N0 |
Рис. 2.25
N1 и N0 задают двоичный номер канала.
D7 и D6 задают режим работы канала (00 – передача по требованию, 01 – одиночная передача, 10 – блоковая передача, 11 – каскадный режим). D5 = 1 – автодекремент адреса. D5 = 0 – автоинкремент адреса. D4 = 1 – есть автоинициализация. D4 = 0 – нет автоинициализации. D3 и D2 задают направление передачи (01 ‑ из ВУ в ОП, 10 – из ОП в ВУ).
Передача любого байта по адресу 0ch сбрасывает триггер старший/младший.
Передача любого байта по адресу 0dh вызывает программный сброс контроллера (аналогично действию сигнала RESET). Передача любого байта по адресу 0eh демаскирует все каналы контроллера.
2.21. Организация процессорного модуля ВМ86
Для того чтобы получить из ВМ86 работоспособный процессор, необходимо реализовать на его основе так называемый процессорный модуль. Последний включает в себя МП ВМ86, генератор ГФ84 и шинный интерфейс, подключающий МП к системной шине.
Подключение генератора ГФ84 производится стандартным образом, как на рис. 2.26.
Рис. 2.26
Данная микросхема может работать от внешнего и от внутреннего генераторов. В последнем случае к входам Х1 и Х2 подключается кварцевый резонатор. Сигнал на входе F/C определяет, от какого генератора работает ГФ 84. Если на F/C подан нулевой сигнал, то ГФ 84 работает от внутреннего генератора, если единичный – от внешнего. Внешний генератор (если он используется) подключается к входу EFI.
Частоты, снимаемые с выходов OSC и PCLK, можно использовать для тактирования внешних устройств.
При работе от внутреннего генератора к входу TANK может быть подключен LC-контур, выделяющий третью гармонику кварца. Вход CSYNC используется в много-процессорных системах, в которых к каждому процессору подключен свой ГФ 84. С помощью простой внешней схемы, вырабатывающей сигнал на входы CSYNC всех генераторов, обеспечивается их фазовая синхронизация.
Сигнал RESET (сброс) должен поступать на процессор при включении питания и при нажатии кнопки «Сброс». Временные характеристики этого сигнала обеспечивает внешняя схема, формирующая сигнал на вход RESIN.
ГФ 84 формирует сигнал готовности (READY) в соответствии с выражением
READY = AEN1&RDY1ÚAEN2&RDY2.
Под шинным интерфейсом будем понимать совокупность внешних схем, обеспечивающих подключение ВМ86 к системной шине управления, системной шине данных и системной шине адреса.
Для подключения ВМ86 к ШУ необходимо поставить внешнюю логику, формирующую системные сигналы MR, MW, IOR и IOW, поскольку сам ВМ86 таких сигналов не вырабатывает. Схема, формирующая указанные сигналы, приведена на рис. 2.27.
Сигнал BUSEN (bus enable – “шина доступна”) – системный управляющий сигнал, обеспечивающий блокировку доступа к СШ. В качестве этого сигнала можно, например, брать сигнал с выхода AEN контроллера прямого доступа к памяти ВТ37.
Рис. 2.27
Рассмотренные 4 сигнала не исчерпывают шину управления. Кроме них по ШУ передаются сигналы INT, INTA, HRQ, HLDA и другие. Однако эти сигналы обычно не требуют для своего формирования каких-либо внешних схем, а снимаются непосредственно с выходных линий ВМ86, ВТ37, ВН59 и других БИС.
Нагрузочная способность выходных линий ВМ86 весьма мала. Поэтому для организации системной шины данных на соответствующие выходы ВМ86 ставятся шинные формирователи (ШФ). На них возлагаются две задачи: увеличивать нагрузочную способность линий AD 15-0 и обеспечивать отключение МП от ШД, когда по ШД нет передачи информации. Обычно в качестве ШФ используются восьмиразрядные микросхемы К580ВА86. Организация ШД показана на рис. 2.28.
Активный (нулевой) сигнал на выходе DEN ВМ86, стробирующий передачу информации по ШД, подключает ШФ к ШД и линиям AD ВМ86.
Рис. 2.28
Сигнал на входе Т определяет направление передачи информации через ШФ:
- при Т = 1 передача от входов А к выходам В;
- при Т = 0 передача от входов В к выходам А.
Для организации системной шины адреса используются внешние регистры-защелки. В них защелкивается вырабатываемый МП адрес ОП или порта ВУ. Этим преследуется две цели: демультиплексировать шину адрес/данные и сохранить адрес до конца текущего цикла шины. Кроме того, регистры позволяют отключать МП от ША, например, при прямом доступе к памяти. Всего в регистрах приходится запоминать 21 бит информации (20 адресных сигналов и сигнал BHE). Для этих целей обычно используются восьмиразрядные регистры К1810ИР82. Один из вариантов организации ША показан на рис. 2.29.
Рис. 2.29
2.22. Организация шинного интерфейса в максимальном режиме
Максимальный режим применяется в следующих трех случаях:
- МП стоит в сложной однопроцессорной системе;
- МП стоит в многопроцессорной системе и является ведущим, а остальные процессоры (например, арифметический сопроцессор ВМ87) – ведомыми. Эт, так называемая сильно связанная конфигурация;
- МП стоит в многопроцессорной системе, в которой равноправные процессоры разделяют между собой системную шину. Это слабо связанная конфигурация.
Организация шины данных и шины адреса в максимальном режиме не отличается от их организации в минимальном режиме, а вот организация шины управления имеет существенные отличия. Дело в том, что в максимальном режиме ВМ86 не вырабатывает некоторые необходимые в системе управляющие сигналы. Задача выработки этих сигналов возлагается на специальную микросхему системного контроллера К1810ВГ88 (i8288). Данная микросхема приведена на рис. 2.30.
На входы S2-S0 подаются сигналы состояния с одноименных выходов ВМ86. Эти сигналы характеризуют текущий цикл шины (см. табл. 2.2), и именно по ним контроллер определяет, какие управляющие сигналы он должен в данный момент вырабатывать.
На вход CLK подается синхросерия с одноименного выхода генератора ГФ84. По этой синхросерии контроллер определяет момент выдачи управляющих сигналов.
На выходе MRDC (memory read command) контроллер формирует системный управляющий сигнал «чтение из памяти» (MR), а на выходе MWTC (memory write command) – системный управляющий сигнал «запись в память» (MW).
Рис. 2.30
На выходе AMWTC (advanced memory write command) формируется опережающий сигнал «запись в память». Он вырабатывается на один такт ранее сигнала MW, и его можно использовать для подготовки к записи медленнодействующих микросхем памяти.
На выходе IORC (input-output read command) контроллер формирует системный управляющий сигнал «чтение из порта ВУ» (IOR), а на выходе IOWC (input-output write command) – системный управляющий сигнал «запись в порт ВУ» (IOW).
На выходе AIOWC (advanced input-output write command) контроллер формирует опережающий сигнал «запись в порт ВУ». Он вырабатывается на такт ранее IOW и его можно использовать для подготовки ВУ к записи.
Сигнал на выходе ALE (см. одноименный выход ВМ86) определяет момент записи адреса в регистры-защелки ИР82. Сигнал на выходе DT/R (см. одноименный выход ВМ86) задает направление передачи информации через шинные формирователи ВА86.
Сигнал, снимаемый с выхода DEN (см. одноименный выход ВМ86), подключает шинные формирователи ВА86 к шине данных. Активный уровень сигнала на этом выходе контроллера противоположен активному уровню сигнала на выходе DEN ВМ86, поэтому перед подачей на шинные формирователи сигнал, снимаемый с выхода DEN ВГ88, надо проинвертировать.
INTA – выход подтверждения прерывания (см. одноименный выход ВМ86).
AEN, CEN (command enable – команда разрешена) и IOB (input-output bus – резидентная шина ввода-вывода) ‑ управляющие входы контроллера. Если на входе AEN стоит активный нулевой сигнал, то контроллер вырабатывает выходные сигналы, если пассивный (единица) – не вырабатывает. Вход CEN действует аналогично входу AEN, только активный сигнал на CEN имеет уровень «единица». Чтобы ВГ88 вырабатывал выходные сигналы, надо обеспечить AEN = 0 и CEN = 1. Исключением является случай, когда на вход IOB подана единица. Тогда ВГ88 формирует сигналы на выходах IORC, IOWC, AIOWC и PDEN вне зависимости от уровней сигналов на входах AEN и CEN.
Комбинация сигналов на входах AEN, CEN и IOB задает контроллеру конфигурацию системы, в которой работает «его» процессор. Жестко заданная комбинация AEN = IOB = 0, CEN = 1 означает что ВГ88 всегда вырабатывает выходные сигналы, т.е. МП стоит в однопроцессорной системе и не разделяет СШ с другими процессорами.
Сигнал на выходе MCE/PDEN (master cascade enable/periphery data enable) трактуется в зависимости от уровня сигнала на входе IOB. Если на IOB подан ноль, сигнал на выходе MCE/PDEN рассматривается как сигнал MCE. Этот сигнал используется, если в системе имеет место каскадное подключение контроллеров прерываний ВН59. Если IOB = 0, сигнал на выходе MCE/PDEN рассматривается как сигнал PDEN. Назначение сигнала PDEN рассматривается ниже.
2.23. Слабо связанные конфигурации
В многопроцессорных системах с несколькими равноправными процессорами любой из них может иметь доступ к одной или более шинам. Одна из этих шин называется системной (общей). К этой шине имеют доступ все процессоры системы. К системной шине подключается память, но необязательно вся память системы и, возможно, внешние устройства или часть этих устройств. Ресурсы, подключенные к СШ, разделяются всеми процессорами системы. Подключение процессоров к СШ производится через шинные интерфейсы. Управляющие сигналы, подключающие тот или иной ШИ к СШ, вырабатываются специальными схемами арбитров шин.
В любой момент времени с системной шиной может работать один процессор. Поэтому для повышения эффективности системы и сокращения простоев процессоров в систему вводятся шины, которые называют резидентными. В многопроцессорной системе резидентной называется шина, к которой имеет доступ только один процессор. Каждый процессор в многопроцессорной системе может иметь «свою» резидентную шину (РШ). В принципе, процессор может иметь несколько резидентных шин, но такой вариант используется крайне редко.
Если к резидентной шине подключены все внешние устройства, с которыми работает данный процессор и не подключена память, такая шина называется резидентной шиной ввода-вывода (РШВВ).
На практике наиболее часто используются следующие варианты:
- процессор стоит в многопроцессорной системе и имеет доступ только к СШ;
- процессор имеет доступ к СШ и РШ;
- процессор имеет доступ к СШ и РШВВ.
Структурная схема варианта, когда процессор имеет доступ только к СШ, приведена на рис. 2.31.
Рис. 2.31
Здесь и далее показан только один процессор, остальные процессоры системы подразумеваются. Шинный интерфейс (ШИ), как и ранее, включает в себя регистры-защелки ИР82, шинные формирователи ВА86 и системный контроллер ВГ88. IOB, CEN и AEN – управляющие входы системного контроллера.
Когда арбитр шин (АШ) предоставляет процессору доступ к СШ, он формирует активный сигнал на вход AEN контроллера. Последний начинает вырабатывать выходные сигналы, и процессор подключается к СШ.
Структурная схема варианта, при котором процессор имеет доступ к СШ и РШ, показана на рис. 2.32.
Рис. 2.32
ШИ2 подключает процессор к РШ при наличии активного сигнала на своем входе CEN, ШИ1 подключает процессор к СШ при наличии активных сигналов на своих входах AEN и CEN. Сигналы на входы CEN ШИ1 и ШИ2 формирует дешифратор адреса, который и определяет, к какой шине обращается процессор.
Структурная схема варианта, при котором процессор имеет доступ к СШ и РШВВ, приведена на рис. 2.33.
Рис. 2.33
В отличие от схемы, приведенной на рис. 2.32, здесь на два шинных интерфейса используется один системный контроллер ВГ88. ШИ2 состоит только из регистров ИР82 и шинных формирователей ВА86. Когда процессор выполняет команду in или out, он обращается к РШВВ, так как именно к ней подключены все ВУ.
Системный контроллер ВГ88, независимо от значений сигналов на входах AEN и CEN, формирует выходные сигналы IOR и IOW, являющиеся управляющими для РШВВ. Кроме того, ВГ88 формирует сигнал PDEN, который подключает к РШВВ шинные формирователи ВА86, входящие в состав ШИ2. Подключение процессора к СШ происходит при приходе активного сигнала на вход AEN контроллера ВГ88.
2.24. Арбитр шин К1810ВБ89 (i8289)
Эти микросхемы используются в многопроцессорных системах, в которых несколько процессоров разделяют между собой системную шину. Схемы арбитража должны разрешать конфликтные ситуации, возникающие при одновременной попытке доступа к СШ со стороны нескольких процессоров.
Каждому процессору, имеющему доступ к СШ, ставится в соответствие свой арбитр шин. В его задачу входят следующие действия:
- арбитр должен определить, нуждается ли «его» процессор в системной шине, и, если нуждается, обеспечить ему доступ к шине;
- доступ процессора к шине арбитр обеспечивает, вырабатывая активный (нулевой) сигнал на своем выходе AEN. Этот сигнал заводится на одноименный вход системного контроллера ВГ88, входящего в состав шинного интерфейса, и тем самым подключает процессор к системной шине.
В результате ГФ84 будет формировать нулевой сигнал READY, во всяком случае до тех пор, пока сигнал на выходе AEN арбитра будет оставаться пассивным.
Захватив шину, арбитр никогда ее не освобождает по собственной инициативе. Освобождение шины происходит либо при общем сбросе системы, либо по запросу от другого арбитра. Причем в последнем случае арбитр освобождает шину только если соблюдаются так называемые условия освобождения.
На рис. 2.34 показано стандартное подключение микросхемы ВБ89.
Рис. 2.34
Если системная шина свободна или занята процессором с более низким приоритетом, арбитр обеспечит доступ к шине практически сразу. Если же шина занята процессором с более высоким приоритетом, арбитр будет вынужден ждать, пока не наступят условия освобождения шины. Вместе с арбитром в этом случае должен ждать и процессор. Для того чтобы заставить процессор ожидать какое-либо событие, надо сформировать нулевой сигнал на его вход READY. Для этих целей сигнал с выхода AEN арбитра заводится на вход AEN1 (или AEN2) генератора ГФ84.
Рассмотрим назначение входов/выходов арбитра ВА86.
S2 – 0 ‑ на эти входы заводятся сигналы состояния, характеризующие цикл шины, который выполняет МП (см. табл. 2.2). По этим сигналам арбитр определяет, нуждается ли МП в шине или нет.
CLK – импульсы, поступающие на этот вход с одно-именного выхода генератора ГФ84, синхронизирует работу арбитра и МП.
BCLC (bus CLK) – на этот вход подаются импульсы с генератора шины. Входы BCLK всех арбитров объединяются между собой. Вход служит для синхронизации работы всех арбитров в системе.
INIT ‑ инициализация (сброс). Этот сигнал заводится на все арбитры системы, и после его поступления шина будет свободна.
Пока на входе LOCK арбитра стоит активный сигнал, арбитр ни при каких условиях не отдаст шину другому арбитру.
ANYRQST – любой запрос. Если на этом входе активный сигнал, арбитр отдает шину по любому запросу от другого арбитра.
CBRQLCK ‑ блокировать вход CBRQ. Этот сигнал запрещает арбитру отдавать шину по запросам с более низким приоритетом.
AEN – активный сигнал на этом выходе означает, что арбитр обеспечил «своему» МП доступ к системной шине.
Для предотвращения конфликтов из-за доступа к СШ всем арбитрам в системе присваивается приоритет. Возможны разные схемы обработки приоритетов. Наиболее простой является последовательная обработка приоритетов (рис. 2.35). АШ – арбитр шин.
Рис. 2.35
Если на входе BPRN (bus priority in) АШ стоит единичный сигнал, это означает, что шину удерживает арбитр с более высоким приоритетом. При этом АШ вырабатывает единичный сигнал на выходе BPRO (bus priority out), т.е. передает эту информацию менее приоритетным арбитрам (рис. 2.35).
Если АШi потребуется шина и на его входе BPRN стоит нулевой сигнал, этот АШ получит доступ к шине. При этом АШi вырабатывает единичный сигнал на своем выходе BPRO, запрещая доступ к шине арбитрам с более низким приоритетом. Очевидно, что таким путем можно получить доступ к СШ, если она свободна или удерживается арбитром с более низким приоритетом.
Пусть АШi требуется доступ к шине, которая удержи-вается арбитром с более высоким приоритетом, т.е. на входе BPRN АШi стоит единица. В этом случае АШi выставляет активный (нулевой) сигнал на линию CBRQ (common bus request –общий запрос шины), сообщая тем самым арбитру, удерживающему шину, что шина требуется арбитру с более низким приоритетом. При этом удерживающий шину арбитр освободит последнюю, если наступят условия освобождения шины. Рассмотрим далее условия освобождения и удержания шины арбитром АШi:
- LOCK = 0 – удержание шины;
- LOCK = 1, BPRN = 1 – безусловное освобождение шины;
- LOCK = 1, BPRN = 0, ANYRQST = 1, CBRQ = 0 – безусловное освобождение шины;
- LOCK = 1, CBRQLCK = 0, CBRQ = 0 – удержание шины;
- LOCK = 1, BPRN = 0, CBRQLCK = 1, CBRQ = 0 – условное освобождение шины.
При условном освобождении удерживающий шину арбитр освободит ее, когда «его» процессор начнет выпол-нять команду hlt или nop. Когда АШi получает доступ к шине, то выставляет нулевой сигнал на линию BUSY (занят), сообщая другим арбитрам, что шина занята.
Схема последовательной обработки приоритетов (см. рис. 2.35) не требует дополнительного оборудования, однако имеет существенный недостаток, заключающийся в том, что в цепочку можно соединить не более трех арбитров. Для устранения этого недостатка используются более сложные схемы параллельной обработки приоритетов, в которых задействуются выходы BREQ (bus request – запрос шины) арбитров. При этом в систему приходится вводить внешние логические схемы, которые и обеспечивают параллельную обработку приоритетов.
Сигналы на выходах IOB (input-output bus), RESB (residential bus) и SYSB/RESB (system bus / residential bus) задают конфигурацию системы. В соответствии с ними арбитр трактует сигналы на входах S2-S0, определяя, нуждается «его» МП в шине или нет. Наиболее часто используются следующие конфигурации:
- IOB = 1, RESB = 0 (SYSB/RESB – безразлично) – МП, которому соответствует данный арбитр, работает только с системной шиной (см. рис. 2.31);
- IOB = 0, RESB = 0, SYSB/RESB = 0 – МП работает с СШ и РШВВ. К какой из этих шин обращается МП, арбитр определяет по сигналу на входе S2. При S2 = 0 – к РШВВ, при S2 = 1 – к СШ ( см. табл 2.2).
- IOB = 1, RESB = 1 – МП работает с СШ и РШ. К какой из этих шин обращается МП, определяет сигнал на входе SYSB/RESB (SYSB/RESB = 1 – к СШ, SYSB/RESB = 0 – к РШ). Этот сигнал снимается с выхода дешифратора адреса (см. рис. 2.32).
2.25. Сильно связанные конфигурации на примере совместной работы МП86 и арифметического сопроцессора ВМ87
Арифметический сопроцессор предназначен для выполнения сложных арифметических команд. МП и сопроцессор вместе образуют многопроцессорную систему, в которой МП является ведущим, а сопроцессор – ведомым. Поскольку процессоры не являются равноправными, то арбитр шин здесь не нужен. Сопроцессор не умеет формировать адреса и считывать из ОП команды. За него это делает МП.
Однако сопроцессор может производить обмен информацией с ОП, используя при этом адреса, сформированные МП. Стандартное соединение ВМ86 и ВМ87 приведено на рис. 2.36.
Рис. 2.36
После прихода сигнала RESET (сброс) сопроцессор анализирует сигнал на линии BHE, выясняя с каким МП он работает. Для ВМ86 на этой линии в первый момент будет ноль, а для ВМ88 – единица. После этого сопроцессор переходит в пассивное состояние.
МП читает из оперативной памяти команды и заносит их в свою внутреннюю очередь. Сопроцессор эти команды перехватывает и также заносит их в свою внутреннюю очередь. В любой момент времени ситуация в обеих очередях должна быть одинаковой, поэтому сопроцессор следит за изменениями в очереди МП по линиям QS 1-0.
Когда ВМ87 перехватывает команду, являющуюся командой сопроцессора, он начинает переходить в активный режим. Полностью активным он становится, когда МП начинает выполнять его команду.
Система команд сопроцессора включает в себя более 80 команд, однако МП воспринимает все их как одну команду esc (escape). С точки зрения МП имеется 3 разновидности этой команды.
1. Команда работает с внутренними регистрами сопроцессора и не требует обращения к ОП. ВМ86 и ВМ87 одновременно начинают выполнение этой команды. При этом ВМ86 выполняет ее как команду nop (no operation) и переходит к выполнению следующей команды программы, а ВМ87 продолжает правильное выполнение заданной команды. Далее оба процессора работают параллельно.
2. Команда читает операнд из ОП и заносит его во внутренний регистр сопроцессора. При выполнении такой команды ВМ86 формирует адрес операнда в ОП и выставляет его на ША. Там этот адрес перехватывает сопроцессор и заносит его в свой специальный внутренний регистр. Из ОП по выставленному адресу считывается слово, которое сопроцессор принимает, а МП игнорирует. Далее МП переходит к выполнению следующей команды программы. Операнды сопроцессора занимают в памяти до 10-ти байт, поэтому оставшийся «хвост» операнда сопроцессор должен считать самостоятельно. Для этих целей сопроцессор запрашивает у МП шину по линии RQ/GT и считывает остаток операнда из ОП, используя перехваченный адрес.
3. Команда заносит в память содержимое внутреннего регистра сопроцессора. ВМ86 вырабатывает адрес, который перехватывает сопроцессор. По этому адресу из ОП считывается слово, которое игнорируют оба процессора. Затем ВМ87 запрашивает шину по линии RQ/GT и производит запись в ОП, используя перехваченный адрес.
Команды сопроцессора сложны, и для их выполнения требуется много времени. Поэтому высока вероятность того, что к началу выполнения следующей команды сопроцессора последний не успеет завершить выполнение предыдущей команды. Перед командами сопроцессора в программах рекомендуется ставить команду wait (ждать). Эта команда проверяет сигнал на входе TEST и, если там стоит единица, МП ждет, пока на входе TEST не появится ноль. Сигнал на вход TEST заводится с выхода BUSY (занят) сопроцессора. При этом, если на BUSY стоит единица, значит ВМ87 занят выполнением команды.
2.26. Формат машинной команды ВМ86
Машинная команда микропроцессора 8086 имеет формат, приведенный на рис. 2.37.
префиксы |
КОП |
постбайт |
disp |
data |
Рис. 2.37
Префикс – это байт, идущий перед командой и несколько меняющий ее смысл. Для МП 8086 допустимы: префикс блокировки, префикс замены сегмента и префикс повторения. В большинстве команд префиксы отсутствуют, однако в команде могут использоваться и все три префикса одновременно. Префикс блокировки (lock) имеет значение 11110000. Префикс замены сегмента имеет формат 011sr110. Поле sr задает сегментный регистр, который используется в команде (табл. 2.6). Префикс повторения (rep) имеет значение 11110011 (или в еще одном варианте 11110010).
Таблица 2.6
sr |
Сегментный регистр |
00 |
es |
01 |
cs |
10 |
ss |
11 |
ds |
Поле КОП – единственное из полей, которое всегда присутствует в команде. Занимает это поле, в зависимости от команды, один или два байта. Младший бит этого поля (w) в большинстве случаев задает разрядность операции. При w = 0 команда работает с байтом, при w = 1 – со словом.
Постбайт либо в команде отсутствует, либо занимает один байт. Это поле задает регистры, которые принимают участие в формировании адресов операндов. Формат постбайта приведен на рис. 2.38.
Рис. 2.38
Поле reg (регистр) задает регистр в двухоперандных командах (табл. 2.7). Аналогично трактуется поле rm (регистр/память) при md = 11 (mode – режим). При других значениях md, поле rm задает способ формирования адреса памяти (табл. 2.8). Поле disp (dispersion – смещение) задает смещение при базовой адресации (или адрес при прямой адресации) и может занимать 0, 1 или 2 байта. Поле data (операнд) присутствует, если в команде используется непосредственная адресация.
Таблица 2.7
reg |
w = 0 |
w = 1 |
000 |
al |
ax |
001 |
cl |
cx |
010 |
dl |
dx |
011 |
bl |
bx |
100 |
ah |
sp |
101 |
ch |
bp |
110 |
dh |
si |
111 |
bh |
di |
Таблица 2.8
rm |
md = 00 |
md = 01 |
md = 10 |
000 |
bx+si |
bx+si+disp8 |
bx+si+disp16 |
001 |
bx+di |
bx+di+disp8 |
bx+di+disp16 |
010 |
bp+si |
bp+si+disp8 |
bp+si+disp16 |
011 |
bp+di |
bp+di+disp8 |
bp+di+disp16 |
100 |
si |
si+disp8 |
si+disp16 |
101 |
di |
di+disp8 |
di+disp16 |
110 |
disp16 |
bp+disp8 |
bp+disp16 |
111 |
bx |
bx+disp8 |
bx+disp16 |
Например, команда lock add cs: [bp+di+100h], 77h имеет шестнадцатеричное представление: F0 2E 80 83 0010 77 (F0 – младший байт в ОП). Здесь F0 – префикс блокировки (lock), 2E – префикс замены сегмента (cs: ), 80 – код команды (операции) (add), 83 – постбайт (задает способ формирования адреса: bp+di+disp), 0010 – смещение (100h) и 77 – непосредственный операнд.