ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 24.12.2021
Просмотров: 12154
Скачиваний: 10

Общий обзор уровня архитектуры команд 343
Процессор 80386 был первой 32-разрядной машиной, выпущенной компанией
Intel. Все последующие процессоры (80486, Pentium, Pentium Pro, Pentium II,
Celeron и Хеоп) имеют точно такую же 32-разрядную архитектуру, которая назы-
вается
IA-32,
поэтому мы сосредоточим наше внимание именно на этой архитек-
туре. Единственным существенным изменением архитектуры со времен процес-
сора 80386 было введение команд ММХ в более поздние версии системы Pentium
и их включение
в
Pentium II и последующие процессоры.
Pentium II имеет 3 операционных режима, в двух из которых он работает как
8086. В
реальном режиме
все особенности, которые были добавлены к процессору
со времен системы 8088, отключаются, и Pentium II работает как простой компью-
тер 8088. Если программа совершает ошибку, то происходит полный отказ систе-
мы. Если бы компания Intel занималась разработкой человеческих существ, то
внутрь каждого человека был бы помещен бит, который превращает людей обрат-
но в режим шимпанзе (примитивный мозг, отсутствие речи, питание в основном
бананами и т.д.).
На следующей ступени находится
виртуальный режим 8086,
который делает
возможным выполнение старых программ, написанных для 8088, с защитой. Что-
бы запустить старую программу 8088, операционная система создает специальную
изолированную среду, которая работает как процессор 8088, за исключением того,
что если программа дает сбой, операционной системе передается соответствую-
щая информация и полного отказа системы не происходит. Когда пользователь
WINDOWS начинает работу с MS-DOS, ""рограмма, которая действует там, запус-
кается в виртуальном режиме 8086, чтобы программа WINDOWS не могла вме-
шиваться в программы MS-DOS.
Последний режим — это защищенный режим, в котором Pentium II работает
как Pentium II, а не как 8088. В этом режиме доступны 4 уровня привилегий, кото-
рые управляются битами во флаговом регистре. Уровень 0 соответствует приви-
легированному режиму на других компьютерах и имеет полный доступ к машине.
Этот уровень используется операционной системой. Уровень 3 предназначен для
пользовательских программ. Он блокирует доступ к определенным командам и ре-
гистрам управления, чтобы ошибки какой-нибудь пользовательской программы
не привели к поломке всей машины. Уровни 1 и 2 используются редко. Pentium II
имеет огромное адресное пространство. Память разделена на 16 384 сегмента, каж-
дый из которых идет от адреса 0 до адреса 2
3 J
-1. Однако большинство операцион-
ных систем (включая UNIX и все версии WINDOWS) поддерживают только один
сегмент, поэтому большинство прикладных программ видят линейное адресное
пространство в 2
32
байтов, а иногда часть этого пространства занимает сама опера-
ционная система. Каждый байт в адресном пространстве имеет свой адрес. Слова
состоят из 32 битов. Байты нумеруются справа налево (то есть самый первый адрес
соответствует самому младшему байту).
Регистры процессора Pentium II показаны на рис. 5.3. Первые четыре регистра
ЕАХ, ЕВХ, ЕСХ и EDX 32-битные. Это регистры общего назначения, хотя у каж-
дого из них есть определенные особенности. ЕАХ — основной арифметический
регистр; ЕВХ предназначен для хранения указателей (адресов памяти); ЕСХ свя-
зан с организацией циклов; EDX нужен для умножения и деления — этот регистр

344
Глава 5. Уровень архитектуры команд
вместе с ЕАХ содержит 64-битные произведения и делимые. Каждый из этих
регистров имеет 16-разрядный регистр в младших 16 битах и 8-разрядный регистр
в младших 8 битах. Данные регистры позволяют легко манипулировать 16-битны-
ми и 8-битными значениями соответственно. В компьютерах 8088 и 80286 есть
только 8-битные и 16-битные регистры. 32-битные регистры появились в системе
80386 вместе с приставкой Е (Extended — расширенный).
Следующие три регистра также являются регистрами общего назначения, но
с большей степенью специализации. Регистры ESI и EDI предназначены для хране-
ния указателей, особенно для команд манипулирования цепочками, где ESI ука-
зывает на входную цепочку, a EDI — на выходную цепочку. Регистр ЕВР тоже пред-
назначен для хранения указателей. Обычно он используется для указания на основу
текущего фрейма локальных переменных, как и регистр LV в машине IJVM. Такой
регистр обычно называют
указателем фрейма.
Наконец, регистр ESP — это указа-
тель стека.
Биты-*-
•16-
АН
А X
AL
ВН
В X
BL
сн
-с х
CL
DH
D X
DL
ЕАХ
ЕВХ
ЕСХ
EDX
ESI
EDI
ЕВР
ESP
CS
SS
DS
ES
FS
GS
EIP
EFLAGS
Рис.
5.3. Основные регистры процессора Pentium

Общий обзор уровня архитектуры команд 345
Следующая группа регистров от CS до GS — сегментные регистры. Это элект-
ронные трилобиты — атавизмы, оставшиеся от процессора 8088, который обращался
к 2
2О
байтам памяти, используя 16-битные адреса. Достаточно сказать, что когда
Pentium II установлен на использование единого линейного 32-битного адресного
пространства, их можно смело проигнорировать. Регистр EIP — это счетчик про-
грамм (Extended Instruction Pointer — расширенный указатель команд). Регистр
EFLAGS — это флаговый регистр.
Общий обзор уровня команд
системы UltraSPARC II
Архитектура SPARC была впервые введена в 1987 году компанией Sun Microsystems.
Эта архитектура была одной из первых архитектур промышленного назначения
типа RISC. Она была основана на исследовании, проведенном в Беркли в 80-е годы
[110,113]. Изначально система SPARC была 32-разрядной архитектурой, но Ultra-
SPARC II — это 64-разрядная машина, основанная на Version 9, и именно ее мы
будем описывать в этой главе. В целях согласованности с остальными частями
книги мы будем называть данную систему UltraSPARC II, хотя на уровне команд
все машины UltraSPARC идентичны.
Структура памяти машины UltraSPARC II очень проста: память представляет
собой линейный массив из 2
м
байтов. К сожалению, память настолько велика
(18 446 744 073 709 551 616 байтов), что в настоящее время ее невозможно реализо-
вать. Современные реализации имеют ограничение на размер адресного простран-
ства, к которому они могут обращаться
(2
й
байтов у UltraSPARC II), но в буду-
щем это число увеличится. Байты нумеруются слева направо, но нумерацию можно
изменить и сделать ее справа налево, установив бит во флаговом регистре.
Важно, что архитектура команд имеет больше байтов, чем требуе!ся для реали-
зации, поскольку в будущем, скорее в-его, понадобится увеличить размер памяти,
к которой может обращаться процессор. Одна из самых серьезных проблем при
разработке архитектур состоит в том, что архитектура команд ограничивает раз-
мер адресуемой памяти. В информатике существует один вопрос, который совер-
шенно невозможно разрешить: никогда не хватает того количества битов, которое
имеется в данный момент. Когда-нибудь ваши внуки спросят у вас, как же могли
работать компьютеры, которые содержат всего-навсего 32-битные адреса и только
4 Гбайт памяти.
Архитектура команд SPARC достаточно проста, хотя организация регистров
была немного усложнена, чтобы сделать вызовы процедур более эффективными.
Практика показывает, что организация регистров требует больших усилий и в об-
щем эти усилия не стоят того, но правило совместимости не позволяет избавиться
от этого.
В системе UltraSPARC II имеется две группы регистров: 32 64-битных регист-
ра общего назначения и 32 регистра с плавающей точкой. Регистры общего назна-
чения называются R0-R31, но в определенных контекстах используются другие
названия. Варианты названий регистров и их функции приведены в табл. 5.1.

3 4 6
Глава 5. Уровень архитектуры команд
Таблица 5 . 1 .
Регистры общего назначения в системе UltraSPARC II
Регистр Другой вариант названия Функция
RO
GO Связан с 0. То, что сохранено в этом регистре,
просто игнорируется
R1-R7 G1-G7 Содержит глобальные переменные
R8-R13 О0-О5 Содержит параметры вызываемой процедуры
R14 SP Указатель стека
R15
07 Временный регистр
R16-R23 L0-L7 Содержит локальные переменные для текущей
процедуры
R24-R29 I0-I5 Содержит входные параметры
R30 FP Указатель на основу текущего стекового фрейма
R31 17 Содержит адрес возврата для текущей процедуры
Все регистры общего назначения 64-битные. Все они, кроме R0, значение кото-
рого всегда равно 0, могут считываться и записываться при помощи различных
команд загрузки и сохранения. Функции, приведенные в табл. 5.1, отчасти опреде-
лены по соглашению, но отчасти основаны на том, как аппаратное обеспечение
обрабатывает их. Вообще не стоит отклоняться от этих функций, если вы не явля-
етесь крупным специалистом, блестяще разбирающимся в компьютерах SPARC.
Программист должен быть уверен, что программа правильно обращается к регист-
рам и выполняет над ними допустимые арифметические действия. Например, очень
легко загрузить числа с плавающей точкой в регистры общего назначения, а затем
произвести над ними целочисленное сложение, операцию, которая приведет к пол-
нейшей чепухе, но которую центральный процессор обязательно выполнит, если
этого потребует программа.
Глобальные переменные используются для хранения констант, переменных и
указателей, которые нужны во всех процедурах, хотя они могут загружаться и пе-
резагружаться при входе в процедуру и при выходе из процедуры, если нужно.
Регистры 1х и Ох используются для передачи параметров процедурам, чтобы из-
бежать обращений к памяти. Ниже мы расскажем, как это происходит.
Специальные регистры используются для особых целей. Регистры FP и SP
ограничивают текущий фрейм. Первый указывает на основу текущего фрейма и ис-
пользуется для обращения к локальным переменным, точно так же как LV на
рис. 4.9. Второй указывает на текущую вершину стека и изменяется, когда слова
помещаются в стек или выталкиваются оттуда. Значение регистра FP изменяется
только при вызове и завершении процедуры. Третий специальный регистр — R31.
Он содержит адрес возврата для текущей процедуры.
В действительности процессор UltraSPARC II имеет более 32 регистров общего
назначения, но только 32 из них видны для программы в любой момент времени.
Эта особенность, называемая
регистровыми окнами,
предназначена для повыше-
ния эффективности вызова процедур. Система регистровых окон проиллюстри-
рована рис. 5.4. Основная идея — имитировать стек, используя при этом регистры.
То есть существует несколько наборов регистров, точно так же как и несколько

Общий обзор уровня архитектуры команд
3 4 7
фреймов в стеке. Ровно 32 регистра общего назначения видны в любой момент.
Регистр CWP (Current Window Pointer — указатель текущего окна) следит за тем,
какой набор регистров используется в данный момент.
R0
R1
R7
GO
G1
G7
0
Глобальная перемена
Глобальная перемена
1
7
R8
R13
R14
R15
R16
R23
R24
R29
R30
R31
R0
R1
R7
GO
G1
G7
0
Глобальная
Глобальная
перемена 1
перемена 7
Альтернативное имя
ОО Выходной параметр О
OS Выходной параметр 5
SP Указатель стека
07 Промежуточный
L0 Локальная переменная О
L7 Локальная переменная 7
Ю
Входной параметр О
15 Входной параметр 5
FP Указатель фрейма
17 Адрес возврата
R8
R13
R14
R15
R16
R23
Перекрытие
R24
R29
R30
R31
CWP
уменьшается
при вызове
в этом
направлении
ОО
0 1
SP
07
Указатель стека
Промежуточный
L0 Локальная переменная О
L7 Локальная переменная 7
10 Входной параметр О
15 Входной параметр 5
FP Указатель фрейма
17 Адрес возврата
Часть предыдущего окна
Часть предыдущего окна
а б
Рис.
5.4. Регистровые окна системы UltraSPARC II
Команда вызова процедуры скрывает старый набор регистров и путем измене-
ния CWP предоставляет новый набор, который может использовать вызванная
процедура. Однако некоторые регистры переносятся из вызывающей процедуры
к вызванной процедуре, что обеспечивает эффективный способ передачи парамет-
ров между процедурами. Для этого некоторые регистры переименовываются: по-
сле вызова процедуры прежние выходные регистры с R8 по R15 все еще видны, но