Э. Таненбаум - Архитектура компьютера (1127755), страница 70
Текст из файла (страница 70)
В данном случае вызывается процедура А с локальными переменными а1, а2 и аЗ, и для этих переменных резервируется участок памяти, начинающийся с адреса, который указывается регистром ЕН. Другой регистр, ЯР, указывает на старшее слово локальных переменных процедуры А. Если значение регистра 1Н равно 100, а слова по 4 байт, то значение БР составляет 108.
Для обращения к переменной нужно вычислить ее смещение от адреса ЕН. Структура данных между ЕН и 8Р (включая оба указанных слова) называется фреймом локальных переменных. ЗР (Н (.Н -~- ЗР аэ 108 а2 1(М (Н а1 1ОО Рис. 4ДП Стек для хранения локальных переменных: во время вызова процедуры А (а); после того, как процедура А вызывает процедуру В (б); после того, как процедура В вызывает процедуру С (в); после того как процедуры С и В завершаются, а процедура А вызывает процедуру()(г) Пример архитектуры набора команд — 1ЛтЛ 279 А теперь давайте посмотрим, что произойдет, если процедура А вызывает другую процедуру, например В. Где должны храниться 4 локальные переменные процедуры В (Ь1, 62, ЬЗ, Ь4)? Ответ; в стеке, расположенном над стеком для процедуры А, как показано на рис.
4.7, б. Отметим, что после вызова процедуры регистр 1Ат указывает уже на локальные переменные процедуры В. Обращаться к локальным переменным процедуры В можно по их сдвигу от (Л'. Если процедура В вызывает процедуру С, то регистры 1Л' и БР снова переопределяются и указывают на местонахождение локальных переменных процедуры С, как показано на рис. 4.7, в. Когда процедура С завершается, В снова активизируется и стек возвращается в прежнее состояние (см. рис.
4.7, б), так что 1.'тт теперь указывает на локальные переменные процедуры В. Когда процедура В завершается, стек переходит в исходное состояние (см. рис. 4.7, а). При любых условиях 1.'тт указывает на базовый адрес стекового фрейма локальных переменных текущей процедуры, а ЯР— на верхнее слово этого фрейма.
Предположим, что процедура А вызывает процедуру Р, которая содержит 5 локальных переменных. Соответствующий стек показан на рис. 4.7, г. Локальные переменные процедуры Р используют область памяти процедуры В и часть стека процедуры С. В памяти с такой организацией размещаются только текущие процедуры.
Когда процедура завершается, отведенный для нее участок памяти освобождается. Но стек используется для хранения не только локальных переменных, но и операндов во время вычисления арифметических выражений. Такой стек называется стеком операндов. Предположим, что перед вызовом процедуры В процедура А должна произвести следующее вычисление: а1 = а2 + аЗ. Чтобы вычислить эту сумму, можно поместить а2 в стек, как показано на рис. 4.8, а.
Тогда значение регистра ЗР увеличится на число, равное количеству байтов в слове (скажем, на 4), и будет указывать на адрес первого операнда. Затем в стек помещается переменная аЗ, как показано на рис. 4.8, б. Отметим, что названия процедур и переменных выбираются пользователем, а названия регистров и кодов операций жестко определены, поэтому названия процедур и переменных мы выделяем в тексте курсивом. ВР "'' 32.
° 2 вз в2 'ьу ЗР,.;' в2+вз вз а2 'ьу в1 ЗР вз в2 Ьу в2+вз в1 Рис. 4.8. Использование стека операндов для выполнения арифметических действий Теперь можно произвести вычисления, выполнив команду, которая выталкивает два слова из стека, складывает их и помещает результат обратно в стек, как показано на рис. 4.8, в, После этого верхнее слово можно вытолкнуть из стека и поместить его в локальную переменную а1, как показано на рис. 4.8, г. 280 Глава 4. Уровень микроархитектуры Фреймы локальных переменных и стеки операндов могут смешиваться. Например, когда вызывается функциями при вычислении выражения х' ~-Ях), часть этого выражения (х~) может находиться в стеке операндов.
Результат вычисления функции остается в стеке над х2, чтобы следующая команда могла сложить операнды. Следует упомянуть, что все машины используют стек для хранения локальных переменных, но не все используют его для хранения операндов. В большинстве машин нет стека операндов, но и у )Ъ'М, и у 1)УМ он есть. Стековые операции мы рассмотрим подробно в главе 5. Модель памяти ЦЧМ А теперь мы можем рассмотреть архитектуру 13Ъ'М. Она состоит из памяти, которую можно рассматривать либо как массив из 4 294 967 296 байт (4 Гбайт), либо как массив из 1 073 741 824 слов, каждое из которых содержит 4 байта. В отличие от большинства архитектур команд, виртуальная машина 1ача не выполняет обращений к памяти, видимых на уровне команд, но имеет несколько неявных адресов, которые составляют основу указателя.
1)Ъ'М-команды могут обращаться к памяти только через эти указатели. Определены следующие области памяти: + Набор констант. Эта область, недоступная для записи из 1)'ч"М-программы, состоит из констант, строк и указателей на другие области памяти, на которые можно делать ссылку. Данная область загружается в момент загрузки программы в память и после этого не меняется. Имеется скрытый регистр СРР (Сопзгапг Роо1 Рошгег — указатель набора констант), который содержит адрес первого слова набора констант.
+ Фрейм локальяыхперемеяных. Эта область предназначена для хранения переменных во время выполнения процедуры. Она, как уже отмечалось, называется фреймом локальных переменных. В начале этого фрейма располагаются параметры (или аргументы) вызванной процедуры. Фрейм локальных переменных не включает в себя стек операндов. Он помещается отдельно. Исходя из соображений производительности, мы поместили стек операндов прямо над фреймом локальных переменных.
Существует скрытый регистр, который содержит адрес первой переменной фрейма. Мы назовем этот регистр 1Л1 (1оса1 Ъ'апаЫе — локальная переменная). Параметры вызванной процедуры хранятся в начале фрейма локальных переменных. + Стек операндов. Стек операндов не должен быть больше определенного размера, который заранее вычисляется компилятором 1ача.
Пространство стека операндов располагается прямо над фреймом локальных переменных, как показано на рис. 4.9. В данном случае стек операндов удобно считать частью фрейма локальных переменных. В любом случае существует виртуальный регистр, который содержит адрес верхнего слова стека. Отметим, что в отличие от регистров СРР и 1Х, этот указатель меняется во время выполнения процедуры, поскольку операнды помещаются в стек и выталкиваются из него. Пример архитектуры набора команд — ИЧМ 281 + Облааяь ироцвдур.
Наконец, существует область памяти, в которой содержится программа. Есть виртуальный регистр, содержащий адрес команды, которая должна вызываться следующей. Этот указатель называется счетчиком команд (Ргойгаш Соцпгег, РС). В отличие от других областей памяти, область процедур представляет собой массив байтов. ьч Рис. 4.9. Области памяти МЧМ Следует сделать одно замечание по поводу указателей. Регистры СРР, ЕЧ и БР указывают на слова, а не на байты, и смещения происходят на определенное число слов.
Например, величины ЕХ, 1Л' + 1 и ЕХ + 2 указывают на первые три слова фрейма локальных переменных, а?Л~, 1.Ч + 4 и 1Х 4 8 — на слова, расположенные на расстоянии четырех слов (16 байт) друг от друга. Регистр РС, напротив, содержит адреса байтов, и его изменение означает увеличение на определенное количество байтов, а не слов.
Обращение к памяти регистра РС отличается от обрэзцений других регистров, поэтому в машине М1с-1 и предусмотрен специальный порт памяти для РС. Запомните, что его размер составляет всего один байт. Если увеличить РС на единицу и выполнить чтение, это приведет к вызову следующего байта. Если увеличить ЯР на единицу и выполнить чтение, это приведет к вызову следующего слова. Набор ЫЧМ-команд Набор 1)Ъ'М-команд приведен в табл. 4.2. Каждая команда состоит из кода операции и иногда из операнда (например, смещения адреса или константы). В первом столбце приводится шестнадцатеричный код команды. Во втором столбце дается мнемоника на языке ассемблера.
В третьем столбце описывается назначение команды. 282 Глава 4. Уровень микроархитектуры Таблица 4.2. Набор ЦЧ(ч(-команд. Размер операндов Ьу(е, сопз1 и чагпогп — 1 байт. Размер операндов сйвр, !пбех и оНзе1 — 2 байта Нех Мнемоника Примечание Ох99 1РЕО от(ее( Ох9В 1Н.Т ойле( Ох9Р (Р 1СМРЕО ойле( Ох84 11МС чаглит солж Ох15 1(ОАО чагпит ОхВЗ (МНОКЕЧ1НТОАЬ пир Вызывает процедуру Ох80 (ОИ ОхАС 1ЙЕГНВМ Охзб !ЗТОВЕ чаглит Ох64 !ЗОВ Команды нужны для того, чтобы помещать слова из различных источников в стек. Источники — это набор констант (ЕОС И), фрейм локальных переменных (1ЕОАО) и сама команда (81Р05Н). Переменную можно также вытолкнуть из стека и сохранить во фрейме локальных переменных (15ТОЕЕ).
Над двумя верхними словами стека можно совершать две арифметические (1А00 и 150В) и две логические операции (1А)(0 и 108). При выполнении любой арифметической или логической операции два слова выталкиваются из стека, а результат помещается обратно в стек. Существует 4 команды перехода: одна для безусловного перехода (БОТО), а три другие для условных переходов (1РЕ0, 1Н.Т и 1Р 1СНРЕО). Все эти ко- Ох!0 В1РОЗН Ьуте Ох59 СОР ОхА7 ОСТО оязе( Охбо (А00 Ох7Е (АМ О Ох13 ьОС ЧЧ (пт(ех Ох00 МОР Ох57 РОР Ох5Р ЗЧЧАР ОхС4 ЧЧ10Е Помещает байт в стек Копирует верхнее слова стека и помещает его в стек Безусловный переход Выталкивает два слова из стека; помещает в стек их сумму Выталкивает два слова из стека; помещает в стек результат логического умножения (операция И] Выталкивает слово из стека и совершает переход, если оно равно нулю Выталкивает слово из стека и совершает переход, если оно меньше нуля Выталкивает два слова из стека; совершает переход, если они равны Прибавляет константу к локальной переменной Помещает локальную переменную в стек Выталкивает два слова из стека; помещает в стек результат логического сложения (операция ИЛИ) Выдает результат выполнения процедуры (целое число) Выталкивает слово из стека и запоминает его во фрейме локальных переменных Выталкивает два слова из стека; помещает в стек их разность Берет константу из набора констант и помещает ее в стек Не производит никаких действий Удаляет верхнее слово стека Переставляет два верхних слова стека Префиксная команда; следующая команда содержит 16-разрядный индекс Пример архитектуры набора команд — К1НМ 283 манды изменяют значение РС на размер их смещения, который следует за кодом операции в команде.
Операнд смещения состоит из 16 бит. Он прибавляется к адресу кода операции. Существуют также команды для перестановки двух верхних слов стека (5ИАР), дублирования верхнего слова (ООР) и удаления верхнего слова (РОР). Некоторые команды имеют сложный формат, допускающий краткую форму записи для часто используемых версий.