Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Boroda_2

.doc
Скачиваний:
9
Добавлен:
20.03.2015
Размер:
1.67 Mб
Скачать

Глобальные переменные используются для хранения констант, переменных и указателей, которые нужны во всех процедурах, хотя при необходимости они могут загружаться и перезагружаться при входе в процедуру и при выходе из процедуры. Регистры 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-разрядных. Поскольку цены на память постоянно падают, этот фактор не имел бы значения в будущем, но, к сожалению, программное обеспечение разрастается гораздо быстрее, чем снижаются цены.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]