Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Раздел 4. Микроархитектурный уровень





Над цифровым логическим уровнем находится микроархитектурный уровень. Его задача – интерпретация команд уровня 2 (уровня архитектуры команд), как пока­зано на Рис. 2.1.

Строение микроархитектурного уровня зависит от того, каков уровень архитектуры команд, а также от стоимости и предназначения компьютера. В настоящее время уровень архитектуры команд часто содержит простые коман­ды, которые выполняются за один цикл (таковы, в частности, системы RISC). В других системах (например, в системах Pentium II) на этом уровне имеются более сложные команды, выполнение одной такой команды занимает несколько циклов. Чтобы выполнить команду, нужно найти операнды в памяти, считать их и запи­сать полученные результаты обратно в память. Управление уровнем команд со сложными командами отличается от управления уровнем команд с простыми командами, так как в первом случае выполнение одной команды требует определен­ной последовательности операций.

Тема 4.1. Пример микроархитектуры: организация

В результате изучения данной темы Вы будете:

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

 

Организация микроархитектуры определяет: как будет происходить тракт данных машины, регистры и цифровые схемы, которые необходимо задействовать и т.д.

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

Поток управления

Поток управления – это последовательность, в которой выполняются команды во время работы программы. При отсутствии переходов и вы­зовов процедур команды вызываются из последовательных ячеек памяти. Однако поток управления может изменяться. Ниже рассмотрены основные случаи изменения потока управления программы.

Последовательный поток управления и переходы

Большинство команд не меняют поток управления. После выполнения одной ко­манды вызывается и выполняется та команда, которая идет вслед за ней в памяти. После выполнения каждой команды счетчик команд увеличивается на 1. Т.е. счетчик команд можно представить в виде линейной функ­ции, как показано на Рис. 4.1, а).

Если программа содержит переходы, то это простое соотношение между по­рядком расположения команд в памяти и порядком их выполнения больше не соответствует действительности. При наличии переходов счетчик команд больше не является монотонно возрастающей функцией от времени, как показано на Рис. 4.1, б).

Рис. 4.1. Выполнение программы без переходов (а); выполнение программы с переходами (б)

Процедуры

Процедурами называют подпрограммы, т.е. программы выполняемые (вызываемые) внутри исполняемой программы (Рис. 4.2).

Рис. 4.2. Вызов процедуры исполняемой программой

Вызов процедуры, как и команда перехода, изменяет поток управле­ния, но в отличие от команды перехода после выполнения задачи управление воз­вращается к команде, которая вызвала процедуру. Таким образом, сокращается размер программы (но не время ее выполнения!) – т.к. код процедуры выполняется многократно.

Стек

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

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

Вместо этого используется другая стратегия. Для переменных резервируется особая область памяти, которая называетсястеком, но отдельные переменные не получают в нем абсолютных адресов. Какой-либо регистр, скажем, LV, указывает на базовый адрес локальных переменных для текущей процедуры. Рассмотрим Рис. 4.3, а), в данном случае вызывается процедура А с локальными переменными a1,a2 и аЗ, и для этих переменных резервируется участок памяти, начинающийся с адреса, который указывается регистром LV. Другой регистр, SP, указывает на старшее слово локальных переменных процедуры А. Если значение регистра LV равно 100, а слова состоят из 4 байтов, то значение SP будет 108, Для обращения к переменной нужно вычислить ее смещение от адреса LV. Структура данных меж­ду LV и SP (включая оба указанных слова) называетсяфреймом локальных переменных.

Рис. 4.3. Стек для хранения локальных переменных: во время процедуры A (а); после того как процедура A вызывает процедуру B (б); после того как процедура B вызывает процедуру C (в); после того как процедуры B и C прекращаются, а процедура A вызывает процедуру D (г)

После вызова процедуры B регистр LV указыва­ет уже на локальные переменные процедуры В. Обращаться к локальным пере­менным процедуры В можно по их сдвигу от LV. Если процедура В вызывает процедуру С, то регистры LV и SP снова переопределяются и указывают на местона­хождение локальных переменных процедуры С(Рис. 4.3, в).

Когда процедура С завершается, В снова активизируется и стек возвращается в прежнее состояние (Рис. 4.3, б), так что LV теперь указывает на локальные пере­менные процедуры В. Когда процедура В завершается, стек переходит в исходное состояние (Рис. 4.3, а). При любых условиях LV указывает на базовый адрес стекового фрейма для текущей процедуры, а SP – на верхнее слово этого фрейма.

Предположим, что процедура A вызывает процедуру D, которая содержит 5 локальных переменных (Рис. 4.3, г). Локаль­ные переменные процедуры D используют участок памяти процедуры В и часть стека процедуры С. В памяти с такой организацией размещаются только текущие процедуры. Когда процедура завершена, отведенный для нее участок памяти осво­бождается.

Стек используется не только для хранения локальных переменных, а также и для хранения операндов во время вычисления арифметических выражений. Такой стек называетсястеком операндов. Предположим, что перед вызовом про­цедуры В процедура А должна произвести следующее вычисление:

a1 = a2 + a3

Чтобы вычислить эту сумму, можно поместить а2 в стек (Рис. 4.4, а). Тогда значение регистра SP увеличится на число, равное количеству байтов в слове (скажем, на 4), и будет указывать на адрес первого операнда. Затем в стек помещается переменная а3 (Рис. 4.4, б).

Теперь можно произвести вычисление, выполнив команду, которая выталки­вает два слова из стека, складывает их и помещает результат обратно в стек (Рис. 4.4, в). После этого верхнее слово можно вытолкнуть из стека и по­местить его в локальную переменную а1, (Рис. 4.4, г).

Рис. 4.4. Использование стека операндов для арифметических действий

Обычная форма записи, применяемая в традиционной математике, называется «инфиксной записью».
Фреймы локальных переменных и стеки операндов могут смешиваться. Напри­мер, когда вызывается функция f при вычислении выражения х2+f(х), часть этого выражения (х2) может находиться в стеке операндов. Результат вычисления функ­ции остается в стеке над х2, чтобы следующая команда сложилаих.

Для записи вычисления формул на компьютерах со стеком существует обратная польская запись (Таблица 4.1).


 

Обычная запись Обратная польская запись
A+B×C ABC×+
A×B+C AB×C+
A×B+C×D AB×CD×+
(A+B)/(C-D) AB+CD-/
A×B/C AB×C/
((A+B) ×C+D)/(E+F+G) AB+C×D+EF+G+/

Таблица 4.1. Некоторые примеры обратной польской записи

Следует упомянуть, что все машины используют стек для хранения локальных переменных, но не все используют его для операндов. В большинстве машин нет стека операндов.

Модель памяти

В рассматриваемой микроархитектуре память можно рассматривать либо как массив из 4294967296 байтов (4 Гбайт), либо как массив из 1073741824 слов, каждое из которых содержит 4 байта. В отличие от большинства архитектур команд, данная машина не совершает об­ращений к памяти, видимых на уровне команд, но здесь существует несколько неявных адресов, которые составляют основу для указателя. Команды могут обращаться к памяти только через эти указатели.

Определены следующие области памяти:

1. Набор констант. Эта область состоит из констант, цепочек и указателей на другие области памяти, на которые можно делать ссылку. Данная область загружается в тот момент, когда программа загружается из памяти, и после этого не меняется. Существует неявный регистр СРР (Constant Pool Pointer – указатель набора констант), который содержит адрес первого слова набора констант.

2. Фрейм локальных переменных. Эта область предназначена для хранения пе­ременных во время выполнения процедуры. В начале этого фрейма располагаются параметры (или аргументы) вызванной процедуры. Фрейм локальных переменных не вклю­чает в себя стек операндов. Он помещается отдельно. Исходя из соображений производительности, стек операндов помещен прямо над фреймом локальных переменных. Существует неявный регистр, который содержит адрес первой переменной фрейма. Мы назовем этот регистр LV (Local Variable – локальная переменная). Параметры вызванной процедуры хра­нятся в начале фрейма локальных переменных.

3. Стек операндов. Стек операндов не должен превышать определенный раз­мер, который заранее вычисляется компилятором. Пространство стека операндов располагается прямо над фреймом локальных переменных (Рис. 4.5). В данном случае стек операндов удобно считать частью фрейма локальных переменных. В любом случае существует виртуальный регистр, который содержит адрес верхнего слова стека, его будем называть SP (Stack Pointer – указатель на стек). Отметим, что в от­личие от регистров СРР и LV этот указатель меняется во время выполнения процедуры, поскольку операнды помещаются в стек и выталкиваются из него.

4. Область процедур. Наконец, существует область памяти, в которой содер­жится программа. Есть виртуальный регистр, содержащий адрес команды, которая будет вызвана следующей. Этот указатель называется счетчиком команд, или PC (Program Counter). В отличие от других участков памяти, область процедуры представляет собой массив байтов.

Следует сделать одно примечание по поводу указателей. Регистры СРР, LV и SP указывают на слова, а не на байты, и смещения происходят на определенное число слов. Например, LV, LV+1 и LV+2 указывают на первые три слова из фрейма ло­кальных переменных, а LV, LV+4 и LV+8 – на слова, расположенные на расстоя­нии четырех слов (16 байтов) друг от друга.

Рис. 4.5. Область памяти

Регистр PC, напротив, содержит адреса байтов, и изменение этого значения означает увеличение на определенное количество байтов, а не слов. Обращение к памяти регистром PC отличается от обращений других регистров, поэтому и предусмотрен специальный порт памяти для PC. Запомните, что его размер составляет всего один байт. Если увеличить PC на единицу и начать про­цесс чтения, то это приведет к вызову следующего байта. Если увеличить SP на единицу и начать процесс чтения, то это приведет к вызову следующего слова.

Набор команд

Ниже представлен возможный набор команд, который будет доступен на уровне архитектуры команд (Рис. 2.1).

Каждая команда состоит из кода опера­ции и иногда из операнда (например, смещения адреса или константы). В первом столбце приводится шестнадцатеричный код команды. Во втором столбце дается мнемоника языка ассемблера. В третьем столбце описывается предназначение команды.

Под «мнемоникой» подразумевается символическая запись машинной команды.
Команды нужны для того, чтобы помещать слова из различных источников в стек. Источники – это набор констант (LDC_W), фрейм локальных переменных (LOAD) и сама команда (PUSH). Переменную можно также вытолкнуть из стека и сохра­нить ее во фрейме локальных переменных (STORE). Над двумя верхними словами стека можно совершать две арифметические (ADD и SUB) и две логические опера­ции (AND и OR). При выполнении любой арифметической или логической опера­ции два слова выталкиваются из стека, а результат помещается обратно в стек. Существует 4 команды перехода: одна для безусловного перехода (GOTO), а три дру­гие для условных переходов (IFEQ, IFLT и IF_ICMPEQ). Все эти команды изменяют значение PC на размер их смещения, который следует за кодом операции в коман­де. Операнд смещения состоит из 16 битов. Он прибавляется к адресу кода опера­ции. Существуют также команды для перестановки двух верхних слов стека (SWAP), дублирования верхнего слова (DUP) и удаления верхнего слова (POP).

 

Число Мнемоника Примечание
10h PUSH byte   Помещает байт в стек  
59h DUP   Копирует верхнее слова стека и помещает его в стек  
А7h GOTO offset Безусловный переход  
60h ADD Выталкивает два слова из стека; помещает в стек их сумму  
7Еh AND   Выталкивает два слова из стека; помещает в стек результат логического умножения (операция И)
99h IFEQ offset Выталкивает слово из стека и совершает переход, если оно равно нулю
9Вh IFLT offset Выталкивает слово из стека и совершает переход, если оно меньше нуля
9Fh IF_ICMPEQ offset Выталкивает два слова из стека; совершает переход, если они равны
84h INC varnum const Прибавляет константу к локальной переменной  
15h LOAD varnum Помещает локальную переменную в стек  
В6h CALL disp Вызывает процедуру  
80h OR Выталкивает два слова из стека; помещает в стек результат логического сложения (операция ИЛИ)
АСh RETURN Выдает результат выполнения процедуры (целое число)  
36h STORE varnum Выталкивает слово из стека и запоминает его во фрейме локальных переменных
64h SUB Выталкивает два слова из стека; помещает в стек их разность  
13h LDC_W index Берет константу из набора констант и помещает ее в стек  
00h NOP Не производит никаких действий  
57h   POP Удаляет верхнее слово стека  
5Fh SWAP Переставляет два верхних слова стека  
C4h WIDE Префиксная команда; следующая команда содержит 16-битный индекс

Таблица 4.2. Набор команд. Размер операндов byte, const и varnum – 1 байт, размер операндов disp, index и offset – 2 байта

Так же существует команда для вызова другой процедуры (CALL) и команда для выхода из текущей процедуры и возвращения к процедуре, из кото­рой она была вызвана (RETURN).

Подведем итоги

  • разработка микроархитектурного уровня начинается с выбора и тщательного обдумывания организации будущей машины – от этого зависит количество и состав регистров, необходимых цифровых схем и т.д.;
  • рассматриваемая в качестве примера машина – это машина со стековой организацией и с 1-байтными кодами операций, которые помещают слова в стек, выталкивают слова из стека и выполняют различные операции над словами из стека (например, складывают их);
  • рассматриваемая архитектура имеет 32-битное адресное пространство, состоящее из: набора констант, фрейма локальных переменных, стека операндов и области процедур;
  • на области констант, процедур, локальных переменных и стека операндов указывают адреса, находящиеся, соответственно, в регистрах CPP, PC, LV и SP;
  • команды, которые будут доступны на уровне архитектуры команд, закладываются на стадии разработки микроархитектурного уровня.

Вопросы для самоконтроля

1. Объясните своими словами принцип работы стека.

2. Почему в разработанной команде ADD нет операндов?

3.

Что такое «обратная польская запись»? Чем она отличается от «инфиксной записи»?

Индивидуальные задания

1. Перепишите следующие формулы из инфиксной записи в обратную польскую запись:

· A+B+C+D+E

· (A+B) ×(C+D)+E

· A×B+C×D+E

· (A-B) ×(((C-D×E)/F)/G) ×H

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

2. Переделайте следующие формулы из обратной польской записи в инфиксную запись:

· A B + C + D ×

· A B / C D / +

· A B C D E + × × /

· A B C D E × F / + G – H / × +

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

3. Напишите четыре формулы в обратной польской записи, которые нельзя переделать в инфиксную запись:

____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________







Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.