Э. Таненбаум - Архитектура компьютера (1127755), страница 143
Текст из файла (страница 143)
ЖЙ1 ! Й1 = старшие биты адреса И Жй2. ЕЖЙ1+ЖЕО(И)1 ! резервирование 4 байт г и их инициализация значениеи 3 ! резервирование 4 байт ! и их инициализация значениеи 4 ! резервирование 4 бай» ! и их инициализация значениеи 0 Знакомство с ассемблером 563 после меток команд, но не после меток данных. Данное различие вовсе не является чем-то фундаментальным, просто у разработчиков разных ассемблеров разные вкусы. Архитектура машины никак не влияет на тот или иной выбор. Единственное достоинство двоеточия состоит в том, что метку можно написать на отдельной строке, а код операции — на следующей строке с тем же отступом, что и метка. Без двоеточия компилятору невозможно было бы отличить метку от кода операции при их размещении в отдельных строках.
В некоторых ассемблерах длина метки ограничена значением 6 или 8 символов. В то же время в большинстве языков высокого уровня длина имен произвольна. Длинные и хорошо подобранные имена упрощают чтение и понимание программы. В каждой машине есть несколько регистров, но названия у них совершенно разные. Регистры Репг)пш 4 называются ЕАХ, ЕВХ, ЕСХ и т. д., регистры Мосого1а — Е)0, Е)1, Е)2, регистры БРАКС имеют несколько названий. В этой книге для их обозначения мы будем использовать символы Ж1 и Фк2. В поле кода операции содержится либо символическая аббревиатура этого кода (если оператор является символическим представлением машинной команды), либо команда самого ассемблера.
Выбор имени — дело вкуса, и поэтому разные разработчики называют их по-разному. Разработчики ассемблера 1пге! решили использовать обозначение МОЧ и для загрузки регистра из памяти и сохранения регистра в память, разработчики ассемблера Могого1а выбрали для обеих операций обозначение МОЧЕ, а разработчики ассемблера БРАКС решили использовать символы ЕО для первой операции и 5Т для второй. Очевидно, что выбор названий в данном случае никак не связан с архитектурой машины.
Напротив, необходимость указывать две машинные команды для доступа к памяти объясняется архитектурой БРАКС, поскольку виртуальные адреса могут быть 32-разрядными (как в 8РАКС версии 8) и 44-разрядными (как в БРАКС версии 9), а команды могут содержать максимум 22 бита данных. Следовательно, чтобы передать все биты полного виртуального адреса, всегда требуются две команды. Например: 5ЕТН1 $Н111) да1 Эта команда обнуляет старшие 32 бита и младшие 10 бит 64-разрядного регистра К1, а затем помещает старшие 22 бита 32-разрядного адреса переменной 1 в битовые позиции с 10 по 31 регистра К1.
Далее: гэРМ1+Мыл(1))да1 Эта команда складывает 21 и младшие 10 бит адреса [ (в результате получается полный адрес 1), вызывает данное слово из памяти и помещает его в регистр к1. Указанные команды, прямо скажем, не слишком элегантны, однако разработчики БРАКС не гнались за красотой. Перед ними была поставлена задача обеспечить высокую скорость исполнения, и они успешно ее решили. Процессоры семейства Репг)пш, 680хО и ВРАТ позволяют работать с операндами разной длины (размером с байт, слово и длинное слово).
Каким образом ассемблер определяет, какова длина операндов? И опять разработчики разных ассемблеров приняли разные решения. В Репгшш 4 регистры разной длины имеют разные названия. Так, для перемещения 32-разрядных значений исполь- 564 Глава 7. Уровень ассемблера Директивы Ассемблерная программа определяет не только машинные команды, которые нужно выполнять процессору, но и команды, которые нужно выполнять самому ассемблеру (например, выделить немного памяти или выдать новую страницу листинга).
Команды для ассемблера называются псевдокомандамн, нли ассемблерными директивами. В листинге 7.1 мы уже встречали типичную псевдокоманду 00. В табл. 7.2 перечислены некоторые другие псевдокоманды (директивы). Они взяты из ассемблера МАЯМ семейства ассемблеров 1пге!. Таблица 7.2.
Некоторые директивы ассемблера МАЯМ Яиректива Описание ВЕВМЕНТ Начало нового сегмента (текста, данных и т. и.) с определенными атрибутами ЕНОЗ Завершение текущего сегмента Управление выравниванием следующей команды или данных Определение нового символа, равного данному выражению Вьщеление памяти для одного или нескольких байтов Выделение памяти для одного или нескольких 1В-разрядных полуслов Выделение памяти для одного или нескольких 32-разрядных слов АЫВМ Е00 ОВ ОУУ 00 зуется название ЕАХ, для 16-разрядных — АХ, а для 8-разрядных — А1. и АН. Разработчики ассемблера Могого1а решили прибавлять к каждому коду операции суффикс .
Е для типа 1опо, .'т1 — для типа иогб и .  — для типа Ьусе. В ЯРАКС для операндов разной длины используются разные коды операций, например, для загрузки байта, полуслова и слова в 64-разрядный регистр указываются коды операций 005В, Е05Н и 1.05И соответственно. Как видите, природа языков совершенно произвольна. Три ассемблера, которые мы рассматриваем, различаются способом резервирования пространства для данных.
Разработчики ассемблера 1пге! выбрали для этой операции название 00 (Пебпе ПопЫе — определить двойное слово), поскольку слово процессора 8088 имело длину 8 бит. В Могого1а используется аббревиатура 0С (Пейпе Сопзгапг — определить константу). Разработчики ЯРАКС с самого начала предпочли название .НОЕВ. И снова различия абсолютно случайны. В поле операндов оператора задаются адреса и регистры, которые являются операндами машинной команды. В поле операндов команды целочисленного сложения указывается, что и к чему нужно прибавить. Поле операндов команд перехода определяет, куда совершается переход.
Операндами могут быть регистры,константы, ячейки памяти и т. д. В поле комментариев поясняются действия программы. Эти пояснения могут пригодиться программистам, которым потом придется использовать и дорабатывать чужую программу, а также самому автору программы, когда он через год вернется к работе над ней.
Ассемблерная программа без таких комментариев— нечто совершенно невразумительное (даже для ее автора). Комментарии могут быть полезны только людям и никак не влияют на работу программы. Знакомство с ассемблером 555 директива Описание ОО РНОС ЕНОР Е1.ВЕ ЕНО1Г СОММЕНТ РАВЕ ЕНО Директива 5Е6МЕМТ начинает новый сегмент, а директива ЕМ05 завершает его. Разрешается начинать текстовый сегмент, затем начинать сегмент данных, затем переходить обратно к текстовому сегменту и т.
д. Директива АЕ16М передает следующую строку (обычно данные) по адресу, заданному аргументом директивы. Например, если текуший сегмент уже содержит 61 байт данных, тогда после выполнения директивы АЕ16М 4 следующим выделяемым адресом будет адрес 64. Директива Е00 дает символическое название некоторому выражению. Например, после следующей директивы символ ВА5Е можно использовать в программе вместо значения 1000: ВАВЕ Е00 1000 Выражение, которое следует за директивой Е00, может содержать несколько символов, соединенных знаками арифметических и других операций, например: 01М1Т Е00 4 * ВЯ5Е + 2000 Большинство ассемблеров, в том числе МАЯМ, требуют, чтобы символ был определен в программе до его появления в таком выражении, как зто. Директивы 0В, 00, 0М и 00 выделяют память для одной или нескольких переменных размером 1, 2, 4 и 8 байт соответственно.
Например: ТРВЕЕ ВВ П . 23. 49 Эта директива выделяет место для 3 байт и присваивает им начальные значения 11, 23 и 49 соответственно, кроме того, она определяет символ ТАВЕЕ, равный тому адресу, по которому хранится значение 11. МАСВО ЕНОМ РПВЫС ЕХТЕНН 1НСШОЕ Выделение памяти для одного или нескольких В4-разрядных двойных слов Начало процедуры Завершение процедуры Начало макроса Завершение макроса Экспорт имени, определенного в данном модуле Импорт имени из другого модуля Вызов другого файла и включение его в текущий файл Начало условного ассемблирования программы на основе данного выражения Начало условного ассемблирования программы, если условие для директивы 1Г не выполнено Завершение условного ассемблирования программы Определение нового символа начала поля комментариев Принудительный разрыв страницы в листинге Завершение ассемблерной программы 566 Глава 7.