На современном компьютерном рынке наблюдается большое разнообразие различных
типов компьютеров. Поэтому возможно предположить возникновение у потребителя
вопроса — как оценить возможности конкретного типа (или модели) компьютера и
его отличительные особенности от компьютеров других типов (моделей).
Рассмотрения для этого одной лишь только структурной схемы компьютера
недостаточно, так как она принципиально мало чем различается у разных машин: у
всех компьютеров есть оперативная память, процессор, внешние устройства.
Различными являются способы, средства и используемые ресурсы, с помощью которых
компьютер функционирует как единый механизм. Чтобы собрать воедино все понятия,
характеризующие компьютер с точки зрения его функциональных
программно-управляемых свойств, существует специальный термин — архитектура
ЭВМ.
Впервые понятие архитектура ЭВМ стало упоминаться с появлением машин 3-го
поколения для их сравнительной оценки.
К изучению языка ассемблера любого компьютера имеет смысл приступать только
после выяснения того, какая часть компьютера оставлена видимой и доступной для
программирования на этом языке. Это так называемая программная модель
компьютера, частью которой является программная модель микропроцессора,
которая содержит 32 регистра в той или иной мере доступных для использования
программистом.
Данные регистры можно разделить на две большие группы:
В программах на языке
ассемблера регистры используются очень интенсивно. Большинство регистров имеют
определенное функциональное назначение.
Как следует из названия, пользовательскими регистры называются потому, что программист может использовать их при написании своих программ. К этим регистрам относятся (рис. 1):
Рис. 1. Пользовательские регистры микропроцессоров i486 и Pentium
Почему многие из этих регистров приведены с
наклонной разделительной чертой?
Нет, это не разные регистры — это части одного большого 32-разрядного регистра.
Их можно использовать в программе как отдельные объекты.
Так сделано для обеспечения работоспособности программ, написанных для младших
16-разрядных моделей микропроцессоров фирмы Intel, начиная с i8086.
Микропроцессоры i486 и Pentium имеют в основном 32-разрядные регистры. Их
количество, за исключением сегментных регистров, такое же, как и у i8086, но
размерность больше, что и отражено в их обозначениях — они имеют
приставку e (Extended).
Разберемся подробнее с составом и назначением пользовательских регистров.
Все
регистры этой группы позволяют обращаться к своим
“младшим” частям (см. рис. 1).
Рассматривая этот рисунок, заметьте, что использовать для самостоятельной
адресации можно только младшие 16 и 8-битные части этих регистров. Старшие 16
бит этих регистров как самостоятельные объекты недоступны. Это сделано, как мы
отметили выше, для совместимости с младшими 16-разрядными моделями
микропроцессоров фирмы Intel.
Перечислим регистры, относящиеся к группе регистров общего назначения. Так как эти регистры физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), то их еще называют регистрами АЛУ:
Следующие два регистра используются для поддержки так называемых цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит:
В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком в системе команд микропроцессора есть специальные команды, а в программной модели микропроцессора для этого существуют специальные регистры:
Не спешите пугаться столь жесткого функционального назначения
регистров АЛУ. На самом деле, большинство из них могут использоваться при
программировании для хранения операндов практически в любых сочетаниях. Но, как
мы отметили выше, некоторые команды используют фиксированные регистры для
выполнения своих действий. Это нужно обязательно учитывать.
Использование жесткого закрепления регистров для некоторых команд позволяет
более компактно кодировать их машинное представление. Знание этих особенностей
позволит вам при необходимости хотя бы на несколько байт сэкономить память,
занимаемую кодом программы.
В программной
модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es,
gs, fs.
Их существование обусловлено спецификой организации и использования оперативной
памяти микропроцессорами Intel. Она заключается в том, что микропроцессор
аппаратно поддерживает структурную организацию программы в виде трех частей,
называемых сегментами. Соответственно, такая организация памяти
называется сегментной.
Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, как мы увидим далее, в этих регистрах содержатся адреса памяти с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:
В микропроцессор включены несколько регистров (см. рис. 1), которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:
Используя эти регистры, можно получать информацию о результатах выполнения команд и влиять на состояние самого микропроцессора. Рассмотрим подробнее назначение и содержимое этих регистров:
eflags/flags (flag register) — регистр флагов. Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086. На рис. 2 показано содержимое регистра eflags.
Рис. 2. Содержимое регистра eflags
Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:
Мнемоника флага |
Флаг |
Номер бита в eflags |
Содержание и назначение |
cf |
Флаг переноса |
0 |
1 — арифметическая
операция произвела перенос из старшего бита результата. Старшим является 7,
15 или 31-й бит в зависимости от размерности операнда; |
pf |
Флаг паритета |
2 |
1 — 8 младших
разрядов (этот флаг — только для 8 младших разрядов операнда любого размера)
результата содержат четное число единиц; |
af |
Вспомогательный флаг переноса |
4 |
Только для команд
работающих с BCD-числами. Фиксирует факт заема из младшей тетрады результата:
|
zf |
Флаг нуля (Zero Flag) |
6 |
1 — результат
нулевой; |
sf |
Флаг знака |
7 |
Отражает состояние
старшего бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных
операндов соответственно): |
of |
Флаг переполнения |
11 |
Флаг of используется
для фиксирования факта потери значащего бита при арифметических операциях: |
iopl |
Уровень Привилегий ввода-вывода |
12, 13 |
Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи |
nt |
флажок вложенности задачи |
14 |
Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую |
Мнемоника флага |
Флаг |
Номер бита в eflags |
Содержание и назначение |
tf |
Флаг трассировки |
8 |
Предназначен для
организации пошаговой работы микропроцессора. |
if |
Флаг прерывания |
9 |
Предназначен для
разрешения или запрещения (маскирования) аппаратных прерываний (прерываний по
входу INTR). |
rf |
Флаг возобновления |
16 |
Используется при обработке прерываний от регистров отладки. |
vm |
Флаг виртуального |
17 |
Признак работы
микропроцессора в режиме виртуального 8086. |
ac |
Флаг контроля выравнивания |
18 |
Предназначен для разрешения контроля выравнивания при обращениях к памяти. Используется совместно с битом am в системном регистре cr0. К примеру, Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию |
eip/ip (Instraction
Pointer register) — регистр-указатель команд.
Регистр eip/ip имеет разрядность 32/16 бит и содержит смещение
следующей подлежащей выполнению команды относительно содержимого сегментного
регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен
программисту, но загрузка и изменение его значения производятся различными
командами управления, к которым относятся команды условных и безусловных
переходов, вызова процедур и возврата из процедур. Возникновение прерываний
также приводит к модификации регистра eip/ip.
Само название этих регистров говорит о том, что они выполняют специфические функции в системе. Использование системных регистров жестко регламентировано. Именно они обеспечивают работу защищенного режима. Их также можно рассматривать как часть архитектуры микропроцессора, которая намеренно оставлена видимой для того, чтобы квалифицированный системный программист мог выполнить самые низкоуровневые операции.
Системные регистры можно разделить на три группы:
В группу
регистров управления входят 4 регистра:
cr0, cr1, cr2, cr3.
Эти регистры предназначены
для общего управления системой.
Регистры управления доступны только программам с уровнем привилегий 0.
Хотя микропроцессор имеет четыре регистра управления, доступными являются только три из них — исключается cr1, функции которого пока не определены (он зарезервирован для будущего использования).
Регистр cr0 содержит системные
флаги, управляющие режимами работы микропроцессора и отражающие его
состояние глобально, независимо от конкретных выполняющихся задач.
Назначение системных флагов:
Регистр cr2
используется при страничной организации оперативной памяти для регистрации
ситуации, когда текущая команда обратилась по адресу, содержащемуся в странице
памяти, отсутствующей в данный момент времени в памяти.
В такой ситуации в микропроцессоре возникает исключительная ситуация с номером
14, и линейный 32-битный адрес команды, вызвавшей это исключение, записывается
в регистр cr2. Имея эту информацию, обработчик исключения 14
определяет нужную страницу, осуществляет ее подкачку в память и возобновляет
нормальную работу программы;
Регистр cr3 также
используется при страничной организации памяти.
Это так называемый регистр каталога страниц первого уровня. Он
содержит 20-битный физический базовый адрес каталога страниц текущей задачи.
Этот каталог содержит 1024 32-битных дескриптора, каждый из которых содержит
адрес таблицы страниц второго уровня. В свою очередь каждая из таблиц страниц
второго уровня содержит 1024 32-битных дескриптора, адресующих страничные кадры
в памяти. Размер страничного кадра — 4 Кбайт.
Эти
регистры еще называют регистрами управления памятью.
Они предназначены для защиты программ и данных в мультизадачном режиме работы
микропроцессора.
При работе в защищенном режиме микропроцессора адресное пространство делится на:
Этим разделением и объясняется присутствие в архитектуре микропроцессора следующих системных регистров:
Это очень интересная группа регистров, предназначенных для аппаратной отладки. Средства аппаратной отладки впервые появились в микропроцессоре i486. Аппаратно микропроцессор содержит восемь регистров отладки, но реально из них используются только 6.
Регистры dr0, dr1, dr2, dr3 имеют разрядность 32 бит и предназначены для задания линейных адресов четырех точек прерывания. Используемый при этом механизм следующий: любой формируемый текущей программой адрес сравнивается с адресами в регистрах dr0...dr3, и при совпадении генерируется исключение отладки с номером 1.
Регистр dr6 называется регистром состояния отладки. Биты этого регистра устанавливаются в соответствии с причинами, которые вызвали возникновение последнего исключения с номером 1.
Перечислим эти биты и их назначение:
Все остальные биты в этом регистре заполняются нулями. Обработчик исключения 1 по содержимому dr6 должен определить причину, по которой произошло исключение, и выполнить необходимые действия.
Регистр dr7 называется регистром управления отладкой. В нем для каждого из четырех регистров контрольных точек отладки имеются поля, с помощью которых можно уточнить следующие условия, при которых следует сгенерировать прерывание: