Страница:
предварительную выборку) и после выполнения команды процессор
автоматически увеличивает его на I. Содержимое счетчика команд
меняется по прерываниям, в особых и при выполнении команд меняется
по прерываниям, в особых случаях и при выполнении команд передачи
управления, например, переходах и вызовах.
2.1.3 Регистры математического сопроцессора
Регистры математического сопроцессора, показанные на рис.2-3,
повышают производительность систем с большим объемом вычислений.
При подключении к 80386 математического сопроцессора 80287 или
80387 эти регистры добавляются к 80386. Хотя математический
сопроцессор распознает форматы целых, упакованных десятичных и
чисел с плавающей запятой различной длины, внутри него все
величины хранятся в формате с плавающей запятой в регистровом
стеке 8х80 бит. В математических операциях могут быть как неявные
ссылки на верхние элементы стека, так и явные на другие регистры.
Статусный регистр содержит указатель вершины стека, флаги,
идентифицирующие особые случаи (например, переполнение) и коды
состояний, отражающие результат последней команды. Регистр
управления содержит биты вариантов и масок, которые программист
может устанавливать для выбора алгоритма округления, интерпретации
бесконечности, а также задания того, как будут обрабатываться
особые случаи - сопроцессором или программно.
1-REGISTER STACK
79 78 64 65 0
+----------------------------------------+
| | SIGNIFICAND | EXSPONENT |
+--+---------------+---------------------|
| | 2 | 3 |
+--+---------------+---------------------|
| | | |
+--+---------------+---------------------|
| | | |
+--+---------------+---------------------|
| | | |
+--+---------------+---------------------|
| | | |
+----------------------------------------+
15 0
+---------------------+
4 -| CONTHOL REGISTER |
+---------------------|
5 -| STATUS REGISTER |
+---------------------+
Рис.2-3 Регистры математического сопроцессора; 1 -
регистровый стек; 2 - порядок; 3 - мантисса; 4 - регистр
управления; 5 - регистр статуса.
2.2 Память и логическая адресация
Для адресации операндов в 4г байтном физическом адресном
пространстве прикладные программы 80386 используют логическую
адресацию. Процессор автоматически транслирует эти логические
адреса в физические, которые затем выдаются на системную
магистраль. Как будет рассмотрено более подробно в главе 3,
операционная система 80386 может перестраивать представление
прикладной программы о ее логическом адресном пространстве.
Например, операционная система 80386 может определить логическое
адресное пространство так, как это делается во многих архитектурах
, а именно, как простой массив из 2 байт. С другой стороны, она
может организовать логическое адресное пространство как набор
сегментов переменной длины. Операционная система может определить
как большое число сегментов, так и всего несколько, в зависимости
от ее представления о логической памяти; 80386 не диктует
конкретное использование сегментов и позволяет использовать их
так, как того требует данное применение. Читая дальнейшие разделы,
следует помнить о том, что степень активного использования
сегментов прикладной программой зависит от того, как они
организованы операционной системой.
2.2.1 Сегменты
Как было отмечено выше, операционная система может определить
адресное пространство как один или несколько сегментов. Сегменты
являются логическими блоками, хорошо приспособленными под
программные структуры, которые по сути своей имеют переменную
длину. Например, 1516-байтная процедура полностью содержит
сегменте 1516 байт, так же, как и 8 мегабайтный массив (например,
дисплейный буфер 1028X1028X8) полностью входит в сегмент такого же
размера. Имея для сегментов соответствующие архитектурные решения,
80386 повышает производительность систем, в которых механизм
структурирования основан на сегментах. (Страницы, которые
рассматриваются в главе 3, имеют фиксированные размеры; они не
приспособлены под программные структуры, но, с другой стороны,
более подходят для таких функций операционной системы, как,
например, пересылки между ОЗУ и диском).
Сегмент в системе 80386 может иметь любой размер от 1 байта до
4гбайт. Для каждого сегмента операционная система поддерживает
' $ --k) архитектурой дескриптор, содержащий описание сегмента.
Описание сегмента включает в себя 32-битный базовый адрес и длину
сегмента, а также информацию о защите, предотвращающей
неправильное использование сегмента. Ввиду того, что дескрипторы
поддерживаются операционными системами, их рассмотрение
откладывается до главы 3. Прикладные программы пользуются
дескрипторами лишь косвенно, обращаясь к сегментам с помощью
логических адресов.
2.2.2 Логические адреса
Ввиду того, что программа может в принципе обращаться к
нескольким сегментам, логический адрес 80386 должен
идентифицировать сегмент. Поэтому логический адрес 80386 состоит
из двух частей, 16-битного селектора сегмента и 32-битного
смещения в выбранном сегменте (см. Рис.2-4). После селектора в
логическом адресе указывает на дескриптор сегмента. В принципе
процессор определяет адрес сегмента с помощью селектора, как
указателя для таблицы дескрипторов, поддерживаемой операционной
системой. Добавление смещения логического адреса к базовому
адресу, полученному по дескриптору сегмента, дает адрес операнда.
1 - ЛОГИЧЕСКИЙ АДРЕС 2 - СЕГМЕНТ
+---------------+
47 3 31 32 4 0 | | |
+-------------------------+ | | |
| СЕЛЕКТОР | СМЕЩЕНИЕ | | | |
+-------------------------+ | | |
| | | 5 | | 7
| | +-----------| |
| +--------------?| ОПЕРАНД | | ДО 2
| | +-----------| |
| ТАБЛИЦА ДЕСКРИПТОРОВ | | | | БАЙТ
| +-----------------+ | | | |
| | | | | | |
| | | +-----?| | |
| | 8 | | | | |
| +-----------------+ | +-----------+ |
+--?| ДЕСКРИПТОР ------ ----
+-----------------+
| |
| |
+-----------------+
Рис.2-4.
2.2.3 Регистры сегментов и дескрипторов
Для повышения эффективности логической адресации в 80386
введено 6 регистров сегментов и дескрипторов (см. Рис.2-5) 1.
1 - СЕГМЕНТ 2 - ДЕСКРИПТОР
15 0 63 0
+---------------+ +------------------------------+
| 3-селектор | |4-базовый адрес, размер и т.д.| 5 КОДОВЫЙ СЕГМЕНТ
| | | |
+---------------| +------------------------------|
| | | | 6 СТЕК
+---------------| +------------------------------|
| | | | 7 ДАННЫЕ
+---------------| +------------------------------|
| | | | 7
+---------------| +------------------------------|
| | | | 7
+---------------| +------------------------------|
| | | | 7
+---------------+ +------------------------------+
Фактически эти регистры используются как программно
управляемый кэш, позволяющий исключить из большинства команд
селекторы и производить трансляцию большинства логических адресов
внутри кристалла без обращений к таблице дескрипторов.
Адресные ссылки в большинстве программ производятся в
небольших адресных диапазонах (такая "локальность ссылок" делают
виртуальную память практичной). Например, если процедура хранится
в сегменте, то вероятнее всего большое число команд будет считано
из сегмента прежде, чем управление перейдет к другой процедуре в
другом сегменте. Локальность ссылок в 80386 обеспечивается
программно, путем запоминания во внутренних регистрах последних
использовавшихся селекторов и дескрипторов. Внутреннее хранение
дескрипторов позволяет транслировать большинство логических
адресов без обращений к памяти, занимающих много времени. В любой
момент времени можно адресовать до шести сегментов: кодовый
сегмент, сегмент стека и четыре сегмента данных. В сегментных
регистрах CS, SS, DS, ES, FS и GS хранятся селекторы этих
сегментов. Их дескрипторы хранятся в соответствующих регистрах
дескрипторов. В случае необходимости программа может сделать
адресуемым новый сегмент с помощью загрузки селектора нового
сегмента в сегментный регистр. Процессор автоматически
поддерживает регистры дескрипторов, загружая требуемый дескриптор
каждый раз, когда программа меняет
сегментный регистр. (Фактически, регистры дескрипторов могут
загружаться только процессором; программе они не доступны).
Счетчик команд содержит смещение текущей команды в текущем кодовом
сегменте (определяемом регистром CS), а регистр ESP содержит
смещение вершины стека в текущем сегменте стека (определяемом
регистром SS).Высокая эффективность дешифрации команд достигается
для большинства из них благодаря отсутствию явных ссылок на
сегментные регистры. Например, в командах перехода и занесение в
стек ссылки, соответственно, на регистры CS и SS, делаются неявно.
В случае необходимости программист может указать процессору на
использование конкретного сегмента в данной команде, что
осуществляется путем добавления перед командой однобайтного
префикса перемены сегмента. Префикс указывает процессору на
регистр сегмента, который должен использоваться в трансляции
адреса в следующей за префиксом команде.
Сегмент, базовый адрес которого равен 0, а предельный размер -
4 Гбайт, определяет 4 гигабайтное логическое адресное
пространство. Поскольку процессор выбирает сегментный регистр
автоматически, то команда может ссылаться на операнд в любой
ячейке этого 4гбайтного пространства с помощью 32-битного
смещения. Если, как показано на рис.2-6, Все регистры дескрипторов
будут загружены базовым адресом 0 к предельным размерам 4гбайт, то
в этом случае сегменты исчезают. Любой байт в логическом адресном
пространстве, независимо от того, командный это байт или байт
данных, или же элемент стека, адресуется с помощью простого 32-
байтного смещения. Таким образом, сегментные регистры дают 80386
шесть одновременно адресуемых логических адресных пространств
размером до 4 Гбайт каждое. В том случае, если эти сегменты
совпадают, то программа будет располагать одним 4гбайтным
+.#(g%a*(, адресным пространстве, идентичным такому пространству,
которое обеспечивается менее гибкими 32-битными архитектурами.
2.2.4 Способы адресации
Микропроцессор 80386 обеспечивает регистровую и
непосредственную адресацию операндов, содержащихся, соответствен
но, в регистрах или командах. Еще более важным является
способность 80386 обеспечивать различные способы адресации
необходимые для эффективного обращения к таким элементам структур
данных в памяти как массивы, записи (структуры), массивы записей и
записи, содержащие массивы. При этом программа определяет поле
смещения в логическом адресе по одному из способов адресации
памяти в 80386. Процессор 80386 вычисляет поле смещения
логического адреса по следующей формуле:
смещение = база + (индекс X масштаб) + отклонение
Для вычисления смещения могут быть использованы любые или все
переменные базы, индекса и отклонения. Переменные базы и индекса
являются величинами, хранящимися в общих регистрах, а величина
отклонения содержится в команде. Для хранения базы или индекса
может быть использован любой общий регистр. Величина в индексном
регистре может быть отмасштабирована (умножена) коэффициентом
1,2,4 или 8, что дает возможность делать ссылки на элементы
массива или записи соответствующей длины. Величина отклонения
может иметь разрядность 8 или 32 бит и интерпретируется
процессором как величина со знаком в дополнительном коде.
Разумные комбинации базы, индекса и отклонения дают следующие
способы адресации памяти 80386:
- прямая: используется только отклонение;
- регистровая косвенная: используется только база;
- базовая: используется база + отклонение;
- индексная: используется индекс (в масштабе);
- индексная с отклонением: используется индекс (в масштабе) +
отклонение;
- базовая индексная: используется база + индекс (в масштабе);
- базовая индексная с отклонением: используется база + индекс
(в масштабе) + отклонение;
2.3 Типы данных и команды
В данном разделе будут рассмотрены команды, чаще всего
используемые программистами. Поскольку большинство команд
оперирует с конкретными типами данных (например, с целыми), эти
типы и команды рассматриваются совместно. Привилегированные
команды, включая те, которые осуществляют ввод/вывод и обработку
прерываний будут рассмотрены в главе 3.
2.3.1 Главные типы данных
В табл. 2-1 Перечислены типы данных и команды, обеспечиваемые
процессором 80386. В этой таблице приведены только наиболее
употребимые команды. Варианты команд, такие как (в случае
циклического сдвига) циклический сдвиг вправо и циклический сдвиг
через перенос, также опущены.
Таблица 2-1
ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ
+------------------------------------------------------------------------------+
| ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ 3
+--------------+----------------+----------------------------------------------|
| ЦЕЛОЕ, | 8, 16, 32 БИТ | ПЕРЕСЫЛКА, ОБМЕН, ПРЕОБРАЗОВАНИЕ, ПРОВЕРКА, |
| ПОРЯДКОВОЕ | | СРАВНЕНИЕ, ПЕРЕВОД, СДВИГ, ДВОЙНОЙ, СДВИГ, |
| | | ЦИКЛИЧЕСКИЙ СДВИГ, ОТРИЦАНИЕ, ЛОГИЧЕСКОЕ "И",|
| | | "ИЛИ", ИСКЛЮЧАЮЩЕЕ "ИЛИ". |
| | | |
| | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, |
| | | УВЕЛИЧЕНИЕ НА 1, УМЕНЬШЕНИЕ НА 1, ПЕРЕВОД |
| | | (ПЕРЕСЫЛКА С РАСШИРЕНИЕМ ЗНАКА/НОЛЯ) |
+------------------------------------------------------------------------------+
+------------------------------------------------------------------------------+
|НЕУПАКОВАННОЕ | 1 ЦИФРА | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ, |
| ДЕСЯТИЧНОЕ | | УМНОЖЕНИЯ, ДЕЛЕНИЯ |
+--------------+----------------+----------------------------------------------|
| УПАКОВАННОЕ | 2 ЦИФРЫ | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ |
| ДЕСЯТИЧНОЕ | | |
+--------------+----------------+----------------------------------------------|
| СТРОКА | 0-4 ГБАЙТ СЛОВ | ПЕРЕСЫЛКА, ЗАГРУЗКА, ЗАПОМИНАНИЕ, |
| БАЙТОВ, СЛОВ,| ДВОЙНЫХ СЛОВ | СРАВНЕНИЕ, ПРОСМОТР, ПОВТОР |
| ДВОЙНЫХ СЛОВ | | |
+--------------+----------------+----------------------------------------------|
| СТРОКА БИТ | 1-4ГБИТ | ПРОВЕРКА, ПРОВЕРКА И УСТАНОВКА, |
| | | ПРОВЕРКА И ГАШЕНИЕ, ПРОВЕРКА И ДОПОЛНЕНИЕ, |
| | | ПРОСМОТР, ВСТАВЛЕНИЕ, ИЗЪЯТИЕ |
+--------------+----------------+----------------------------------------------|
| ЛОКАЛЬНЫЙ | 32 БИТ | (СМ. ПОРЯДКОВОЕ) |
| УКАЗАТЕЛЬ | | |
+--------------+----------------+----------------------------------------------|
| ГЛОБАЛЬНЫЙ | 48 БИТ | ЗАГРУЗКА |
| УКАЗАТЕЛЬ | | 3
+------------------------------------------------------------------------------+
Примечание: Локальный указатель - 32 битное смещение в сегменте,
определенном одной из регистрированных пар сегмента/дескриптора.
Глобальный указатель - это полный логический адрес, состоящий из
селектора и смещения. На рис.2-7 показаны примеры того, как
главные типы данных хранятся в памяти. Многобайтные элементы могут
размещаться с любого адреса байта в зависимости от структуры
магистрали, для обращения к операндам, размещенным по адресу, не
кратным длине операнда в байтах, могут потребоваться
дополнительные магистральные циклы. Поэтому для высокой
производительности, не зависящей от структуры магистрали,
большинство программ ориентируют словные операнды из двойных слов
на границах двойных слов и т.п.
| 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА-1
+------------------------------------------------------------
---------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2
7 0
+-------+
| |3
| | БАЙТ ПОРЯДКОВОГО
+-------+
+-----------+
4 |
ВЕЛИЧИНА --------
31 0
+------------------------+
| | |5
| | | ДВОЙНОЕ СЛОВО ЦЕЛОГО
+------------------------+
-------- ВЕЛИЧИНА - 4 -
L------- ЗНАК 6
7 0
+-------+
| |7
| | НЕУПАКОВАННОЕ
L-------- ДЕСЯТИЧНОЕ
7 3 0
+-------+
| | |8
| | | УПАКОВАННОЕ
L---+---- ДЕСЯТИЧНОЕ
+------- ------------------------+
| | | | | | | 9
| | | | | | | СТРОКА БАЙТОВ
+------- ------------------------+
10 МЛАДШИЙ БАЙТ -------
31 0
+-----------------------+
| | 11
| | ЛОКАЛЬНЫЙ УКАЗАТЕЛЬ
+-----------------------+
47 31 0
+--------------------------------+
| | | 12
| 13 | 14 | ГЛОБАЛЬНЫЙ УКАЗАТЕЛЬ
+--------------------------------+
+--------------------------------+
СЕЛЕКТОР СМЕЩЕНИЕ
2.3.2 Типы данных математического сопроцессора
Математический сопроцессор 80287 или 80387 добавляют к типам
данных и командам процессора 80386 свои, приведенные в табл.2-2. В
большинстве прикладных задач входные величины и получаемые
результаты хранятся в виде типов целых, действительных или
упакованных десятичных, а для промежуточных величин имеется тип
данных промежуточное действительное, расширенный диапазон и
точность которого в сложных вычислениях сводят к минимуму ошибки
округления, переполнения и исчезновения порядка. В соответствии с
такой моделью математический сопроцессор производит большую часть
вычислений над промежуточными величинами, хранящимися в его
регистрах. При загрузке любого типа данных в регистровый стек,
этот тип автоматически меняется на промежуточный действительный.
Промежуточная действительная величина в регистре, в свою очередь,
может быть переведена в любой другой тип с помощью команды
запоминания.
На рис.2-8 Показано, как типы данных математического
сопроцессора хранятся в памяти.
Таблица 2-2
ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ МАТЕМАТИЧЕСКОГО
СОПРОЦЕССОРА
+------------------------------------------------------------------------+
| ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ
|
+------------------------------------------------------------------------+
+------------------------------------------------------------------------+
| ЦЕЛОЕ | 16,32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ, |
| | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ |
+--------------+--------------+------------------------------------------|
| УПАКОВАННОЕ | 18 ЦИФР | ЗАГРУЗКА, ЗАПОМИНАНИЕ |
| ДЕСЯТИЧНОЕ | | |
+------------------------------------------------------------------------+
+------------------------------------------------------------------------+
|ДЕЙСТВИТЕЛЬНОЕ| 32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ |
| | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ |
+--------------+--------------+------------------------------------------|
|ПРОМЕЖУТОЧНОЕ | 80 БИТ | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, |
|ДЕЙСТВИТЕЛЬНОЕ| | ИЗВЛЕЧЕНИЕ, КВАДРАТНОГО КОРНЯ, |
| | | МАСШТАБИРОВАНИЕ ОСТАТКА, ВЫЧИСЛЕНИЕ |
| | | ЧАСТИ ЦЕЛОГО, СМЕНА ЗНАКА, ВЫЧИСЛЕНИЕ |
| | | АБСОЛЮТНОЙ ВЕЛИЧИНЫ, ВЫДЕЛЕНИЕ ПОРЯДКА |
| | | И МАНТИССЫ, СРАВНЕНИЕ, ОСМОТР, ПРОВЕРКА, |
| | | ОБМЕН, АРКТАНГЕНС, 2-1,Y*LOG(X+1), |
| | | Y*LOG(X), ЗАГРУЗКА КОНСТАНТЫ (0.0, П, И |
| | | Т.Д.) (80387 ДОБАВЛЯЕТ СИНУС, КОСИНУС, |
| | | СИНУС И КОСИНУС, НЕУПОРЯДОЧЕННОЕ |
| | | СРАВНЕНИЕ). |
+------------------------------------------------------------------------+
+-------------------------------------------------------------------+
| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА - 1 |
+-------------------------------------------------------------------+
--------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2
79 71 3 0
--------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ УПАКОВОЧНОЕ
| | | | | | | | | | | | | | | | | | | ДЕСЯТИЧНОЕ
+-----------------------------------------+ 5
| L-------- 4 ВЕЛИЧИНА ----------------
L------- ЗНАК - 3
31 23 0
+----------------------+ 7
| | | | НЕПОЛНОЕ
| | | | ДЕЙСТВИТЕЛЬНОЕ
+----------------------+
|L---T---L- ВЕЛИЧИНА --
| L-------- СМЕЩЕННЫЙ ПОРЯДОК 6
L------------- ЗНАК
60 51 0
+--------------------------------------------+ 8
| | | | ПОЛНОЕ
| | | | ДЕЙСТВИТЕЛЬНОЕ
+--------------------------------------------+
| +-------------+ +------- ВЕЛИЧИНА ---------
| L------ СМЕЩЕННЫЙ ПОРЯДОК
L--------------- ЗНАК
79 62 0
--T-----------T--T---------------------------+ ПРОМЕЖУТОЧНОЕ
| | | | | ДЕЙСТВИЕ
+--------------------------------------------+ 9
| L-----T------ L------ 4 ВЕЛИЧИНА ---------
| L------------------ СМЕЩЕННЫЙ ПОРЯДОК
L------- ЗНАК - 3
Рис.2-8.Примеры хранения типов данных математического
сопроцессора
2.3.3 Другие команды
Не все команды процессора 80386 связаны с типами данных. Такие
команды рассматриваются в нижеследующих параграфах.
2.3.3.1Команды операций со стеком
Стек процессора 80386 является стеком двойных слов, основание
и вершина которого определяются регистрами, соответственно, SS и
ESP. Команда PUSH заносит двойное слово в стек, а команда POP
извлекает с вершины стека двойное слово и хранит его в регистре
памяти или в памяти. По команде PUSH ALL в стек заносятся все
общие регистры, а по команде POP ALL производится обратная
операция. Команда INTER (входа в процедуру) и LEAVE (выхода из
процедуры) предназначены для языков высокого уровня с блочной
структурой. По команде ENTER создается кадр и образ стека, которые
компиляторы используют для связки вызовов процедур. По команде
LEAVE кадр стека и образ удаляются из стека для подготовки
возврата к процедуре, сделавшей вызов.
2.3.3.2Команды передачи управления
Команда JUMP (переход) передает управление другой команде
путем замены содержимого счетчика команд. Новая команда может быть
в том же кодовом сегменте (со смещение до 2 байт) или совсем в
другом. Операндом внутрисегментного перехода является локальный
указатель, т.е. смещение новой команды в текущем кодовом сегменте;
переход таким образом, может быть сделан к любой ячейке в
максимально возможном сегменте. Операндом межсегментного перехода
является глобальный указатель, что позволяет передавать управление
в любую точку сегмента. (Поле селектора в глобальном указателе
замещает величину в регистре CS, а поле смещение - величину в
EIP). В системе команд также имеется полный набор команд условных
переходов, ветвление которых основано на величине флага статуса;
эти команды могут передавать управление ячейкам, которые также
смещены на максимум 2 байта.
Вызов процедур и функций (подпрограмм) производится по
командам CALL (вызов), а возврат к вызывавшей подпрограмме
осуществляется с помощью команды RETURN (возврат). Так же, как
команды перехода, вызовы внутри сегмента имеют своими операндами
локальный указатель, задающий новую величину в счетчике команд, а
вызовы между сегментами используют в качестве операндов глобальный
указатель, который кроме CS изменяет и величину EIP. По командам
вызова адрес следующей команды заносится в стек, после чего
производится загрузка счетчика команд (и регистра CS, если переход
делается в другой сегмент). По команде возврата сохраненные
величины извлекаются из стека в EIP и, если требуется, в CS.
Вызовы могут иметь бесконечную вложенность и рекурсивность,
ограниченные лишь размером стека.
Для управления циклами, помимо условных переходов, 80386
обеспечивает выполнение команд LOOP (безусловно и условного
цикла). Команды цикла в качестве счетчика циклов используют
регистр ECX; в каждом цикле ECX уменьшается на 1 и выполнение
*., -$k заканчивается, когда величина в ECX становится равной
нулю. Команды условных циклов заканчиваются в том случае, если
флаг содержит заданную величину. В то время как команды цикла
предназначены для проверок "в конце цикла", команда "переход",
если ECX=0 реализует проверку в начале цикла и позволяет выполнять
цикл 0 раз.
2.3.3.3Дополнительные команды
Команда BOUND (проверка границ) 80386 может быть использована
для проверки того, что индекс массива находится в его границах.
Процессор 80386 имеет также команды установки и гашения флагов,
загрузки и запоминания байта статуса регистра флагов.
Математический сопроцессор 80287 или 80387 добавляет команды,
необходимые операционной системе для его инициализации, обработки
особых случаев, а также для запоминания и восстановления статуса
сопроцессора.
Наконец, естественно, процессоре 80386 имеет команду "нет
операции".
СИСТЕМНАЯ АРХИТЕКТУРА
Назначение системной архитектуры заключается в обеспечении
операционных систем, однако операционные системы весьма различны
по своим требованиям. Для решения этой проблемы, процессор 80386
обеспечивает набор ресурсов, которые разработчики операционных
систем могут использовать по своему усмотрению. В результате
системная архитектура 80386 может быть сконфигурирована так, чтобы
удовлетворить всем требованиям разрабатываемой операционной
системы.
3.1Системные регистры
Кроме регистров, рассмотренных в предыдущей главе,
операционная система иногда использует регистры 80386, показанные
на рис.3-1. (Далее в этой главе эти регистры еще будут
рассматриваться; здесь они показаны для справки). В основном этими
регистрами пользуется сам 80386; операционная система лишь
инициализирует системные регистры и игнорирует их при нормальной
работе. Однако, операционная система может воспользоваться
системным регистром при обработке особого случая. Например, при
страничной ошибке процессор загружает ошибочный адрес в регистр
CR2; обработчик страничных ошибок операционной системы использует
этот адрес для поиска соответствующего элемента страничной
таблицы. Системные регистры обычно недопустимы прикладным
автоматически увеличивает его на I. Содержимое счетчика команд
меняется по прерываниям, в особых и при выполнении команд меняется
по прерываниям, в особых случаях и при выполнении команд передачи
управления, например, переходах и вызовах.
2.1.3 Регистры математического сопроцессора
Регистры математического сопроцессора, показанные на рис.2-3,
повышают производительность систем с большим объемом вычислений.
При подключении к 80386 математического сопроцессора 80287 или
80387 эти регистры добавляются к 80386. Хотя математический
сопроцессор распознает форматы целых, упакованных десятичных и
чисел с плавающей запятой различной длины, внутри него все
величины хранятся в формате с плавающей запятой в регистровом
стеке 8х80 бит. В математических операциях могут быть как неявные
ссылки на верхние элементы стека, так и явные на другие регистры.
Статусный регистр содержит указатель вершины стека, флаги,
идентифицирующие особые случаи (например, переполнение) и коды
состояний, отражающие результат последней команды. Регистр
управления содержит биты вариантов и масок, которые программист
может устанавливать для выбора алгоритма округления, интерпретации
бесконечности, а также задания того, как будут обрабатываться
особые случаи - сопроцессором или программно.
1-REGISTER STACK
79 78 64 65 0
+----------------------------------------+
| | SIGNIFICAND | EXSPONENT |
+--+---------------+---------------------|
| | 2 | 3 |
+--+---------------+---------------------|
| | | |
+--+---------------+---------------------|
| | | |
+--+---------------+---------------------|
| | | |
+--+---------------+---------------------|
| | | |
+----------------------------------------+
15 0
+---------------------+
4 -| CONTHOL REGISTER |
+---------------------|
5 -| STATUS REGISTER |
+---------------------+
Рис.2-3 Регистры математического сопроцессора; 1 -
регистровый стек; 2 - порядок; 3 - мантисса; 4 - регистр
управления; 5 - регистр статуса.
2.2 Память и логическая адресация
Для адресации операндов в 4г байтном физическом адресном
пространстве прикладные программы 80386 используют логическую
адресацию. Процессор автоматически транслирует эти логические
адреса в физические, которые затем выдаются на системную
магистраль. Как будет рассмотрено более подробно в главе 3,
операционная система 80386 может перестраивать представление
прикладной программы о ее логическом адресном пространстве.
Например, операционная система 80386 может определить логическое
адресное пространство так, как это делается во многих архитектурах
, а именно, как простой массив из 2 байт. С другой стороны, она
может организовать логическое адресное пространство как набор
сегментов переменной длины. Операционная система может определить
как большое число сегментов, так и всего несколько, в зависимости
от ее представления о логической памяти; 80386 не диктует
конкретное использование сегментов и позволяет использовать их
так, как того требует данное применение. Читая дальнейшие разделы,
следует помнить о том, что степень активного использования
сегментов прикладной программой зависит от того, как они
организованы операционной системой.
2.2.1 Сегменты
Как было отмечено выше, операционная система может определить
адресное пространство как один или несколько сегментов. Сегменты
являются логическими блоками, хорошо приспособленными под
программные структуры, которые по сути своей имеют переменную
длину. Например, 1516-байтная процедура полностью содержит
сегменте 1516 байт, так же, как и 8 мегабайтный массив (например,
дисплейный буфер 1028X1028X8) полностью входит в сегмент такого же
размера. Имея для сегментов соответствующие архитектурные решения,
80386 повышает производительность систем, в которых механизм
структурирования основан на сегментах. (Страницы, которые
рассматриваются в главе 3, имеют фиксированные размеры; они не
приспособлены под программные структуры, но, с другой стороны,
более подходят для таких функций операционной системы, как,
например, пересылки между ОЗУ и диском).
Сегмент в системе 80386 может иметь любой размер от 1 байта до
4гбайт. Для каждого сегмента операционная система поддерживает
' $ --k) архитектурой дескриптор, содержащий описание сегмента.
Описание сегмента включает в себя 32-битный базовый адрес и длину
сегмента, а также информацию о защите, предотвращающей
неправильное использование сегмента. Ввиду того, что дескрипторы
поддерживаются операционными системами, их рассмотрение
откладывается до главы 3. Прикладные программы пользуются
дескрипторами лишь косвенно, обращаясь к сегментам с помощью
логических адресов.
2.2.2 Логические адреса
Ввиду того, что программа может в принципе обращаться к
нескольким сегментам, логический адрес 80386 должен
идентифицировать сегмент. Поэтому логический адрес 80386 состоит
из двух частей, 16-битного селектора сегмента и 32-битного
смещения в выбранном сегменте (см. Рис.2-4). После селектора в
логическом адресе указывает на дескриптор сегмента. В принципе
процессор определяет адрес сегмента с помощью селектора, как
указателя для таблицы дескрипторов, поддерживаемой операционной
системой. Добавление смещения логического адреса к базовому
адресу, полученному по дескриптору сегмента, дает адрес операнда.
1 - ЛОГИЧЕСКИЙ АДРЕС 2 - СЕГМЕНТ
+---------------+
47 3 31 32 4 0 | | |
+-------------------------+ | | |
| СЕЛЕКТОР | СМЕЩЕНИЕ | | | |
+-------------------------+ | | |
| | | 5 | | 7
| | +-----------| |
| +--------------?| ОПЕРАНД | | ДО 2
| | +-----------| |
| ТАБЛИЦА ДЕСКРИПТОРОВ | | | | БАЙТ
| +-----------------+ | | | |
| | | | | | |
| | | +-----?| | |
| | 8 | | | | |
| +-----------------+ | +-----------+ |
+--?| ДЕСКРИПТОР ------ ----
+-----------------+
| |
| |
+-----------------+
Рис.2-4.
2.2.3 Регистры сегментов и дескрипторов
Для повышения эффективности логической адресации в 80386
введено 6 регистров сегментов и дескрипторов (см. Рис.2-5) 1.
1 - СЕГМЕНТ 2 - ДЕСКРИПТОР
15 0 63 0
+---------------+ +------------------------------+
| 3-селектор | |4-базовый адрес, размер и т.д.| 5 КОДОВЫЙ СЕГМЕНТ
| | | |
+---------------| +------------------------------|
| | | | 6 СТЕК
+---------------| +------------------------------|
| | | | 7 ДАННЫЕ
+---------------| +------------------------------|
| | | | 7
+---------------| +------------------------------|
| | | | 7
+---------------| +------------------------------|
| | | | 7
+---------------+ +------------------------------+
Фактически эти регистры используются как программно
управляемый кэш, позволяющий исключить из большинства команд
селекторы и производить трансляцию большинства логических адресов
внутри кристалла без обращений к таблице дескрипторов.
Адресные ссылки в большинстве программ производятся в
небольших адресных диапазонах (такая "локальность ссылок" делают
виртуальную память практичной). Например, если процедура хранится
в сегменте, то вероятнее всего большое число команд будет считано
из сегмента прежде, чем управление перейдет к другой процедуре в
другом сегменте. Локальность ссылок в 80386 обеспечивается
программно, путем запоминания во внутренних регистрах последних
использовавшихся селекторов и дескрипторов. Внутреннее хранение
дескрипторов позволяет транслировать большинство логических
адресов без обращений к памяти, занимающих много времени. В любой
момент времени можно адресовать до шести сегментов: кодовый
сегмент, сегмент стека и четыре сегмента данных. В сегментных
регистрах CS, SS, DS, ES, FS и GS хранятся селекторы этих
сегментов. Их дескрипторы хранятся в соответствующих регистрах
дескрипторов. В случае необходимости программа может сделать
адресуемым новый сегмент с помощью загрузки селектора нового
сегмента в сегментный регистр. Процессор автоматически
поддерживает регистры дескрипторов, загружая требуемый дескриптор
каждый раз, когда программа меняет
сегментный регистр. (Фактически, регистры дескрипторов могут
загружаться только процессором; программе они не доступны).
Счетчик команд содержит смещение текущей команды в текущем кодовом
сегменте (определяемом регистром CS), а регистр ESP содержит
смещение вершины стека в текущем сегменте стека (определяемом
регистром SS).Высокая эффективность дешифрации команд достигается
для большинства из них благодаря отсутствию явных ссылок на
сегментные регистры. Например, в командах перехода и занесение в
стек ссылки, соответственно, на регистры CS и SS, делаются неявно.
В случае необходимости программист может указать процессору на
использование конкретного сегмента в данной команде, что
осуществляется путем добавления перед командой однобайтного
префикса перемены сегмента. Префикс указывает процессору на
регистр сегмента, который должен использоваться в трансляции
адреса в следующей за префиксом команде.
Сегмент, базовый адрес которого равен 0, а предельный размер -
4 Гбайт, определяет 4 гигабайтное логическое адресное
пространство. Поскольку процессор выбирает сегментный регистр
автоматически, то команда может ссылаться на операнд в любой
ячейке этого 4гбайтного пространства с помощью 32-битного
смещения. Если, как показано на рис.2-6, Все регистры дескрипторов
будут загружены базовым адресом 0 к предельным размерам 4гбайт, то
в этом случае сегменты исчезают. Любой байт в логическом адресном
пространстве, независимо от того, командный это байт или байт
данных, или же элемент стека, адресуется с помощью простого 32-
байтного смещения. Таким образом, сегментные регистры дают 80386
шесть одновременно адресуемых логических адресных пространств
размером до 4 Гбайт каждое. В том случае, если эти сегменты
совпадают, то программа будет располагать одним 4гбайтным
+.#(g%a*(, адресным пространстве, идентичным такому пространству,
которое обеспечивается менее гибкими 32-битными архитектурами.
2.2.4 Способы адресации
Микропроцессор 80386 обеспечивает регистровую и
непосредственную адресацию операндов, содержащихся, соответствен
но, в регистрах или командах. Еще более важным является
способность 80386 обеспечивать различные способы адресации
необходимые для эффективного обращения к таким элементам структур
данных в памяти как массивы, записи (структуры), массивы записей и
записи, содержащие массивы. При этом программа определяет поле
смещения в логическом адресе по одному из способов адресации
памяти в 80386. Процессор 80386 вычисляет поле смещения
логического адреса по следующей формуле:
смещение = база + (индекс X масштаб) + отклонение
Для вычисления смещения могут быть использованы любые или все
переменные базы, индекса и отклонения. Переменные базы и индекса
являются величинами, хранящимися в общих регистрах, а величина
отклонения содержится в команде. Для хранения базы или индекса
может быть использован любой общий регистр. Величина в индексном
регистре может быть отмасштабирована (умножена) коэффициентом
1,2,4 или 8, что дает возможность делать ссылки на элементы
массива или записи соответствующей длины. Величина отклонения
может иметь разрядность 8 или 32 бит и интерпретируется
процессором как величина со знаком в дополнительном коде.
Разумные комбинации базы, индекса и отклонения дают следующие
способы адресации памяти 80386:
- прямая: используется только отклонение;
- регистровая косвенная: используется только база;
- базовая: используется база + отклонение;
- индексная: используется индекс (в масштабе);
- индексная с отклонением: используется индекс (в масштабе) +
отклонение;
- базовая индексная: используется база + индекс (в масштабе);
- базовая индексная с отклонением: используется база + индекс
(в масштабе) + отклонение;
2.3 Типы данных и команды
В данном разделе будут рассмотрены команды, чаще всего
используемые программистами. Поскольку большинство команд
оперирует с конкретными типами данных (например, с целыми), эти
типы и команды рассматриваются совместно. Привилегированные
команды, включая те, которые осуществляют ввод/вывод и обработку
прерываний будут рассмотрены в главе 3.
2.3.1 Главные типы данных
В табл. 2-1 Перечислены типы данных и команды, обеспечиваемые
процессором 80386. В этой таблице приведены только наиболее
употребимые команды. Варианты команд, такие как (в случае
циклического сдвига) циклический сдвиг вправо и циклический сдвиг
через перенос, также опущены.
Таблица 2-1
ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ
+------------------------------------------------------------------------------+
| ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ 3
+--------------+----------------+----------------------------------------------|
| ЦЕЛОЕ, | 8, 16, 32 БИТ | ПЕРЕСЫЛКА, ОБМЕН, ПРЕОБРАЗОВАНИЕ, ПРОВЕРКА, |
| ПОРЯДКОВОЕ | | СРАВНЕНИЕ, ПЕРЕВОД, СДВИГ, ДВОЙНОЙ, СДВИГ, |
| | | ЦИКЛИЧЕСКИЙ СДВИГ, ОТРИЦАНИЕ, ЛОГИЧЕСКОЕ "И",|
| | | "ИЛИ", ИСКЛЮЧАЮЩЕЕ "ИЛИ". |
| | | |
| | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, |
| | | УВЕЛИЧЕНИЕ НА 1, УМЕНЬШЕНИЕ НА 1, ПЕРЕВОД |
| | | (ПЕРЕСЫЛКА С РАСШИРЕНИЕМ ЗНАКА/НОЛЯ) |
+------------------------------------------------------------------------------+
+------------------------------------------------------------------------------+
|НЕУПАКОВАННОЕ | 1 ЦИФРА | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ, |
| ДЕСЯТИЧНОЕ | | УМНОЖЕНИЯ, ДЕЛЕНИЯ |
+--------------+----------------+----------------------------------------------|
| УПАКОВАННОЕ | 2 ЦИФРЫ | КОРРЕКЦИЯ ДЛЯ СЛОЖЕНИЯ, ВЫЧИТАНИЯ |
| ДЕСЯТИЧНОЕ | | |
+--------------+----------------+----------------------------------------------|
| СТРОКА | 0-4 ГБАЙТ СЛОВ | ПЕРЕСЫЛКА, ЗАГРУЗКА, ЗАПОМИНАНИЕ, |
| БАЙТОВ, СЛОВ,| ДВОЙНЫХ СЛОВ | СРАВНЕНИЕ, ПРОСМОТР, ПОВТОР |
| ДВОЙНЫХ СЛОВ | | |
+--------------+----------------+----------------------------------------------|
| СТРОКА БИТ | 1-4ГБИТ | ПРОВЕРКА, ПРОВЕРКА И УСТАНОВКА, |
| | | ПРОВЕРКА И ГАШЕНИЕ, ПРОВЕРКА И ДОПОЛНЕНИЕ, |
| | | ПРОСМОТР, ВСТАВЛЕНИЕ, ИЗЪЯТИЕ |
+--------------+----------------+----------------------------------------------|
| ЛОКАЛЬНЫЙ | 32 БИТ | (СМ. ПОРЯДКОВОЕ) |
| УКАЗАТЕЛЬ | | |
+--------------+----------------+----------------------------------------------|
| ГЛОБАЛЬНЫЙ | 48 БИТ | ЗАГРУЗКА |
| УКАЗАТЕЛЬ | | 3
+------------------------------------------------------------------------------+
Примечание: Локальный указатель - 32 битное смещение в сегменте,
определенном одной из регистрированных пар сегмента/дескриптора.
Глобальный указатель - это полный логический адрес, состоящий из
селектора и смещения. На рис.2-7 показаны примеры того, как
главные типы данных хранятся в памяти. Многобайтные элементы могут
размещаться с любого адреса байта в зависимости от структуры
магистрали, для обращения к операндам, размещенным по адресу, не
кратным длине операнда в байтах, могут потребоваться
дополнительные магистральные циклы. Поэтому для высокой
производительности, не зависящей от структуры магистрали,
большинство программ ориентируют словные операнды из двойных слов
на границах двойных слов и т.п.
| 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА-1
+------------------------------------------------------------
---------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2
7 0
+-------+
| |3
| | БАЙТ ПОРЯДКОВОГО
+-------+
+-----------+
4 |
ВЕЛИЧИНА --------
31 0
+------------------------+
| | |5
| | | ДВОЙНОЕ СЛОВО ЦЕЛОГО
+------------------------+
-------- ВЕЛИЧИНА - 4 -
L------- ЗНАК 6
7 0
+-------+
| |7
| | НЕУПАКОВАННОЕ
L-------- ДЕСЯТИЧНОЕ
7 3 0
+-------+
| | |8
| | | УПАКОВАННОЕ
L---+---- ДЕСЯТИЧНОЕ
+------- ------------------------+
| | | | | | | 9
| | | | | | | СТРОКА БАЙТОВ
+------- ------------------------+
10 МЛАДШИЙ БАЙТ -------
31 0
+-----------------------+
| | 11
| | ЛОКАЛЬНЫЙ УКАЗАТЕЛЬ
+-----------------------+
47 31 0
+--------------------------------+
| | | 12
| 13 | 14 | ГЛОБАЛЬНЫЙ УКАЗАТЕЛЬ
+--------------------------------+
+--------------------------------+
СЕЛЕКТОР СМЕЩЕНИЕ
2.3.2 Типы данных математического сопроцессора
Математический сопроцессор 80287 или 80387 добавляют к типам
данных и командам процессора 80386 свои, приведенные в табл.2-2. В
большинстве прикладных задач входные величины и получаемые
результаты хранятся в виде типов целых, действительных или
упакованных десятичных, а для промежуточных величин имеется тип
данных промежуточное действительное, расширенный диапазон и
точность которого в сложных вычислениях сводят к минимуму ошибки
округления, переполнения и исчезновения порядка. В соответствии с
такой моделью математический сопроцессор производит большую часть
вычислений над промежуточными величинами, хранящимися в его
регистрах. При загрузке любого типа данных в регистровый стек,
этот тип автоматически меняется на промежуточный действительный.
Промежуточная действительная величина в регистре, в свою очередь,
может быть переведена в любой другой тип с помощью команды
запоминания.
На рис.2-8 Показано, как типы данных математического
сопроцессора хранятся в памяти.
Таблица 2-2
ГЛАВНЫЕ ТИПЫ ДАННЫХ И КОМАНДЫ МАТЕМАТИЧЕСКОГО
СОПРОЦЕССОРА
+------------------------------------------------------------------------+
| ТИП | РАЗРЯДНОСТЬ | КОМАНДЫ
|
+------------------------------------------------------------------------+
+------------------------------------------------------------------------+
| ЦЕЛОЕ | 16,32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ, |
| | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ |
+--------------+--------------+------------------------------------------|
| УПАКОВАННОЕ | 18 ЦИФР | ЗАГРУЗКА, ЗАПОМИНАНИЕ |
| ДЕСЯТИЧНОЕ | | |
+------------------------------------------------------------------------+
+------------------------------------------------------------------------+
|ДЕЙСТВИТЕЛЬНОЕ| 32,64 БИТ | ЗАГРУЗКА, ЗАПОМИНАНИЕ, СРАВНЕНИЕ |
| | | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ |
+--------------+--------------+------------------------------------------|
|ПРОМЕЖУТОЧНОЕ | 80 БИТ | СЛОЖЕНИЕ, ВЫЧИТАНИЕ, УМНОЖЕНИЕ, ДЕЛЕНИЕ, |
|ДЕЙСТВИТЕЛЬНОЕ| | ИЗВЛЕЧЕНИЕ, КВАДРАТНОГО КОРНЯ, |
| | | МАСШТАБИРОВАНИЕ ОСТАТКА, ВЫЧИСЛЕНИЕ |
| | | ЧАСТИ ЦЕЛОГО, СМЕНА ЗНАКА, ВЫЧИСЛЕНИЕ |
| | | АБСОЛЮТНОЙ ВЕЛИЧИНЫ, ВЫДЕЛЕНИЕ ПОРЯДКА |
| | | И МАНТИССЫ, СРАВНЕНИЕ, ОСМОТР, ПРОВЕРКА, |
| | | ОБМЕН, АРКТАНГЕНС, 2-1,Y*LOG(X+1), |
| | | Y*LOG(X), ЗАГРУЗКА КОНСТАНТЫ (0.0, П, И |
| | | Т.Д.) (80387 ДОБАВЛЯЕТ СИНУС, КОСИНУС, |
| | | СИНУС И КОСИНУС, НЕУПОРЯДОЧЕННОЕ |
| | | СРАВНЕНИЕ). |
+------------------------------------------------------------------------+
+-------------------------------------------------------------------+
| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ОТНОСИТЕЛЬНЫЕ АДРЕСА - 1 |
+-------------------------------------------------------------------+
--------------- ВОЗРАСТАНИЕ ПОРЯДКА - 2
79 71 3 0
--------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ УПАКОВОЧНОЕ
| | | | | | | | | | | | | | | | | | | ДЕСЯТИЧНОЕ
+-----------------------------------------+ 5
| L-------- 4 ВЕЛИЧИНА ----------------
L------- ЗНАК - 3
31 23 0
+----------------------+ 7
| | | | НЕПОЛНОЕ
| | | | ДЕЙСТВИТЕЛЬНОЕ
+----------------------+
|L---T---L- ВЕЛИЧИНА --
| L-------- СМЕЩЕННЫЙ ПОРЯДОК 6
L------------- ЗНАК
60 51 0
+--------------------------------------------+ 8
| | | | ПОЛНОЕ
| | | | ДЕЙСТВИТЕЛЬНОЕ
+--------------------------------------------+
| +-------------+ +------- ВЕЛИЧИНА ---------
| L------ СМЕЩЕННЫЙ ПОРЯДОК
L--------------- ЗНАК
79 62 0
--T-----------T--T---------------------------+ ПРОМЕЖУТОЧНОЕ
| | | | | ДЕЙСТВИЕ
+--------------------------------------------+ 9
| L-----T------ L------ 4 ВЕЛИЧИНА ---------
| L------------------ СМЕЩЕННЫЙ ПОРЯДОК
L------- ЗНАК - 3
Рис.2-8.Примеры хранения типов данных математического
сопроцессора
2.3.3 Другие команды
Не все команды процессора 80386 связаны с типами данных. Такие
команды рассматриваются в нижеследующих параграфах.
2.3.3.1Команды операций со стеком
Стек процессора 80386 является стеком двойных слов, основание
и вершина которого определяются регистрами, соответственно, SS и
ESP. Команда PUSH заносит двойное слово в стек, а команда POP
извлекает с вершины стека двойное слово и хранит его в регистре
памяти или в памяти. По команде PUSH ALL в стек заносятся все
общие регистры, а по команде POP ALL производится обратная
операция. Команда INTER (входа в процедуру) и LEAVE (выхода из
процедуры) предназначены для языков высокого уровня с блочной
структурой. По команде ENTER создается кадр и образ стека, которые
компиляторы используют для связки вызовов процедур. По команде
LEAVE кадр стека и образ удаляются из стека для подготовки
возврата к процедуре, сделавшей вызов.
2.3.3.2Команды передачи управления
Команда JUMP (переход) передает управление другой команде
путем замены содержимого счетчика команд. Новая команда может быть
в том же кодовом сегменте (со смещение до 2 байт) или совсем в
другом. Операндом внутрисегментного перехода является локальный
указатель, т.е. смещение новой команды в текущем кодовом сегменте;
переход таким образом, может быть сделан к любой ячейке в
максимально возможном сегменте. Операндом межсегментного перехода
является глобальный указатель, что позволяет передавать управление
в любую точку сегмента. (Поле селектора в глобальном указателе
замещает величину в регистре CS, а поле смещение - величину в
EIP). В системе команд также имеется полный набор команд условных
переходов, ветвление которых основано на величине флага статуса;
эти команды могут передавать управление ячейкам, которые также
смещены на максимум 2 байта.
Вызов процедур и функций (подпрограмм) производится по
командам CALL (вызов), а возврат к вызывавшей подпрограмме
осуществляется с помощью команды RETURN (возврат). Так же, как
команды перехода, вызовы внутри сегмента имеют своими операндами
локальный указатель, задающий новую величину в счетчике команд, а
вызовы между сегментами используют в качестве операндов глобальный
указатель, который кроме CS изменяет и величину EIP. По командам
вызова адрес следующей команды заносится в стек, после чего
производится загрузка счетчика команд (и регистра CS, если переход
делается в другой сегмент). По команде возврата сохраненные
величины извлекаются из стека в EIP и, если требуется, в CS.
Вызовы могут иметь бесконечную вложенность и рекурсивность,
ограниченные лишь размером стека.
Для управления циклами, помимо условных переходов, 80386
обеспечивает выполнение команд LOOP (безусловно и условного
цикла). Команды цикла в качестве счетчика циклов используют
регистр ECX; в каждом цикле ECX уменьшается на 1 и выполнение
*., -$k заканчивается, когда величина в ECX становится равной
нулю. Команды условных циклов заканчиваются в том случае, если
флаг содержит заданную величину. В то время как команды цикла
предназначены для проверок "в конце цикла", команда "переход",
если ECX=0 реализует проверку в начале цикла и позволяет выполнять
цикл 0 раз.
2.3.3.3Дополнительные команды
Команда BOUND (проверка границ) 80386 может быть использована
для проверки того, что индекс массива находится в его границах.
Процессор 80386 имеет также команды установки и гашения флагов,
загрузки и запоминания байта статуса регистра флагов.
Математический сопроцессор 80287 или 80387 добавляет команды,
необходимые операционной системе для его инициализации, обработки
особых случаев, а также для запоминания и восстановления статуса
сопроцессора.
Наконец, естественно, процессоре 80386 имеет команду "нет
операции".
СИСТЕМНАЯ АРХИТЕКТУРА
Назначение системной архитектуры заключается в обеспечении
операционных систем, однако операционные системы весьма различны
по своим требованиям. Для решения этой проблемы, процессор 80386
обеспечивает набор ресурсов, которые разработчики операционных
систем могут использовать по своему усмотрению. В результате
системная архитектура 80386 может быть сконфигурирована так, чтобы
удовлетворить всем требованиям разрабатываемой операционной
системы.
3.1Системные регистры
Кроме регистров, рассмотренных в предыдущей главе,
операционная система иногда использует регистры 80386, показанные
на рис.3-1. (Далее в этой главе эти регистры еще будут
рассматриваться; здесь они показаны для справки). В основном этими
регистрами пользуется сам 80386; операционная система лишь
инициализирует системные регистры и игнорирует их при нормальной
работе. Однако, операционная система может воспользоваться
системным регистром при обработке особого случая. Например, при
страничной ошибке процессор загружает ошибочный адрес в регистр
CR2; обработчик страничных ошибок операционной системы использует
этот адрес для поиска соответствующего элемента страничной
таблицы. Системные регистры обычно недопустимы прикладным