
Boroda_2
.docГлобальные переменные используются для хранения констант, переменных и указателей, которые нужны во всех процедурах, хотя при необходимости они могут загружаться и перезагружаться при входе в процедуру и при выходе из процедуры. Регистры 1х и Ох используются для передачи параметров процедурам, чтобы избежать обращений к памяти. Далее мы расскажем, как это происходит.
Специальные регистры используются для особых целей. Регистры FP и SP ограничивают текущий фрейм. Первый указывает на базу текущего фрейма и применяется для обращения к локальным переменным, точно так же, как LV на рис. 4.9. Второй указывает на текущую вершину стека и изменяется, когда слова помещаются в стек или выталкиваются оттуда. Значение регистра FP изменяется только при вызове и завершении процедуры. Третий специальный регистр — R31. Он содержит адрес возврата для текущей процедуры.
В действительности число регистров общего назначения процессора UltraSPARC III превышает 32, но только 32 из них всегда доступны для программ. Эта особенность, называемая регистровыми окнами, призвана повысить эффективность вызова процедур. Систему регистровых окон иллюстрирует рис. 5.4. Основная идея — имитировать стек, используя при этом регистры. То есть существуют несколько наборов регистров, точно так же, как и несколько фреймов в стеке, из них ровно 32 регистра общего назначения доступны всегда. Регистр CWP (Current Window Pointer — указатель текущего окна) контролирует, какой набор регистров используется в данный момент.
Команда вызова процедуры скрывает старый набор регистров и путем изменения CWP предоставляет новый набор, который может использовать вызванная процедура. Однако некоторые регистры переходят от вызывающей процедуры к вызванной, что обеспечивает эффективную передачу параметров между процедурами. Для этого часть регистров переименовываются: после вызова процедуры прежние выходные регистры с R8 по R15 остаются доступными, но превращаются во входные регистры с R24 по R31. Восемь глобальных регистров не меняются. Это всегда один и тот же набор регистров.
В отличие от памяти, которая квазибесконечна (по крайней мере, в отношении стеков), при слишком большой глубине вложенности процедур машина начинает работать вне регистровых окон. В этот момент самый старый набор регистров сбрасывается в память, чтобы освободить новый набор. Точно так же после многократных выходов из процедур может понадобиться вызвать набор регистров из памяти. В целом такая сложность является большой помехой и, вообще говоря, не очень полезна. Подобная система помогает только при не очень большой глубине вложенности процедур.
В системе UltraSPARC III есть также 32 регистра для обработки команд с плавающей точкой, которые могут содержать либо 32-разрядные (одинарная точность), либо 64-разрядные (двойная точность) значения. Можно также использовать пары этих регистров, чтобы поддерживать 128-разрядные значения.
Архитектура UltraSPARC II — архитектура загрузки и сохранения. Это означает, что единственные команды, которые непосредственно обращаются к памяти, — это LOAD (загрузка) и STORE (сохранение), обеспечивающие перемещение данных между регистрами и памятью. Все операнды для команд арифметических и логических операций должны извлекаться из регистров или предоставляться самой командой (без обращений к памяти), а все результаты должны сохраняться в регистрах (но не в памяти).
Обзор уровня архитектуры набора команд микросхемы 8051
В качестве третьего примера мы традиционно рассматриваем микросхему 8051. В отличие от процессоров Pentium 4 (которые в основном используются в настольных компьютерах и серверных фермах) и UltraSPARC III (которые по большей части устанавливаются в крупных серверных, особенно мультипроцессорных, системах), микросхемы 8051 обычно встраиваются в бытовые устройства (от уличных светофоров до будильников) для обработки сигналов от кнопок, световых индикаторов и других элементов пользовательского интерфейса. История этого процессора довольно проста. Когда в 1974 году компания Intel выпустила микросхему 8080, успех был ошеломляющим. Производители принялись встраивать 8080 в электронные устройства, и с учетом этой тенденции через некоторое время было решено сконструировать микросхему, на которой можно было бы разместить не только процессор, но также модули памяти и контроллеры вво- да-вывода. В результате появилась модель 8048, а за ней — 8051. Несмотря на почтенный возраст (а может быть, и благодаря ему), эта микросхема до сих пор пользуется обширным спросом, что объясняется в основном крайне низкой стоимостью, которая во встроенных системах является решающим фактором. В данном подразделе представлена краткая техническая характеристика 8051 и родственных микросхем.
8051 умеет работать в одном-единственном режиме; никаких аппаратных средств защиты в этой микросхеме не предусмотрено. Они и не нужны — ведь 8051 никогда не выполняет одновременно больше одной программы. Модель памяти невероятно проста. Существует два адресных пространства по 64 Кбайт: для программ и для данных. Эти пространства разделены, что делает возможной реализацию пространства программ в ПЗУ, а пространства данных — в ОЗУ.
Допускается несколько вариантов реализации памяти. В простейшем из них предусматривается 4 Кбайт ПЗУ для программ и 128 байт ОЗУ для данных. Как ПЗУ, так и ОЗУ размещаются в одном корпусе с микросхемой. Учитывая область применения 8051, такого объема памяти в большинстве случаев вполне достаточно, а совместное размещение процессора и двух модулей памяти считается серьезным достоинством. В модели 8051 емкость обоих модулей увеличена вдвое: 8 Кбайт ПЗУ и 256 байт ОЗУ. В случае применения этой модели программа записывается в ПЗУ на этапе производства и пользователю недоступна.
В то же время систему 8051 можно оснастить внешним ПЗУ для размещения программ емкостью 64 Кбайт и внешним ОЗУ аналогичной емкости для данных. Кроме того, допускается установка единого для программ и данных внешнего модуля ОЗУ все той же емкости.
Вместе с тем, 8051 поддерживает промежуточную модель, в которой 4 Кбайт памяти программ и 128 байт памяти данных размещаются в одном корпусе с микросхемой, а остальная память — вовне. Применимость той или иной модели зависит от напряжения, подаваемого на выводы микросхемы.
Механизм работы с регистрами в 8051 весьма оригинален. Большинство программ для 8051 составляются с расчетом на восемь 8-разрядных регистров. Это совершенно естественный подход, поскольку многие команды содержат 3-раз- рядное поле с указанием целевого регистра. Имена регистров находятся в диапазоне от R0 до R7. Существует четыре набора регистров, хотя в каждый конкретный момент активным является только один из них. Активный регистр определяется значением в 2-разрядном поле регистра PSW. Наличие нескольких наборов регистров позволяет существенно ускорить обработку прерываний. При обнаружении прерывания обработчик не сохраняет содержимое всех регистров, а просто переходит к другому набору. Это обстоятельство позволяет 8051 обрабатывать огромное количество прерываний, что очень важно для процессора, встраиваемого в системы реального времени.
Еще одной особенностью регистров 8051 является то, что все они представлены в адресном пространстве памяти. Байт 0 пространства данных соответствует
регистру R0 из набора 0. Если команды изменяет содержимое R0, а затем считывает байт 0, в нем обнаруживается новое значение R0. Аналогичным образом байт 1 памяти соответствует регистру R1, и т. д. Байты 8-15 памяти соответствуют набору регистров 1, и т. д. до байта 31, связанного с регистром R7 в наборе 3.Эта схема изображенана рис. 5.5.
Рис. 5.5. Организация встроенной в микросхему памяти 8051 (а); основные регистры 8051 (б)
Непосредственно над четырьмя банками регистров, по адресам памяти 32-47, расположены 16 байт памяти с побитовой адресацией (0-127). В 8051 предусмотрен набор команд установки, сброса, выполнения операций И и ИЛИ, а также проверки отдельных битов, обращение к которым осуществляется по числам в диапазоне от 0 до 127. Эти команды работают с байтами от 32 до 47. Полезны они тем, что во встроенных процессорах для записи или установки переключателей, индикаторов и других устройств ввода-вывода часто применяются битовые переменные. Наличие специальных ячеек памяти позволяет 8051 обращаться к битовым перемененным, не вызывая байты целиком (а значит, не устанавливая их заново и не маскируя ненужные биты). Для простого процессора такая схема очень удобна, особенно в том, что касается управления булевыми переменными.
Помимо 4 наборов из 8 регистров, в 8051 есть несколько специальных регистров, самые важные из которых изображены на рис. 5.5, б. В регистре PSW содержатся (слева направо): бит переноса, бит служебного переноса, бит, определяющий набор регистров, бит переполнения и бит четности. Значения всех этих битов, за исключением того, который указывает на набор регистров, вычисляются арифметически. Заштрихованные поля не заняты.
Регистр IE позволяет включать/отключать прерывания вместе или по отдельности. Если бит в регистре IE обнулен, все прерывания отключены. Сброс этого бита позволяет отключать последующие прерывания одной командой. Установка этого бита разрешает любые прерывания, для которых установлены индивидуальные биты. Биты Е2, Е1 и ЕО включают или выключают три канала таймеров. Если все эти каналы включены, разрешается одновременная работа трех счетчиков, которые по истечении времени выполнения порождают прерывания. Бит ES включает или отключает последовательные прерывания каналов. Остальные два бита включают или отключают прерывания от внешних источников. Когда они установлены, прерывания принимаются от внешних устройств, подключенных к двум выводам 8051. Соответственно, если эти биты сброшены, такие прерывания не принимаются.
Регистр IP определяет приоритеты для прерываний. Предусмотрено всего два уровня приоритета: низкий и высокий. Обслуживание прерывания с низким приоритетом может быть отложено в пользу прерывания с высоким приоритетом, но обратная ситуация невозможна. Бит, равный единице, присваивает соответствующему прерыванию высокий приоритет; сброшенный бит задает низкий приоритет.
Регистр TCON регулирует главные таймеры 0 и 1. Биты 01 и 00 устанавливаются аппаратно в случае переполнения соответствующего таймера. R1 и R0 — это биты контроля выполнения, которые позволяют включать и отключать таймеры программно. Остальные биты переводят оба таймера из режима запуска по фронту в режим запуска по уровню, и наоборот.
Последний оставшийся регистр — TMOD — определяет разрядность таймеров (8, 13 или 16 бит), переключает их из режима таймера истинного времени в режим счетчика и обратно, а также регулирует подконтрольность таймеров аппаратным сигналам. Есть и другие регистры, связанные с управлением питанием и работой последовательного порта, но они на нашей схеме не показаны.
Все вышеупомянутые специальные регистры, а также ряд других (в частности, сумматор и порты ввода-вывода), находятся в диапазоне памяти 128-255. Обращение к ним осуществляется так же, как и к регистрам R0-R7. К примеру, сумматор, применяемый для выполнения большинства арифметических операций, находится по адресу 240. В процессоре 8052 с реальной памятью в диапазоне от 128 до 255 специальные регистры пересекаются с адресным пространством памяти. Поэтому для обращения к специальным регистрам в этом процессоре используется прямая адресация, а для обращения к ОЗУ (через указатели в регистрах) — косвенная.
Типы данных
Всем компьютерам нужны данные. Для многих компьютерных систем основной задачей является обработка финансовых, промышленных, научных, технических и других данных. Внутри компьютера данные должны быть представлены в какой-либо особой форме. На уровне архитектуры набора команд используются различные типы данных. Они описаны в этом разделе.
Ключевым вопросом является вопрос о том, имеется ли аппаратная поддержка того или иного типа данных. Под аппаратной поддержкой подразумевается, что одна или несколько команд ожидают данные в определенном формате, и пользователь не может задействовать другой формат. Например, бухгалтеры привыкли писать знак «минус» у отрицательных чисел справа, а специалисты по вычислительной технике — слева. Предположим, что, пытаясь произвести впечатление на своего начальника, глава компьютерного центра в бухгалтерской фирме изменил все числа во всех компьютерах, чтобы знаковый бит был самым правым (а не самым левым). Несомненно, это произведет большое впечатление на начальника, поскольку все программное обеспечение откажется нормально функционировать. Аппаратное обеспечение требует определенного формата для целых чисел и не перестанет работать должным образом, если целые числа поступят в другом формате.
Теперь рассмотрим другую бухгалтерскую фирму, только что заключившую договор на проверку федерального долга (размера задолженности правительства США всем контрагентам). 32-разрядная арифметика здесь не подойдет, поскольку числа превышают значение 232 (около четырех миллиардов). Одно из возможных решений — использовать два 32-разрядных целых числа для представления каждого числа, то есть все 64 бита. Если машина не поддерживает такие числа удвоенной точности, все арифметические операции над ними должны выполняться программно, то есть эти две части могут располагаться в памяти в произвольном порядке, поскольку для аппаратного обеспечения это не важно. Это — пример типа данных без аппаратной поддержки и, следовательно, без аппаратной реализации. В следующих подразделах мы рассмотрим типы данных, которые поддерживаются аппаратно и для которых требуются специальные форматы.
Числовые типы данных
Типы данных можно разделить на две категории: числовые и нечисловые. Среди числовых типов данных главными являются целые числа. Они бывают различной длины: обычно 8, 16, 32 и 64 бита. Целые числа применяются для подсчета различных предметов (например, позволяют узнать, сколько на складе отверток), для идентификации различных объектов (например, банковских счетов), а также для других целей. В большинстве современных компьютеров целые числа хранятся в двоичном виде, хотя в прошлом использовались и другие системы. Двоичные числа обсуждаются в приложении А.
Некоторые компьютеры поддерживают целые числа и со знаком, и без знака. В целом числе без знака нет знакового бита, и все биты содержат данные. Этот тип данных имеет преимущество: у него есть дополнительный бит, поэтому 32-разрядное слово может содержать целое число без знака от 0 до 232-1 включительно. Двоичное целое число со знаком, напротив, может содержать числа только до 231-1, но зато включает и отрицательные числа.
Для выражения нецелых чисел (например, 3,5) используются числа с плавающей точкой. О них рассказывается в приложении Б. Их длина составляет 32, 64, а иногда и 128 бит. В большинстве компьютеров есть команды для выполнения операций с числами с плавающей точкой. Во многих компьютерах имеются отдельные регистры для целочисленных операндов и для операндов с плавающей точкой.
Некоторые языки программирования, в частности COBOL, допускают в качестве типа данных указывать десятичные числа. Машины, предназначенные для программ на языке COBOL, часто поддерживают десятичные числа аппаратно, обычно кодируя десятичный разряд четырьмя битами и затем объединяя два десятичных разряда в байт (двоично-десятичный формат). Однако результаты арифметических действий над такими десятичными числами будут некорректны, поэтому требуются специальные команды для коррекции десятичной арифметики. Эти команды должны контролировать перенос бита 3. Вот почему код условия часто содержит бит служебного переноса. Между прочим, проблема 2000 года возникла из-за программистов, пишущих на языке COBOL, которые решили, что дешевле представлять год в виде двух десятичных разрядов, а не в виде 16-разрядного двоичного числа.
Нечисловые типы данных
Хотя самые первые компьютеры работали в основном с числами, современные машины часто используются для выполнения нечисловых приложений, например, для обработки текстов или управления базами данных. Для этих приложений нужны другие, нечисловые, типы данных. Они часто поддерживаются командами уровня архитектуры набора команд. Здесь очень важны символы, хотя не каждый компьютер обеспечивает аппаратную поддержку для них. Наиболее распространенными символьными кодами являются ASCII и UNICODE. Они поддерживают 7-разрядные и 16-разрядные символы соответственно. Эти коды обсуждались в главе 2.
На уровне архитектуры набора команд часто имеются особые команды, предназначенные для операций со строками. Эти строки иногда разграничиваются специальным символом в конце. Вместо терминального символа для определения конца строки может использоваться поле длины строки. Строковые команды позволяют выполнять копирование, поиск и редактирование строк, а также другие действия.
К нечисловым относится также очень важный логический тип данных, содержащий булевы значения. Этих значений два: истина и ложь. Теоретически булево значение можно представлять единственным битом: 0 — ложь, 1 — истина (или наоборот). На практике же используется байт или слово, поскольку отдельные биты в байте не имеют собственных адресов и, следовательно, к ним трудно обращаться. В обычных системах применяется следующее соглашение: 0 означает ложь, а любое другое значение — истину.
Единственная ситуация, в которой булево значение представлено одним битом — это массив битов, поэтому 32-разрядное слово может содержать 32 булевых значения. Такая структура данных называется битовым отображением, или битовой картой. Битовое отображение встречается в различных контекстах, например, оно позволяет отслеживать свободные блоки на диске — в этом случае каждый быт отображает состояние каждого блока. Если диск содержит п блоков, тогда битовое отображение будет содержать п бит.
Последний тип данных — это указатели, которые представляют собой машинные адреса. Мы уже неоднократно рассматривали указатели. В машинах Mic-x регистры SP, PC, LV и СРР — это примеры указателей. Доступ к переменной на фиксированном расстоянии от указателя (а именно так работает команда IL0AD) широко поддерживается всеми машинами.
Типы данных процессора Pentium 4
Pentium 4 поддерживает двоичные целые числа со знаком, целые числа без знака, числа двоично-десятичной системы счисления и числа с плавающей точкой по стандарту IEEE 754 (табл. 5.2). Эта машина является 8/16-разрядной и оперирует целыми числами такой же длины. Она поддерживает многочисленные арифметические команды, булевы операции и операции сравнения. Операнды не обязательно должны быть выровнены в памяти, но если адреса слов кратны значению 4 байта, имеет место более высокая производительность.
Таблица 5.2. Числовые типы данных процессора Pentium 4
Тип 1 бит |
8 бит |
16 бит |
32 бита |
64 бита 128 бит |
Бит Целые числа со знаком |
Да |
Да |
Да |
|
Целые числа без знака |
Да |
Да |
Да |
|
Двоично-десятичные целые числа Числа с плавающей точкой |
Да |
|
Да |
Да |
Pentium 4 также может манипулировать 8-разрядными ASCII-символами: существуют специальные команды для копирования и поиска строк символов. Эти команды используются и для строк, длина которых известна заранее, и для строк, в конце которых стоит специальный терминальный символ. Строковые команды часто объединяются в библиотеки.
Типы данных машины UltraSPARC III
UltraSPARC III поддерживает множество форматов данных (табл. 5.3). Эта машина может обрабатывать 8-, 16-, 32- и 64-разрядные целочисленные операнды со знаком и без знака. Целые числа со знаком представлены в дополнительном коде. Кроме того, имеются операнды с плавающей точкой по 32, 64 и 128 бит, которые соответствуют стандарту IEEE 754 (для 32- и 64-разрядных чисел). Двоично-десятичные числа не поддерживаются. Все операнды должны быть выровнены в памяти.
Тип 1 бит |
8 бит |
16 бит |
32 бита |
64 бита |
128 бит |
Бит Целые числа со знаком |
Да |
Да |
Да |
Да |
|
Целые числа без знака |
Да |
Да |
Да |
Да |
|
Двоично-десятичные целые числа Числа с плавающей точкой |
|
|
Да |
Да |
Да |
UltraSPARC III имеет регистровую структуру, и почти все команды оперируют 64-разрядными регистрами. Символьные и строковые типы данных специальными командами аппаратного обеспечения не поддерживаются.
Типы данных 8051
Количество типов данных в микросхеме 8051 строго ограничено. Разрядность всех регистров, а значит, целых чисел и символов, составляет 8 бит. По существу, единственным типом данных для выполнения арифметических операций, который поддерживается аппаратно, является 8-разрядный байт (табл. 5.4).
Таблица 5.4. Числовые типы данных для 8051
Тип 1 бит 8 бит 16 бит 32 бита 64 бита 128 бит
Бит Да
Целые числа со знаком Да
Целые числа без знака
Двоично-десятичные целые числа
Числа с плавающей точкой
Кроме того, 8051 поддерживает еще один тип данных, который не используется при выполнении арифметических операций, — бит. Блок из 16 байт, начинающийся с адреса 32, являет собой память с битовой ориентацией. Путем смещения от 0 до 127 можно обращаться индивидуально к каждому биту. Бит 0 занимает в байте 32 крайнее правое положение, бит 1 расположен сразу за ним, и т. д. Для битов предусмотрены команды установки, сброса, выполнения операций И и ИЛИ, образования дополнения, перехода к битам и проверки. Во встроенных системах состояния переключателей, световых индикаторов и других устройств ввода-вывода сохраняются именно в отдельных битах, поэтому возможность непосредственного управления ими очень важна.
Форматы команд
На рис. 5.6 показано несколько возможных форматов команд уровня архитектуры набора команд. Команды всегда содержат код операции. В команде могут присутствовать ни одного, один, два или три адреса.
В одних машинах все команды но длине одинаковы, в других могут быть разными. Кроме того, команды по длине могут быть короче слова, длиннее слова или быть равными слову. Если все команды одной длины, то это упрощает декодирование, но часто требует излишнего пространства, поскольку все команды должны быть такой же длины, как самая длинная. На рис. 5.7 показано несколько возможных соотношений между размерами команды и слова.
Критерии разработки форматов команд
Если разработчикам нужно выбрать форматы команд для их машины, они должны принять во внимание ряд факторов. Нельзя недооценивать сложность этого решения. Если компьютер с коммерческой точки зрения получается удачным, набор команд может существовать на протяжении 20 лет и более. Имеет огромное значение возможность на протяжении некоторого времени добавлять новые команды и другие элементы, но только в том случае, если архитектура (и компания, создавшая эту архитектуру) протянет достаточно долго.
Эффективность конкретной архитектуры команд зависит от технологии, которая применялась при разработке компьютера. За длительный период времени эта технология значительно изменится, и некоторые характеристики архитектуры команд окажутся (если оглянуться лет на 20 назад) неудачными. Например, если доступ к памяти осуществляется быстро, то подойдет стековая архитектура (как в IJVM), но если доступ к памяти медленный, тогда желательно иметь множество регистров (как в UltraSPARC III). Тем читателям, которые считают, что выбор сделать просто, мы предлагаем взять лист бумаги и записать следующие предположения:
+ Какова будет типичная частота тактового генератора через 20 лет?
+ Каково будет типичное время доступа к ОЗУ через 20 лет?
Аккуратно сложите этот лист бумаги и спрячьте его в надежном месте, а через 20 лет разверните и прочитайте, что на нем написано. Те из вас, кто принял этот вызов, могут, чтобы не пачкать бумагу, выставить свои пророчества в Интернете.
Даже дальновидные разработчики не всегда могут сделать правильный выбор. А если бы и смогли, то проработали бы недолго, поскольку если предлагаемая ими архитектура команд окажется дороже, чем у конкурентов, компания долго не продержится.
Если речь идет об одинаковых машинах, то лучше иметь короткие команды, чем длинные. Программа, состоящая из п 16-разрядных команд, занимает в два раза меньше пространства памяти, чем программа из п 32-разрядных. Поскольку цены на память постоянно падают, этот фактор не имел бы значения в будущем, но, к сожалению, программное обеспечение разрастается гораздо быстрее, чем снижаются цены.