Лекция 3. машинная организация процессора 80286

      Комментарии к записи Лекция 3. машинная организация процессора 80286 отключены

Введение.

Один из способов изучения компьютера заключается в рассмотрении его функциональных компонентов. Описание этих компонентов и их взаимодействия иногда называется архитектурой компьютера. В понятие архитектуры входят число регистров и их функции, объем подключаемой памяти, способы ее адресации и средства ввода-вывода.

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

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

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

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

Структура памяти.

Память системы, работающей в реальном режиме, образуют 220 (примерно 1 млн.) 8-битных величин, называемых байтами. Каждому байту назначен уникальный адрес (беззнаковое число) из диапазона от 0 до 220 — 1 (от 00000 до FFFFF в шестнадцатеричной системе счисления), что показано на рис. 2.1. В виртуальном режиме размер памяти расширяется до 224 (16 млн.) байт.

Любые два смежных (или соседних) байта в памяти образуют слово. У каждого из двух байт в слове есть свой адрес и меньший из них принимается за адрес слова. Примеры слов показаны на рис. 2.2.

Слово состоит из 16 бит. Байт с большим адресом содержит старшие биты слова, а байт с меньшим адресом — младшие. Сначала такая ситуация кажется вполне естественной: конечно же, старший байт должен иметь больший адрес. Но когда память рассматривается как последовательность байт, простирающаяся от наименьшего адреса к наибольшему, оказывается, что процессор хранит слова наоборот, что показано на рис. 2.3.

Сегментация памяти.

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

В реальном режиме память 1 Мбайт состоит из нескольких сегментов, каждый из которых содержит самое большее 216 (64К) байт. Сегменты начинаются по адресам, кратным 16, т.е. имеющим четыре нулевых младших бита. В любой момент времени программа может обращаться к четырем сегментам, которые называются текущим сегментом кода, текущим сегментом данных, текущим сегментом стека и текущим дополнительным сегментом (он обычно отводится для данных). Каждый текущий сегмент идентифицируется путем размещения старших 16 бит адреса его первого байта в одном из четырех специальных сегментных регистров. Отметим, что сегменты могут перекрываться, как видно на рис. 2.4.

Предположим, например, что в 16-битном сегментном регистре кода содержится число С018. Это значит, что сегмент кода начинается по адресу байта С0180 и простирается на 216 (1000016) байт. Следовательно, последний байт сегмента кода имеет адрес D017F.

Мы обращаемся к байтам или словам внутри сегмента с помощью 16-битного внутрисегментного смещения. Процессор образует 20-битный адрес байта или слова, суммируя 16-битное смещение с содержимым 16-битного сегментного регистра, к которому пристроены четыре младших нуля (рис. 2.5.). В предыдущем примере байт с адресом CFFFF находится внутри текущего сегмента кода, т.е. он имеет смещение FE7F (CFFFF -С0180) в сегменте, как показано на рис. 2.6.

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

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

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

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

Регистры.

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

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

РОНы в процессоре 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 (переводит процессор в пошаговый режим для отладки программы).

Лекция 2:Система команд процессора