GCC - The Complete Reference (537669), страница 62
Текст из файла (страница 62)
В случае если список аргументов занимает более одной строки, то он обязательно должен быть заключен в квадратные скобки. 4. Создайте вайей!ейп. Чтобы воспользоваться преимушествами конфигурирования утилитой Ацсосопб, необходимо изменить содержимое компоновочного файла. Его следует переименовать в хва)кеб11е. Ап и включить в него сценарии, сгенерированные средством дцеосопб. Некоторые часто встречающиеся определения приведены в таблице 14.4. Глава 14.
Утилиты гпайе и Ац1осопг 277 Таблица 14.4. Ключевые слова, оп еделяемые утилитой дцтосопТ для п1аке-файлов Квивоооо елово Оввеовво всРьаово 9СРРО осРРРьаовв осххо 9СХХРЬЪОВ9 9СЕРВ9 Как правило, имеет значение -яака=лаве ь Имя каталога, содержащего исходные файлы. 5. Создайте сопйй.'пйп. Самый простой способ создания конфигурационного заголовочного файла — запуск утилиты ацсоцеагтег и создание с ее помощью файла сспййд.Ь. 1п. Последний используется в качестве входного файла при построении файла сспеад.
ь, Для этого введите команду без аргументов: а ацеопеад 6. Обновите исходный код. Во все файлы исходного кода, для которых перенос программы может иметь значение, необходимо директивой йапс1цтте включить заголовочный файл сопйьд.Ь. Это обеспечивает выполнение условной компиляции в соответствии с параметрами среды. Например, при отсутствии стандартных заголовочных файлов языка С вам, возможно, придется изменить порядок установки: 91тдег ЗТПС ИЕЛПКНЗ !* Коилилируетсл только в случае отсутствии стандартных заголовочнзгк файлов С */ еепд1Е 7.
Создайте сценарий установки. С помощью следующей команды утилита ацсосопг считывает файл сопгйдцге. ап и вырабатывает сценарий соптьдцге: 3 ацсосопе 8. Скопируйте сценарии Ав1осопГ. Следующие три сценария должны быть включены в пакет установки. Они входят в состав кцсосопй и, как правило, находятся в каталоге /цег/11Ь/аисосопб или /цнг/онаго/ацсстаке: сопт1д.асеев соптад.вцЬ 1пвеа11-вЬ вговтаььв вьстьаовв 9ЬХВОВЗВ9 вьтвео ввавьхве ввкт наккв 9вгсдхго Компилятор С.
Набор флагов, передаваемых компилятору С. Препроцессор С. Набор флагов, передаваемых препроцессору С. Компилятор С++. Набор флагов, передаваемых компилятору С++. Как правило, при использовании макроса хс соивхо кварка определяется как -рнаук соигхо и. Утилита клега11 или сценарий ьпвга11-вкь Флаги, передаваемые компоновщику. Объектные файлы, включаемые при компоновке программ. Библиотеки, используемые при компоновке программ. Утилита гапььь. ава Йивмбпер ИМ0 А ссемблер ОХ~3 составлен из довольно большого набора ассемблеров. Он поддерживет множество разнообразных платформ.
Несмотря на то, что каждый отдельный ассемблер имеет свои особенное~и, основной набор директив — общий для всех. Переносу программ способствует также и то, что формат мнемонических инструкций машинных операционных кодов (орсобез) для каждого семейства платформ мало изменяется от одной версии платформы к следующей ее версии. Ассемблер проекта ОХБ разработан для ассемблирования выходного кода компилятора в объектный код для дальнейшей передачи компоновщику.
Поэтому ол интегрирован с компилятором б1ч0 и обычнодействует на заднем плане. Но иногда могут возникать и такие обстоятельства, когда нужно поработать непосредственно с ассемблерным кодом. Управление ассемблированием из командной строки Когда программа пишется на языке высокого уровня, ОСС обычно сам задействует ассемблер соответствующей платформы. При этом редко приходится применять опции команд дсс, связанные с ассемблированием.
Однако если понадобится написать отдельный модуль на языке ассемблера для особых целей, то придется применить некоторые специальные опции из тех, что приведены в таблице 15.1. Если требуется написать на ассемблере отдельный модуль, то для начала лучше написать на языке С простую программу, которая содержит все необходимые структурные элементы, и затем применить чсс с опцией -8, чтобы сгенерировать начальный исходный модуль на ассемблере. Написание программ на ассемблере — трудоемкий процесс, и при этом трудно избежать ошибок. Поэтому лучше начинать с применения такого испытанного генератора ассемблерного кода, как ССС. Глава 1В. Ассемблер Ог)() 279 Таблица 15,1. Опции командной строки Ясс для управления ассембле ом бй)0 Включает вывод листинга в файл с именем л21е.
С этой опцией в поле орсэ можно использовать одну нз приведенных ниже букв или нх сочетание для указания формата и содержания вывода. По умолчанию эта опция применяется как сочетание -аь1в. Листинг обычно направляется на стандартный выход, но его можно перенаправить в файл, если указать имя файла в параметре опции, например, так: -анйв авеаЬ1у. 11вс. Значение буквенных кодов флагов этой опции: -а (оров] (йя22е) с — не выводит код, пропускаемый по условию; Š— пропускает все отладочные директивы; Ь вЂ” включает в вывод исходный код языка высокого уровня; 1 — включает в вывод дамп ассемблированного кода в шестнадцатиричном формате; ь — выводит статистику построчной отладки; т — включает в вывод макро-расширения; л — не выводит результаты обработки форм; в — выводит таблицу перекрестных ссылок программных символов. Пропускает предобработку пустых строк и комментариев.
Воспринимает предупредительные сообщения как ошибки. Генерирует отладочную информацию в формате ОЧУАВЕ2 и помещает ее в объектном файле. Генерирует отладочную информацию в формате ВТАБ и помещает ее в объектном файле. Выводит список опций и на этом завершает работу программы. Добавляет указанное имя каталога к списку расположений для поиска файлов, включаемых по директиве .
1со1иее. Указывает не выдавать предупреждений при переполнении знаковых целочисленных переменных (сцрпеб очегяош). Выдает предупредительные сообщения при изменениях в таблице смещений (Прнегепсез (аЫе). Эта таблица содержит абсолютные величины, получаемые иэ пары перемещаемых адресов с помощью вычитания. Она должна обновляться каждый раз при установке новых значений адресов. Сохраняет записи таблицы символов (зуглЬо) (аЫе еп(пез) для локально определенных символов, в исходном листинге они начинаются с последовательности ".ь". -Еаса1-иагозляе -ядиаххз --явквЬв --Ье1р -1 Лххесгоху -веер-1ооа1е То же, что и --Ьеер-1осв1э.
То же, что и --жк1. -м Информация зависимостей в формате, допускающем ее помещение в компоновочный сценарий (глакейе), Выводится в файл с именем, указанным в поле 212елвже. Компилирует в режиме совместимости с МВ(. Это означает, что процесс ассемблирования воспринимает синтаксис стандартного ассемблера, поставляемого компанией Малого(ес Пезеагсп. -Нр 221елате — Евсеуж ВужЬО2к яз1ОВ ОПрЕдЕЛяЕт СИМВОЛ С ИМЕНЕМ аузШО2 И НаэиаЧавт ЕМУ ЗНаЧЕНИЕ кв2ив. 280 Часть!П. Внутренняя структура и окружение Опцией Описание Подавляет вывод любых предупредительных сообщений. То же, что и --и.
--ло-маке Назначает имя выходного файла. Помещает код из раздела рыл в разделе тахт. Показывает общее время ассемблирования и объем памяти, задействованной процессом ассемблера, Любые символы, локальные для данной сессии ассемблирования и имеющие постоянное значение, удаляются. Ссылки на них заменяются литералами с их значением. Назначает вывод в формате ассемблера, комплектного применяемой системе, Выводит список опций, специфичных для целевой платформы, и на атом ааверщает работу программы. Выводит номер версии и завершает работу программы. Подавляет вывод всех предупредительных сообщений.
То же, что и --по-иакл. -о т11елаае --есасквкасв --вскьр-1оса1-аьес1псе --ькваьс1опа1-еоквас --сакяес-Ье1р --текеьол Если нет необходимости делать большой кусок работы на ассемблере, то лучше сделать вставку ассемблерного кода в протрамму на языке более высокого уровня. Этот вопрос будет подробно рассмотрен далее в этой ~лаве. Абсолютная и относительная адресация, выравнивание адресов Многие действия в языке ассемблера непосредственно связаны с адресами и с вычислением адресов.
Адреса ссылок, указываемые в ассемблерном коде как символические имена расположений памяти, вычисляются и подстанавливаются ассемблером. Например, следующая инструкция З1е (локальный переход к указанному адресу) передает управление на строку, которая следует за меткой . ЬЗ: ада 316,тьевр З1е .ХЗ оа11 тцпсе1оп .Ьз юом1 аб,тьеах Расположение кода, отмеченное как . ЬЗ, не является абсолююной числовой величиной, Компоновщик будет изменять его значение при каждой компоновке исполняемой программы. Так что адрес метки .ьЗ вЂ” относительная величина.
Она может быть определена только как смещение относительно начала модуля. Компоновщик заменяет значения всех ссылок их относительными адресами, так же как и аргументную ссылку оператора З1е в рассмотренном выше примере. Абсолютное выражение имеет постоянное, неизменяемое при компоновке значение. Оно может представлять собой постоянную величину, либо вычисляться как результат выражения. Возможно вычисление абсолютного значения и из относительных величин при выполнении действий над относительными адресами. Например, Главв зб. Ассемблер 6Й(1 28 1 следующее выражение дает в результате абсолютную величину, потому что смеше- ние между двумя указанными расположениями кода будет постоянным: .Ьб — .ЬЗ Компоновщик будет перемешать расположение как .
ьб, так и . Ьз, но при этом смещение между ними будет постоянным. В следующем примере результат выражения будет относительным к положению метки . Ь44, потому что в выражении вычисляется абсолютная величина и складывается с относительным адресом метки . ЬЯЯ: .ЬЯЯ + .Ьб — .ГЗ Некоторые выражения с адресной арифметикой не могут быть однозначно определены (11! де(1пед ехргезз)опз). Например, результатом следующего выражения будет число, не имеющее смысла.
Оно является функцией начального адреса размещения модуля в памяти, которое выбирается компоновщиком. .Ьб + .ЬЗ Следующим важным положением применения ассемблера является выравнивание адреса (адгезб Ьоцпдагу). Если адрес является числом, кратным 16 (те, деление этого числа на 16 не дает остатка), то мы говорим, что этот адрес имеет выравнивание по границе 16-бит, или 16-битное выравнивание.
Это может иметь важное значение для некоторых структур данных н для инструкций. В некоторых случаях от этого зависит эффективность программы, но чаще всего применение определенного выравнивания диктуешься требованиями аппаратуры. Такие директивы ассемблера, как . окд и . в14дп, используются для заполнения указанным в них значением нужного количества байт для обеспечения требуемого выравнивания адреса следующей инструкции. Разумеется, при этом необходимо, чтобы при компоновке программы выравнивание применялось и к начальному адресу модуля. Только тогда внутреннее выравнивание кода и элементов данных будет корректно соответствовать применяемым требованиям. Вставка ассемблерного кода Необходимость непосредственного включения в программу ассемблерного кола может возникнуть по целому ряду причин.