Структура ввода-вывода

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

Процессор может обращаться к 216 (64К) 8-битным портам примерно так же, как к байтам памяти. Каждому 8-битному порту назначен уникальный адрес из диапазона от 0 до 216 - 1. Любые два смежных 8-битных порта можно считать 16-битным портом аналогично слову памяти.

Регистры.

Процессор имеет 13 16-битных регистров и 9 однобитных флажков (флажки NT и IOPL предназначены только для виртуального режима). Мы разделим регистры на четыре набора: три набора содержат по четыре регистра, а непосредственно недоступный программисту указатель команды образует отдельный набор. Регистры и флажки показаны на рис. 2.7. Регистры общего назначения служат, в основном, для хранения операндов арифметических и логических операций; указательные и индексные регистры предназначены для хранения внутрисегментных смещений, а сегментные регистры определяют начальные адреса сегментов.

Регистры общего назначения. В процессоре, не имеющем регистров общего назначения (РОН), каждая команда должна считывать свои операнды из памяти и возвращать результат также в память. Однако на обращение к памяти расходуется время, которое можно уменьшить, если временно хранить часто используемые операнды и результаты в более быстро доступном месте. Таким местом и являются регистры общего назначения.

 
  Структура ввода-вывода - №1 - открытая онлайн библиотека

РОНы в процессоре 80286 представлены 16-битными регистрами АХ, ВХ, СХ и DX. Младшую и старшую половины каждого РОНа можно использовать либо отдельно (как два 8-битных регистра), либо совместно (как один 16-битный регистр). В связи с этим каждой половине РОНа дано свое название: младшие (Low) половины называются AL, BL, CL и DL, а старшие (High) - АН, ВН, СН и DH. Двойственный характер РОНов позволяет одинаково легко оперировать байтами и словами.

Большей частью содержимое РОНов единообразно участвует в арифметических и логических операциях. Например, по команде ADD (сложить) можно прибавить содержимое любого 8- или 16 битного РОНа к содержимому любого другого РОНа такого же размера и сохранить результат в любом из них. Однако в некоторых командах функции РОНов специализированы. Например, в цепочечных командах регистр СХ должен хранить число элементов цепочки; для этого нельзя привлекать регистры АХ, ВХ и DX. Такая специализация предопределяет описательное название регистра СХ - СЧЕТЧИК. Специальные функции регистров АХ, ВХ и DX объясняют их названия: АККУМУЛЯТОР, БАЗА и ДАННЫЕ.

Специализация РОНов затрудняет изучение процессора из-за необходимости помнить специальные правила. Она же несколько увеличивает длину программ, так как до выполнения некоторых команд приходится пересылать данные из одного РОНа в другой. Однако рассмотрим разработку программы для процессора, в котором все РОНы одинаковы. Чтобы следить за ее выполнением, нам, вероятно, придется организовать программу так, чтобы определенные данные всегда находились в конкретных регистрах. Например, можно договориться всегда использовать регистр СХ для учета числа - элементов цепочки. Тогда нам никогда не придется пересылать размер цепочки в регистр СХ, так как он всегда будет там. Но поскольку цепочечная команда в нашем гипотетическом процессоре может получать размер цепочки из любого РОНа, каждая цепочечная команда должна указывать, где находится размер цепочки. Для этого придется, либо увеличить длину каждой цепочечной команды (два байта вместо одного), либо ввести больше однобайтных цепочечных команд. Первое решение прямо ведет к увеличению программы, а второе имеет такие же последствия. Действительно, всего может быть только 256 однобайтных команд, и увеличение числа однобайтных цепочечных команд заставит удлинить другие однобайтные команды до двух байт. Таким образом, специализация РОНов в некоторых командах уменьшает длину программы.

Указательные и индексные регистры. Команда с обращением к ячейке памяти может прямо указать адрес этой ячейки, но прямой адрес увеличивает длину команды и размер программы (кода). Если адреса часто используемых ячеек хранить в специальных регистрах, то в команде адрес можно не указывать, а определить регистр, в котором находится адрес. Такие регистры иногда называются указательными или индексными. Данное использование регистров напоминает сокращенный набор номеров телефонов. Вы можете позвонить любому человеку в городе, набирая семизначный номер его телефона. Но, если телефонная компания предлагает такой сервис, можно поместить часто используемые номера абонентов в "регистры". После этого для соединения с нужным абонентом набираются одна или две цифры, определяющие регистр.

К указательным и индексным регистрам процессора 80286 относятся 16-битные регистры SP, BP, SI и DI, которые обычно содержат внутрисегментные смещения. Например, в команде ADD один из операндов может находиться в текущем сегменте, данных со смещением, содержащимся в одном из указательных или индексных регистров, скажем SI.

Помимо сокращения длины команд, рассматриваемые регистры выполняют еще одну (возможно, более важную функцию): они позволяют командам обращаться к ячейкам, смещения которых являются результатом предыдущих вычислений в ходе выполнения программы. Такие вычисления часто требуются (особенно в программах на языках высокого уровня) для того, чтобы установить смещения переменных. Требуемые вычисления можно осуществить в РОНах, а затем переслать результат в указательный или индексный регистр для использования его как смещения. Если устранить подобные пересылки, программы будут короче. Поэтому содержимое указательных и индексных регистров может участвовать в арифметических и логических операциях наряду с 16-битными РОНами. Например, в упомянутой выше команде ADD вторым операндом может быть содержимое регистра SI.

Рассматриваемые регистры имеют некоторые различия, что и объясняет их разделение на указательные и индексные. Указательные регистры SI и DI предназначены для удобного доступа к данным в текущем сегменте данных, а базовые регистры SP и ВР - в текущем сегменте стека. Использование сегмента стека как "области данных" дает некоторое преимущество в реализации языков высокого уровня (см. далее). Поэтому, если сегмент явно не указан, смещения в базовых регистрах относятся к текущему сегменту стека, а смещения в индексных регистрах обычно относятся к сегменту данных. (Слово "обычно" подразумевает исключения, о которых речь пойдет далее.) Если, например, в команде ADD смещение одного из операндов находится в регистре SI, то считается, что операнд содержится в сегменте данных, но можно явно определить и другой сегмент.

В некоторых командах учитывается различие между двумя базовыми регистрами SP и ВР. Например, в командах PUSH и POP смещение верхнего элемента стека берется из регистра SP, что объясняет его название УКАЗАТЕЛЬ СТЕКА. Использовать для этой цели регистр ВР нельзя. Этот регистр содержит смещение "базы" области данных в сегменте стека, поэтому и называется УКАЗАТЕЛЕМ БАЗЫ.

Кроме того, в цепочечных командах существует различие между индексными регистрами SI и DI. Предполагается, что смещение операн­да-источника содержится в регистре SI, а операнда-приемника - в регистре DI. Этим объясняется название этих регистров ИНДЕКС ИСТОЧНИКА и ИНДЕКС ПРИЕМНИКА. Функции регистров SI и DI в цепочечных командах изменить нельзя. Например, команда пересылки цепочки передает цепочку из текущего сегмента данных со смещением из регистра SI в текущий дополнительный сегмент со смещением из регистра DI; регистры SI и DI в команде явно не указываются. (Цепочка-приемник находится в дополнительном сегменте, а не в сегменте данных, поэтому у каждой цепочки есть свой сегмент и длина ее может доходить до 216 байт.)

Сегментные регистры. Напомним, что в реальном режиме память состоит из 1М байт, но адреса, содержащиеся в командах и в указательных и индексных регистрах, имеют длину всего 16 бит. Они не могут адресо­вать всю память, а являются смещениями в каком-то конкретном сегменте емкостью 64 Кбайт. Но в каком же?

В процессоре 80286 для задания текущих сегментов предназначены четыре 16-битных сегментных регистра CS, DS, SS и ES. Каждый регистр идентифицирует конкретный текущий сегмент и функции их совершенно различны: CS идентифицирует текущий сегмент кода, DS - текущий сегмент данных, SS - текущий сегмент стека и ES - текущий дополнительный сегмент (данных).

Таким образом, команда задает смещение в сегменте, а сегментные регистры определяют для нас четыре нужных. Какой же следует выбирать? Ответ зависит от того, как команда использует смещение, которое может определять либо следующую выполняемую команду, либо операнд ко­манды.

Выборки всех команд осуществляются из текущего сегмента кода, поэтому нужен регистр, содержащий смещение следующей выполняемой команды в текущем сегменте кода. Эту функцию выполняет регистр IP -УКАЗАТЕЛЬ КОМАНДЫ. Если, например, регистр CS содержит 1FF7, а регистр IP - 003А, то следующая выполняемая команда выбирается из ячейки 1FFАА:

+1FF70 (начальный адрес сегмента кода)

003А (смещение в регистре IP)

1FFАА (адрес следующей команды)

Напомним, что для образования адреса памяти к содержимому регистра CS "пристраивается" шестнадцатеричная цифра 0 (см. рис. 2.5).

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

если в вычислении смещения участвует указательный регистр, то привлекается текущий сегмент стека;

в случае операнда-приемника цепочечной команды используется дополнительный сегмент.

Указание префикса в цепочечной команде может повлиять только на операнд-источник; операнд-приёмник всегда находится в текущем дополнительном сегменте. Указание префикса в цепочечной команде может повлиять только на операнд-источник; операнд-приемник всегда находится в текущем дополнительном сегменте.

Рассмотрим команду ADD, один из операндов которой находится в сегменте данных, а смещение содержится в регистре SI. Команда должна указать регистр SI в своем поле операнда, но может не определять регистр DS. При выполнении команды процессор знает, что для локализации операнда необходимо использовать содержимое регистров DS и SI. Теперь обратимся к команде ADD, один из операндов которой находится в сегменте кода (им, например, может быть константа), а смещение содержится в регистре SI. Команда ADD, как и раньше, должна определить регистр SI в поле операнда; при выполнении же команды ей должен предшествовать байт префикса, идентифицирующий регистр CS.

Флажки. Процессор 80286 имеет 9 флажков, которые применяются для регистрации состояния (флажки состояния) и управления действиями процессора (флажки управления). Флажки состояния обычно устанавливаются после выполнения арифметических и логических команд, отражая определенные свойства их результатов. К ним относятся:

флажок переноса CF, показывающий перенос из старшего бита;

флажок вспомогательного переноса AF, фиксирующий перенос из четырех младших бит;

флажок переполнения OF, определяющий выход знакового результата за границы диапазона;

флажок нуля ZF, показывающий нулевой результат команды;

флажок знака SF, регистрирующий отрицательный результат;

флажок паритета (четности) PF, фиксирующий наличие в результате четного числа единичных бит.

К флажкам управления относятся флажок направления DF (показывает направление прохождения цепочек в цепочечных командах), флажок разрешения прерываний IF (разрешает или запрещает восприятие прерываний по входу INTR) и флажок трассировки TF (переводит процессор в пошаговый режим для отладки программы).