|
Раздел 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. Использование стека операндов для арифметических действий
Для записи вычисления формул на компьютерах со стеком существует обратная польская запись (Таблица 4.1).
Таблица 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). Каждая команда состоит из кода операции и иногда из операнда (например, смещения адреса или константы). В первом столбце приводится шестнадцатеричный код команды. Во втором столбце дается мнемоника языка ассемблера. В третьем столбце описывается предназначение команды.
Таблица 4.2. Набор команд. Размер операндов byte, const и varnum – 1 байт, размер операндов disp, index и offset – 2 байта Так же существует команда для вызова другой процедуры (CALL) и команда для выхода из текущей процедуры и возвращения к процедуре, из которой она была вызвана (RETURN). Подведем итоги
Вопросы для самоконтроля 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. Напишите четыре формулы в обратной польской записи, которые нельзя переделать в инфиксную запись: ____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор... ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры... Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|