Э. Таненбаум - Архитектура компьютера (1127755), страница 199
Текст из файла (страница 199)
Последняя секция, секция В88 (В1осй 8гаггех) Ьу ЯушЪо! — блок с начальным символом), нужна для резервирования памяти в неинициализированном (точнее говоря, в инициализированном нулем) сегменте данных. В каждой из трех секций есть собственный счетчик адресов. Секции задумывались для того, чтобы ассемблер мог сгенерировать не- 782 Приложение В. Программирование на языке ассемблера сколько команд, затем перейти к данным, затем вернуться к командам, потом снова к данным, и т.
д., а компоновщик, в свою очередь, мог скомпоновать все эти блоки так. чтобы все команды оказались вместе в текстовом сегменте, а все слова данных — в сегменте данных. Результат обработки любой отдельно взятой строки на языке ассемблера попадает только в одну из секций, хотя строки кода и строки данных могут чередоваться. В период выполнения секция текста хранится в текстовом сегменте, а секции данных и ВБЯ вЂ” последовательно в сегменте данных. Как команда, так и слово данных в программе на языке ассемблера может начинаться с метки. Метка также может быть единственным содержанием строки, и в этом случае она считается относящейся к следующей команде или слову данных.
Пример: СНР АХ.АВС ОЕ Е НОУ АХ.ХЕ2 Здесь Š— метка, связанная со следующей командой или словом. Метки бывают двух видов. Во-первых, существуют глобальные метки, представляющие собой буквенно-цифровые идентификаторы, после которых ставится двоеточие (:). Такие метки должны быть уникальными; они не могут совпадать с ключевыми словами и мнемоническими кодами команд.
Во-вторых, в секции текста встречаются локальные метки, каждая из которых состоит из одной цифры с последующим двоеточием (:). Локальная метка может устанавливаться многократно. Например: аЕ 21 Эта команда означает огхерацихо перехода 00ИР ЕООАЕ вперед до следующей локальной метки 2. Аналогично: >НЕ 4Ь Эта команда означает операцию перехода 30ИР ИОТ ЕООАЕ назад к блихсзйшей локальной метке 4. Ассемблер допускает присвоение константам символических имен в рамках синтаксической конструкции шенгифиаагор = аврааение Здесь идентификатор является буквенно-цифровой строкой, как в следующем примере; ВЕОСК512Е = 1024 Во всех идентификаторах в рассматриваемом языке ассемблера значимыми являл>тся только первые восемь символов. Таким образом, идентификаторы ВЕОСК512Е, ВЕОСК5111 и ВЕОСК511 идентичны.
Выражения могут состоять из констант, численных значений и операторов. Поскольку численные значения меток становятся известными к завершению первого прохода, они приравниваются к константам. Численные значения могут быть восьмеричными (в таком случае они начинаются с нуля), десятеричными или шестнадцатеричными (начинаются с сим- Ассемблер 783 Таблица В.б. Псевдокоманды ассемблера аз88 Псевдокомвндв Описание .ВЕСТ .ТЕХТ .ВЕСТ .ОАТА ,ВЕСТ .ВЗЗ .ВУТЕ .УУОВО .ьОЫО .АЗСИ "в1г" Ассемблирование следующих строк в секции текста Ассемблирование следующих строк в секции данных Ассемблирование следующих строк в секции ВЗЗ Ассемблирование аргументов в виде последовательности байтов Ассемблирование аргументов в виде последовательности слов Ассемблирование аргументов в виде последовательности длинных слов Сохранение строки втг в виде АЗСИ-строки без завершающего нулевого байта Сохранение строки вгг в виде АЗСИ-строки с завершающим нулевым байтом .АЗС!к "в1г" .ЗРАСЕ и .АЫОМ и .ЕХТЕНМ Продвижение счетчика адресов на п позиций Продвижение счетчика адресов до и-байтной границы Объявление идентификатора внешним Псевдокоманды из первого блока формируют секцию, в которой все последующие строки обрабатываются ассемблером.
Как правило, определение такой секции размещается на отдельной строке в произвольной части кода. По соображениям реализации первой должна быть секция текста, затем — секции данных и ВВЯ. После этих исходных ссылок секции могут следовать в произвольном порядке. Помимо прочего, в первой строке секции должна быть установлена глобальная метка. Иных ограничений на порядок следования секций не существует.
Во втором блоке псевдокоманд содержатся указатели типов данных в сегменте данных. Таких типов всего четыре: .ВАТЕ, .110йО, . ЕОМЗ и строка. В первых трех волов ОХ или Ох). В шестнадцатеричном представлении буквы а — 1и А — Р обозначают значения от 10 до 15. Целочисленные операторы +, -, *, / и Ф выражают сложение, вычитание, умножение, деление и остаток о деления, соответственно. Логические операторы Ь, " и - обозначают поразрядное И, поразрядное ИЛИ и логическое отрицание (НЕ), соответственно. Для группировки в выражениях могут устанавливаться квадратные скобки.
Во избежание путаницы круглые скобки в выражениях не используются (оставлены для задания режимов адресации). К меткам в составе выражений следует относиться с осторожностью. Вычитание меток команд из меток данных недопустимо. Разность между однородными метками выражается в численных значениях, однако ни сами метки, ни их разности не могут выступать в качестве констант в мультипликативных и логических выражениях. Выражения, разрешенные к применению в определениях констант, могут быть задействованы в виде констант в командах процессора. В некоторых процессорах предусмотрены макросредства, позволяющие группировать множества команд и присваивать таким группам имена, но в аз88 этой возможности нет. В каждом языке ассемблера есть директивы, которые влияют на процесс ассемблирования, но не транслируются в двоичный код.
Они называются псевдо- командами. Псевдокоманды ассемблера аз88 перечислены в табл. В.5. 784 Приложение В. Программирование на языке ассемблера типах после необязательной метки и ключевого слова псевдокоманды остаток строки занимает список константных выражений с разделением запятыми. Для строк предусмотрено два ключевых слова: А5С11 и Я5С17. Единственное различие мехсду ними заключается в том, что ключевое слово Я5С17 добавляет к концу строки нулевой байт. Оба ключевых слова в обязательном порядке сопровождаются строкой, заключенной в двойные кавычки. В определениях строк допускается ряд символов-заменителей, которые перечислены в табл.
В.б. Вдобавок к ним любой конкретный символ может предваряться обратной косой чертой и выражаться своим восьмеричным представлением, например, т,377 (максимальное число символов — три, 0 в данном случае указывать не требуется). Таблица В.б.
Некоторые разрешенные в ав88 символы-заменители Символ-заменитель Описание Новая строка (перевод строки) Табуляция Обратная косая черта Пробел Подача страницы Возврат каретки Двойная кавычка Псевдокоманда 5РАСЕ увеличивает значение указателя адресов на число байтов, определенное аргументами. это ключевое слово может быть особенно полезным, если установить его после метки в секции 855 в целях резервирования памяти для переменной. Ключевое слово АЕ18й позволяет продвинуть указатель адресов до первой 2-, 4- или 8-байтной границы в памяти, что упрощает ассемблирование слов, двойных слов и т. д.
с размещением в подходящих ячейках памяти. Наконец, ключевое слово ЕХТЕкй' объявляет о доступности указанной программы или ячейки памяти для компоновщика с целью установки внешних ссылок. Определение не обязательно должно находиться в текущем файле; оно может быть в любом месте в пределах досягаемости компоновщика. Следует сделать ряд замечаний касательно совместного применения ассемблера и трассера.
Ассемблер воспринимает ключевые слова как в верхнем, так и в нижнем регистрах; трассер выводит их только в верхнем регистре. Ассемблер воспринимает в качестве символа новой строки символы-заменители Хг (возврат каретки) и Хп (перевод строки), в то время как трассер использует только последний. Ассемблер способен работать с программами, разбитыми на несколько файлов, в то время как для обработки в трассере всю программу необходимо объединить в файл с расширением .5.
Включенные в него файлы запрашиваются командой Ф1псюое ила Файла Включаемый файл в таком случае также должен находиться на указанной позиции в рамках единого 3-файла. Ассемблер проверяет, была ли ранее проведена обработка данного включаемого файла, и загружает одну его копию. Эта возмож- Ассемблер 785 ность особенно полезна в тех случаях, когда один заголовочный файл является общим для нескольких файлов. В такой ситуации в объединенный исходный файл включается только одна его копия. Для включения файла команда Ф1пс1 абе должна быть первым маркером строки без предшествующих разделителей, а путь к файлу должен быть заключен в двойные кавычки. При наличии одного исходного файла (например, рг.з) предполагается, что именем проекта являются символы рг, а объединенный файл должен называться рг.5.
Если исходных файлов несколько, основа имени первого из них принимается за имя проекта, и она же применяется для определения З-файла, который генерируется ассемблером путем объединения исходных файлов. Этот механизм можно изменить, поместив в командной строке перед первым исходным файлом флаг -о ргоблаее; в таком случае объединенный файл получает имя рго1паше.5.
Имейте в виду, что к применению включаемых файлов и нескольких исходных файлов выдвигается ряд условий. В частности, во всех исходных файлах имена меток, переменных и констант должны быть разными. Более того, в конечном счете, в загрузочный файл ассемблируется файл рго)паше.5, поэтому номера строк, указываемые ассемблером при обнаружении ошибок и выводе предупреждений, отсчитываются именно от этого файла. При работе с небольшими проектами имеет смысл писать программу в одном файле, а не использовать команду 111 лс1 ибе.
Некоторые отличия от других ассемблеров 8088 Ассемблер аз88 построен по модели стандартного ассемблера ПМ1Х, в связи с чем он в некоторых отношениях довольно существенно отличается от макроассемблера М1сгозогь МАЯМ и ассемблера Вог1апб 8088 ТАЯМ. И МАЯМ, и ТАЯМ были разработаны для операционной системы МЯ-РОЯ, и связь операционной системы и ассемблера в определенных аспектах прослеживается весьма отчетливо. МАЯМ и ТАЯМ поддерживают все модели памяти 8088, поддерживаемые МЯ-РОЯ. К примеру, в ннх предусмотрены миниатюрная модель памяти, в которой весь код и все данные, вместе взятые, должны умещаться в 64 Кбайт, малая модель, где по 64 Кбайт отводится под каждый из этих сегментов, и большая модель, допускающая наличие множества кодовых сегментов и сегментов данных.