ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.01.2021

Просмотров: 150

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

7


Лекция 11


5.1.4. Типы данных


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

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

Среди числовых типов данных наиболее популярны целые числа. Они бывают различной длины - обычно 8, 16, 32 и 64 бита. В большинстве современных компьютеров целые числа хранят­ся в двоичной системе, хотя в прошлом использовались и другие системы.

Многие компьютеры поддерживают целые числа со знаком и без знака. В целом числе без знака все биты содержат данные. Например, 32-битное слово может содержать целое число от 0 до 232-1 включительно. Двоич­ное целое число со знаком может содержать числа только до 231-1, но зато включает и отрицательные числа.

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

Некоторые языки программирования (COBOL) допускают в каче­стве типа данных десятичные числа. Машины, предназначенные для программ на языке COBOL, часто поддерживают десятичные числа в аппаратном обеспечении. При этом обычно десятичный разряд кодируется в 4-х битах, и байт содержит две десятичные цифры (двоично-десятичный формат). Как уже говорилось ранее, этот формат менее экономичен. С другой стороны, результаты обычных арифметичес­ких действий над такими числами будут некорректны, и тре­буются специальные команды для коррекции десятичной арифметики. Эти коман­ды должны знать о наличии переноса бита 3, поэтому код условия часто содержит бит служебного переноса. Проблема 2000 года была вызвана про­граммистами на языке COBOL, которые решили представлять год в виде двух десятичных разрядов, а не в виде 16-битного двоичного числа.

Если первые ЭВМ работали в основном с числами, то современные ком­пьютеры часто используются для нечисловых приложений, например, обра­ботки текстов или управления базой данных. Для этих приложений нужны дру­гие типы данных. Они часто поддерживаются командами уровня архитектуры команд.

В этом плане очень важны символы, хотя не каждый компьютер обеспечивает их аппаратную поддержку. Наиболее распространенными символьными кодами являются ASCII и UNICODE (7- и 16-битные символы соответственно). На уровне команд часто имеются особые команды, предназначенные непосредственно для опе­раций с цепочками символов. Эти цепочки иногда разграничиваются специаль­ным символом в конце, иногда для определения конца цепочки ис­пользуется поле длины. Команды могут выполнять копирование, поиск, редактирование цепочек и другие действия.


Кроме того, важными являются значения булевой алгебры (истина и ложь). Теоретически эти значения может представлять один бит. Однако, поскольку отдельные биты не имеют собственных адресов, на практике используется байт или даже слово. Часто применяется следующее соглашение: 0 означает ложь, а все остальное - истину. Бывают ситуации, когда булево значение представляется 1 битом, - это когда имеется массив значений (32-битное слово может содержать 32 буле­вых значения). Такая структура данных называется битовой картой.

Еще один важный тип данных уровня команд - указатели, которые представляют собой машин­ные адреса.

Процессор Pentium II поддерживает двоичные целые числа со знаком и без знака (8-, 16- и 32-разрядные), числа двоично-десятичной системы (8-битные пары цифр) и числа с плавающей точкой (32- и 64- разрядные). У этой машины имеются многочисленные арифметические команды, булевы операции и операции сравнения. Операнды необязательно долж­ны быть выровнены в памяти, но если адреса слов кратны 4 байтам, то наблюдает­ся более высокая производительность.

Pentium II также может манипулировать 8-разрядными символами ASCII: существуют специальные команды для копирования и поиска цепочек символов. Эти команды используются как для цепочек с известной длиной, так и для цепочек со специальным маркером в конце.

UltraSPARC II поддерживает широкий набор форматов данных. Эта машина может оперировать 8-, 16-, 32- и 64-битными целочисленными операндами со знаком и без знака. Как и у Pentium II, целые числа со знаком представляются в дополнительном коде. Кроме того, имеются операнды с плавающей точкой по 32, 64 и 128 битов. Двоично-десятич­ные числа им не поддерживаются. Все операнды должны быть выровнены в памяти.

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

Java - язык со строгим контролем типов. Каждый операнд Java-программы имеет заранее известные тип и размер. Это отраже­но в типах, поддерживаемых JVM. Она использует целые числа со знаком (8-, 16-, 32- и 64-разрядные) в дополнительном коде, а также числа с плавающей точкой (32- и 64-разрядные). Целые числа без знака, как и двоично-десятичные числа, в языке Java не присутствуют и соответственно не поддерживаются JVM.

JVM оперирует 16-битными символами UNICODE. Указатели используются для внутренних целей компилятора и системы обслуживания, в основном для ссылок на объекты.


5.1.5. Форматы команд


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


В некоторых ЭВМ все команды имеют одинаковую длину, в других - разную. Если все команды одной длины, то упрощается их декодирование. Однако для программ тогда требуется больше пространства, поскольку все команды должны быть по длине равными самой большой.


5.1.5.1. Принципы разработки форматов команд


Практика показывает, что удачно построенный набор ко­манд может продолжать существовать 20 лет и более. Большое значение при этом имеет возможность добавлять новые команды и использовать новые технические достижения.

Эффективность конкретной архитектуры команд зависит от технологии, кото­рая применялась при разработке компьютера. Например, если доступ к памяти осуществляется быстро, то подойдет стековая архитектура (как в JVM), но если доступ к памяти осуществляется медленно, то целесообразно иметь много регистров (как в UltraSPARC II). Кроме того, с течением времени технология существенно меняется, и некоторые характе­ристики архитектуры команд впоследствии могут оказаться неудачными. Отсюда следует, что разработка системы команд представляет собой трудную задачу.

Для экономии памяти лучше иметь короткие команды, чем длинные. Хотя цены на память постоянно снижаются, объемы программного обеспечения разрастаются еще быстрее.

С другой стороны, минимизация размера команд может усложнить их декодирование. Следовательно, достижение минимального размера команды должно согласовываться со временем, затрачиваемым на декодирование и выполнение.

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

Второй критерий разработки - достаточный объем пространства в формате команды для выражения всех требуемых операндов. Например, машина с операциями, у которой каждая команда занимает менее n битов, невозможна. В этом случае в коде операции недостаточно места для идентификации команд. Исто­рия показывает, что необходимо оставлять большое количе­ство свободных кодов операций для будущих дополнений к набору команд.

Третий критерий связан с длиной адресуемых данных. Например, побайтная адресация дает длинные адреса, но эффективный доступ к отдельным байтам. Если адресуются слова, то сам адрес становится короче, зато усложняется доступ к байтам внутри слов. В истории существовали две крайности - побитовая организация памяти (например, Burroughs B1700) и память, состоящая из длинных слов (например, серия CDC Cyber содержала 60-битные слова).


Современные компьютерные системы пришли к компромиссу. Они требуют, чтобы адреса были у отдельных байтов, но при обращении к памяти считывалось одно, два, а иногда даже четыре слова сразу. В результате запроса одно­го байта из памяти на UltraSPARC II считывается сразу минимум 16 бай­тов, а иногда и вся строка кэш-памяти в 64 байта.

При разработке форматов команд получила применение схема, называемая расширением кода операции. Она состоит в использовании для кодов операций в командах различного количества битов. Возможны два принципа изменения размера кодов операций. С одной стороны, можно иметь все команды одинаковой длины, приписывая самые короткие коды тем командам, которым нужно больше всего битов для другой информации (например, большего количества операндов). С другой стороны, можно свести к минимуму средний размер команды, если выбрать самые короткие коды операций для часто используемых команд и самые длинные - для остальных.


5.1.5.2. Форматы команд процессора Pentium II


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

В первых архитектурах Intel все коды операций занимали по 1 байту, но для изменения некоторых команд часто использовался так называемый префиксный байт. Префиксный байт - это дополнительный код, который ставится перед командой для ее настройки. Сейчас префиксов может быть несколько. Они могут задавать размер операнда (переключение между 16- и 32-битными), размер адреса (16/32), сегментный регистр и другие модификации.

Фиксированные биты в кодах операций процессора Pentium II дают мало информации о команде. В ряде команд информативными являются младший бит кода опера­ции, который задает длину операнда - байт или слово (b/w), а также соседний слева бит, который указывает, является ли адрес памяти (если он есть) источником (s) или приемником (d). Таким образом, в большинстве случаев код операции должен быть полностью декодиро­ван, чтобы установить, к какому классу относится текущая операция, и, следовательно, какова длина данной команды. Это снижает производительность, поскольку необходимо декодировать текущую команду, прежде чем удастся прочитать следующую.

В большинстве команд за байтом кода операции следует байт состояния (MODE), который сообщает информацию об адресации операндов. Эти 8 битов распределены в 2-битном поле MOD и двух 3-битных регистровых полях REG и R/M (иногда первые три бита этого байта используются для расширения кода операции). 2-битный размер поля MOD означает, что существует только 4 способа обращения к операндам. Один из операндов всегда должен быть регис­тром. Кроме того, правила кодирования команд запрещают некоторые комбинации регистров, поскольку они используются для особых случаев. В не­которых типах команд требуется дополнительный байт, называемый SIB (Scale, Index, Base - масштаб, индекс, база), который дает дополнительную специфи­кацию адреса операнда. Эта схема громоздка, но она является компромиссом между требованием обратной совместимости и желанием добавлять новые особенности, которые не были предусмотрены изначально.


Кроме сказанного, некоторые команды имеют 1, 2 или 4 дополнительных байта для определения адреса (смещение), а иногда еще 1, 2 или 4 байта, содер­жащих константу (непосредственный операнд).


Команда (кол-во байтов):

0 – 5 1 – 2 0 – 1 0 – 1 0 – 4 0 – 4

Префиксы

Код

операции

Состояние

SIB

Смещение

Непосредственный

операнд


Код операции (битов):

6 1 1

Операция

s/d

b/w


MODE:

2 3 3

MOD

REG

R/M


SIB:

2 3 3

SCALE

INDEX

BASE


5.1.5.3. Форматы команд процессора UltraSPARC II


Процессор UltraSPARC II имеет архитектуру выровненных в памяти 32-битных команд. Типичная команда содержит два регистра-операнда и один выходной регистр. Вместо одного из регистров может использоваться константа со знаком. При выполнении команды LOAD два регистра (или один регистр и 13-битная константа) складываются для определения считываемого адреса памяти. Данные из нее записываются в другой указанный регистр.

Изначально машина SPARC имела ограниченное число форматов команд. Со временем добавлялись новые, и их число уже превышает 30. Большинство новых форматов было получено путем изымания нескольких битов из какого-нибудь поля. Например, изначально для команд перехода использовался формат 3 с 22-битным смещени­ем. Когда были добавлены прогнозируемые переходы, 3 из 22 битов изъяли: один из них стал использоваться для прогнозирования (совершать или не совер­шать переход), а два оставшихся определяли, какой набор битов условного кода нужно использовать. В результате получилось 19-битное смещение.

Первые два бита каждой команды помогают определить формат команды и сообщают о местонахождении оставшейся части кода операции, если она есть. В формате 1а оба операнда-источника представляют собой регист­ры; в формате lb один источник - регистр, второй - константа в промежутке от -4096 до +4095. Бит 13 определяет один из этих двух форматов. В обоих случаях приемником всегда является регистр. Достаточный объем пространства кода операции обеспечен для 64 команд, некоторые из которых сохранены на будущее.

Поскольку все команды 32-битные, включить в команду 32-битную константу невозможно. Поэтому команда SETHI устанавливает 22 бита, оставляя пространство для другой команды, чтобы установить оставшиеся 10 битов. Это единственная команда, которая использует данный формат.

Для непрогнозируемых условных переходов используется формат 3, в котором поле УСЛОВИЕ определяет, какое условие нужно проверить. Прогнозируе­мые переходы используют тот же формат, но только с 19-битным смещением, как было сказано выше.

Последний формат применяется для команды вызова процедуры (CALL). Только в ней для определения адреса требуется 30 би­тов. Она имеет 2-битный код операции. Требуемый адрес - это целевой адрес, разделенный на четыре.