Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Основные инструкции для работы с регистрами
Основные команды для работы с вещественными числами
Листинги программ Листинг программы показывает исходные инструкции и объектный код, который они производят. Чтобы получить файл листинга, вызовите ассемблер с опцией - L. Листинг печатается постранично. Незаполненную строку и строку заголовка, имеют наверху каждая страница распечатки. Любой заголовок, определенный.title директивой, печатается в строке заголовка. Номер страницы печатается справа от заголовка. Если Вы не используете.title директиву, печатается имя исходного файла. Ассемблер вставляет незаполненную строку ниже строки заголовка. Каждая строка в исходном файле создает, по крайней мере, одну строку в файле листинга. Она содержит в порядке слева направо номер исходной инструкции, значение SPC, объектный код, и исходную инструкцию.. Пример показывает листинг ассемблера. Формат объектного файла Ассемблер и компоновщик создают объектные файлы, которые могут выполняться устройством. Формат для этих объектных файлов назван общим объектным файловым форматом (COFF – ООФФ). ООФФ упрощает модульное программирование при написании программы на языке ассемблера, поскольку он позволяет представлять программу и данные в виде блоков. Эти блоки известны как разделы. Как ассемблер, так и компоновщик обеспечены директивами, которые позволяют создавать и манипулировать разделами. Разделы. Наименьший модуль объектного файла называется разделом. Раздел - блок программы или данных, который занимает непрерывное пространство на карте памяти с другими разделами. Каждый раздел объектного файла является самостоятельным и отличным от других. По умолчанию ООФФ объектных файлов всегда содержит три раздела: · Раздел текста -.text обычно содержит выполняемый код. · Раздел данных -.data обычно содержит инициализированные данные. · Раздел.bss обычно резервируется для неинициализированных переменных. Кроме того, ассемблер и компоновщик позволяют Вам создавать, называть и связывать поименованные разделы, которые используются подобно разделам.data,.text и.bss. Есть два основных типа разделов: · Инициализированные разделы содержат данные или код. Разделы.text и.data проинициализированы. Именуемые разделы, создаваемые с помощью директивы ассемблера.sect, также проинициализированы; · Неинициализированные разделы резервируют пространство на карте памяти для неинициализированных данных. Раздел.bss неинициализированный. Именуемые разделы, создаваемые с помощью директивы ассемблера.usect, также неинициализированные. Различные директивы ассемблера позволяют связывать различные части программного кода и данных с соответствующими разделами. Ассемблер формирует эти разделы в течение процесса ассемблирования, создавая объектный файл, организованный так. В системе имеется целевая платформа (Устройство), это плата с конкретным процессором. Там имеется целевая память, содержащая разделы: ПЗУ (ROM), перепрограммируемое ПЗУ (EEPROM), ОЗУ (RAM). Этим разделам назначается область адресов в карте распределения целевой памяти. Компоновщик должен перемещать в целевую память разделы объектного кода. Поскольку большинство систем содержат различные типы памяти, то применение разделов может помочь использовать целевую память более эффективно. Все разделы независимо переместимые, любой раздел можно разместить в любом блоке целевой памяти. Если у вас нет целевой платформы, то отладчик имитирует ее. Ассемблер идентифицирует части программы на языке ассемблера, которые принадлежат данному разделу. Ассемблер имеет 5 директив поддержки этой функции: ·.bss ·.usect ·.text ·.data ·.sect Директивы.bss и.usect создают неинициализированные разделы; директивы.text,.data, и.sect создают инициализированные разделы. Вы можете создавать подразделы любого раздела, чтобы дать Вам более жесткое управление картой памяти. Подразделы создаются, используя.sect и.usect директивы. Подразделы идентифицируются основным именем раздела и именем подраздела, отделенным двоеточием. Неинициализированные разделы резервируют пространство в памяти C28x; они обычно распределены в ОЗУ. Эти разделы не имеют никакого фактического содержания в объектном файле, они просто резервируют память. Программа может использовать это пространство во время выполнения для создания и сохранения переменных. Неинициализированные области данных формируются, используя директивы ассемблера.bss и.usect: · Директива.bss резервирует пространство в.bss разделе. Директива.bss резервирует данное число байтов в.bss разделе. Вы должны определить размер, нет никакого значения по умолчанию. · Директива.usect резервирует пространство в определенном неинициализированном названном разделе. Директива.usect резервирует данное число байтов в разделе с указанным именем. Вы должны определить размер, нет никакого значения по умолчанию. Каждый раз, когда Вы вызываете.bss или.usect директиву, ассемблер резервирует дополнительное пространство в.bss или названном разделе. Синтаксис директивы.bss: .bss символ, размер в словах [, флаг блокировки[, флаг выравнивания [, тип]] Синтаксис директивы.usect: символ.usect ”имя раздела”, размер в словах [, флаг блокировки[, флаг выравнивания]
· Символ указывает на первый байт, зарезервированный этим обращением директивы.bss или.usect. Символ соответствует имени переменной, для которой Вы резервируете пространство. На него может ссылаться любой другой раздел, а также он может быть объявлен, как глобальный символ (директивой ассемблера.global). · Размер в словах – абсолютное выражение. · Флаг блокировки. · Флаг выравнивание – необязательный параметр. Он определяет минимальное выравнивание в байтах, требуемое распределяемым пространством. Значение по умолчанию – 1 байт. Значение должно быть степенью числа 2. · Необязательный тип. Директивы инициализированных разделов (.text,.data, и.sect) указывают ассемблеру прекратить трансляцию в текущий раздел и начать транслировать в обозначенный раздел. Директивы.bss и.usect, однако, не заканчивают данный раздел и не начинают новый, они просто выходят от текущего раздела временно. Директивы.bss и.usect могут появляться где-нибудь в инициализированном разделе, не воздействуя на его содержание. Ассемблер обрабатывает неинициализированные подразделы (созданные.usect директивой) тем же самым способом, как неинициализированные разделы. Инициализированные разделы содержат выполняемый код или инициализированные данные. Содержание этих разделов записывается в объектный файл и помещается в память C28x, когда программа загружается. Каждый инициализированный раздел – независимо перемещаемый и может ссылаться на символы, которые определены в других разделах. Компоновщик автоматически решает эти ссылки к другим разделам. Три директивы предписывают ассемблеру размещать код или данные в раздел. Синтаксис этих директив: .text .data .sect «имя раздела» Когда ассемблер сталкивается с одной из этих директив, он останавливает трансляцию в текущий раздел (действует как команда конца текущего раздела). Затем он транслирует последующий код в обозначенный раздел, пока не обнаружит другую.text,.data, или.sect директиву. Разделы формируются через итеративный процесс. Например, когда ассемблер первый раз сталкивается с директивой.data, раздел.data - пуст. Инструкции, следующие за первой директивой.data, собираются в.data раздел (пока ассемблер не сталкивается с.text или.sect директивой). Если ассемблер сталкивается с последующими.data директивами, то он прибавляет инструкции после этих директив.data к инструкциям, уже находящимся в разделе.data. Это создает единый раздел.data, который может быть распределен непрерывно в памяти. Инициализированные подразделы создаются.sect директивой. Ассемблер обрабатывает инициализированные подразделы тем же самым способом, как инициализированные разделы. Названные разделы - разделы, которые Вы создаете. Вы можете использовать их подобно заданным по умолчанию.text,.data, и.bss разделам, но они транслируются отдельно. Например, повторное использование.text директивы создает единый.text раздел в объектном файле. Во время компоновки этот.text раздел распределяется в памяти как одиночный модуль. Предположим, что имеется часть выполняемого кода (возможно подпрограмма инициализации), которую Вы не хотите размещать вместе с.text. Если Вы размещаете этот сегмент кода в названном разделе, он транслируется отдельно от.text, и Вы можете распределять его в памяти отдельно. Вы можете также транслировать инициализированные данные, который отличны от.data раздела, и Вы можете резервировать пространство для неинициализированных переменных, которые отличны от.bss раздела. Директивы ассемблера Директивы ассемблера поставляют данные программе и управляют процессом трансляции. Директивы ассемблера дают возможность Вам делать следующее: · Транслировать код и данные в указанные разделы. · Резервировать пространство в памяти для неинициализированных переменных. · Управлять видом листинга. · Инициализировать память. · Транслировать условные блоки. · Определять глобальные переменные. · Определять библиотеки, из которых ассемблер может получить макрокоманды. · Исследовать информацию о символьной отладке. Внимание: Метки и комментарии не показаны в синтаксисе. Любая исходная инструкция, которая содержит директиву, может также содержать метку и комментарий. Метки начинаются в первом столбце (они - единственные элементы, кроме комментариев, которые могут появляться в первом столбце), а комментарии должны начинаться с точки с запятой или звездочки, если комментарий - единственный элемент в строке. Чтобы улучшать разборчивость, метки и комментарии не показываются, как часть синтаксиса директив. В описании части, заключенные в квадратные скобки, могут пропускаться, ассемблер будет их задавать по умолчанию. Разделы
Константы
Выравнивания
Листинг
Файлы
Условная трансляция
Структуры
Символы во время трансляции
Разные директивы
Макроязык и макрокоманды Ассемблер поддерживает макроязык, который дает Вам возможность создать ваши собственные команды. Это особенно полезно, когда программа выполняет частные задачи несколько раз. Макроязык позволяет Вам: · Определить ваши собственные макрокоманды, и переопределить существующие макрокоманды. · Упростить длинный или сложный ассемблерный код. · Обратиться к макробиблиотекам, созданным архиватором. · Определить условные и повторяемые блоки в пределах макрокоманд. · Управлять строками в пределах макрокоманд. · Управлять листингом расширения макрокоманд. Программы часто содержат подпрограммы, которые выполняются несколько раз. Вместо повтора исходных инструкций подпрограммы, Вы можете определять подпрограмму как макрокоманду, а затем вызывать макрокоманду там, где Вы повторяли бы данную подпрограмму. Это упрощает и сокращает вашу исходную программу. Если Вы хотите вызвать макрокоманду несколько раз, но каждый раз с различными данными, Вы можете назначить параметры в пределах макрокоманды. Это дает Вам возможность обеспечивать различную информацию макрокоманде каждый раз, когда Вы ее вызываете. Макроязык поддерживает специальный символ, называемый символом замены, который используется для параметров макрокоманды. Использование макрокоманды - процесс из 3 шагов. Шаг 1: Определение макрокоманды Вы должны определить макрокоманды прежде, чем Вы можете использовать их в вашей программе. Имеются два метода для определения макрокоманд: · Макрокоманды могут быть определены в начале исходного файла или в копируемом / включаемом файле. · Макрокоманды могут также быть определены в макробиблиотеке. Макробиблиотека является собранием файлов в формате архива, созданном архиватором. Каждый элемент архивного файла (макробиблиотеки) может содержать одно макроопределение, соответствующее имени этого элемента. Вы можете обратиться к макробиблиотеке, используя.mlib директиву. Шаг 2: Вызов макрокоманды После того, как Вы определили макрокоманду, вызовите ее, используя имя макрокоманды как мнемонику в тексте исходной программы. Это называется вызовом макрокоманды. Шаг 3: Расширение макрокоманды Ассемблер разворачивает ваши макрокоманды, когда исходная программа вызывает их. Во время расширения ассемблер передает переменные аргументы параметрам макрокоманды, заменяет инструкция макровызова определением макрокоманды, затем транслирует исходный код. По умолчанию, макрорасширения печатаются в файле листинга. Вы можете выключить распечатку расширения, используя директиву.mnolist. Для получения дополнительной информации, см. раздел 5.8, Использование директив для форматирования листинга. Когда ассемблер сталкивается с макроопределением, он размещает имя макрокоманды в таблице кодов операций (opcode table). Это переопределяет, любую предварительно определенную макрокоманду, библиотечный вход, директиву, или мнемонику команды, которые имеют то же самое имя, что и данная макрокоманда. Это позволяет Вам расширить функции директив и команд, а также добавить новые команды. Определение макрокоманд. Вы можете определять макрокоманду где-либо в вашей программе, но Вы должны определить ее прежде, чем Вы сможете ее использовать. Макрокоманды могут быть определены в начале исходного файла, или в копируемом/включаемом файле, или в макробиблиотеке. Макроопределения могут быть вложенными, и они могут вызывать другие макрокоманды, но все элементы макрокоманды должны быть определены в том же самом файле. Макроопределение - ряд исходных инструкций в следующем формате: имя макрокоманды. macro [параметр 1] [,..., параметр n] · Имя макрокоманды называет макрокоманду. Вы должны поместить имя в поле метки исходной инструкции. Только первые 128 знаков имени существенны. Ассемблер размещает макро-имя во внутренней таблице кодов операций, заменяя любую команду или прежнее макроопределение, имеющее то же самое имя. · Директива. macro идентифицирует исходную инструкцию, как первую строку макроопределения. Вы должны разместить.macro в поле кода операции. · Параметр 1,…, параметр n - являются необязательными символами замены, которые появляются как операнды директивы.macro. Пример. Определение, вызов и расширение макрокоманды. Код определяет макрокоманду sadd4 с четырьмя параметрами r1, r2, r3, r4. 1 sadd4.macro r1,r2,r3,r4 2 sadd4 r1, r2,r3, r4 4 r1 = r1 + r2 + r3 + r4 5.endm Макровызов: следующий код вызывает макрокоманду sadd4 с четырьмя параметрами: 11 00000000 sadd4 A0,A1,A2,A3 Макробиблиотеки. Один из способов определения макрокоманд - создание макробиблиотеки. Макробиблиотека - собрание файлов, которые содержат макроопределения. Вы должны использовать архиватор, чтобы собрать эти файлы, или элементы, в одном файле (называемом архивом). Каждый элемент макробиблиотеки содержит одно макроопределение. Файлы в макробиблиотеке должны быть не оттранслированными исходными файлами. Имя макрокоманды и имя элемента должны быть одинаковыми, а расширение имени файла с макрокомандой должно быть.asm. Например:
Вы можете обращаться к макробиблиотеке, используя.mlib директиву ассемблера. Синтаксис:. mlib имя файла Когда ассемблер сталкивается с.mlib директивой, он открывает названную (в имени файла) библиотеку и создает таблицу содержания библиотеки. Ассемблер вводит имена индивидуальных элементов библиотеки в таблицы кодов операций в качестве библиотечных входов; это переопределяет любые существующие коды операции или макрокоманды, которые имеют то же самое имя. Если одна из этих макрокоманд вызывается, ассемблер извлекает вход библиотеки и загружает его в таблицу макрокоманд. Ассемблер разворачивает этот библиотечный вход таким же образом, как он разворачивает другие макрокоманды. Извлекаются только те макрокоманды, которые фактически вызываются из библиотеки, и они извлекаются только один раз. Рекурсивные и вложенные макрокоманды. Макроязык поддерживает рекурсивные и вложенные макровызовы. Это означает, что Вы можете вызывать другие макрокоманды внутри макроопределения. Вы можете вкладывать макрокоманды глубиной до 32 уровней. Когда Вы используете рекурсивные макрокоманды, Вы вызываете макрокоманду из ее собственного определения (макрокоманда вызывает саму себя). Когда Вы создаете рекурсивные или вложенные макрокоманды, Вы должны обратить особое внимание на аргументы, которые Вы передаете макропараметрам, потому что ассемблер использует динамический обзор параметров. Это означает, что вызываемая макрокоманда использует окружающую среду макрокоманды, из которой она вызвана. Следующие директивы могут использоваться с макрокомандами. Директивы.macro,.mexit,.endm и.var допустимы только с макрокомандами; оставшиеся директивы - общие директивы языка ассемблера. Создание макрокоманд:
Управление символами замены:
Условная трансляция:
Создание сообщений во время трансляции:
Форматирование листинга:
Компоновщик Компоновщик (Linker) создает исполняемые модули, объединяя объектные файлы COFF. Вызов компоновщика. Общий синтаксис для вызова компоновщика: cl2000 -v28 --run_linker [опции] имя файла 1... имя файла n Опции - могут появляться где-нибудь в командной строке или в командном файле компоновщика. Имя файла 1…имя файла n - могут быть объектные файлы, командные файлы компоновщика, или архивные библиотеки. Заданное по умолчанию расширение для всех входных файлов -.obj; любое другое расширение должно быть явно определено. Компоновщик может определять, является ли входной файл объектным или файлом ASCII, который содержит команды компоновщика. Заданное по умолчанию имя файла вывода a.out, если только Вы не используете -o опцию, чтобы назвать выходной файл. Имеются два метода для вызова компоновщика: · Определить параметры и имена файлов в командной строке. Этот пример связывает два файла, file1.obj и file2.obj, и создают названный модуль вывода link.out. · Ввести команду cl2000 -v28 --run_linker без имен файла или параметров; компоновщик запрашивает их: Для командных файлов, введите один или большее количество имен командных файлов компоновщика. Для объектных файлов, введите один или большее количество имен объектных файлов. Заданное по умолчанию расширение -.obj. Отделите имена файла пробелами или запятыми; если последний знак - запятая, компоновщик предлагает дополнительную строку для имен объектных файлов. Выходной файл - имя выходного модуля компоновщика. Это имя отменяет любые опции –o, которые Вы вводите. Если нет параметра -o, и Вы не отвечаете на этот запрос, компоновщик создает объектный файл со значением по умолчанию - a.out. Опции (параметры) - для дополнительных параметров, хотя Вы можете также ввести их в командный файл. Введите их с дефисами, так, как если бы Вы были в командной строке. Архиватор Архиватор позволяет Вам объединять несколько индивидуальных файлов в один файл архива. Например, Вы можете собрать несколько макрокоманд в макробиблиотеку. Ассемблер ищет библиотеку и использует ее элементы, которые вызываются как макрокоманды исходным файлом. Вы можете также использовать архиватор, чтобы собрать группу объектных файлов в библиотеку объектных модулей. Компоновщик включает в библиотеку элементы, которые решают внешние ссылки в течение компоновки. Архиватор позволяет Вам изменить библиотеку, удаляя, заменяя, извлекая, или добавляя элементы. Вы можете формировать библиотеки из любого типа файлов. И ассемблер и компоновщик принимают архивные библиотеки в качестве входа; ассемблер может использовать библиотеки, которые содержат индивидуальные исходные файлы, а компоновщик может использовать библиотеки, которые содержат отдельные объектные файлы. Одно из наиболее полезных приложений архиватора - построение библиотек из объектных модулей. Например, Вы можете записать несколько арифметических подпрограмм, оттранслировать их и использовать архиватор, чтобы собрать объектные файлы в одну логическую группу. Вы можете тогда определить библиотеку объектных модулей как вход компоновщика. Компоновщик ищет эту библиотеку и включает те ее элементы, которые решают внешние ссылки. Вы можете также использовать архиватор, чтобы формировать макробиблиотеки. Вы можете создавать несколько исходные файлы, каждый из которых содержит одиночную макрокоманду, и использовать архиватор, чтобы собрать эти макрокоманды в одну функциональную группу. Вы можете использовать директиву.mlib в течение трансляции, чтобы определить, какую макробиблиотеку нужно искать для макрокоманд, которые Вы вызываете. Чтобы вызывать архиватор, введите: ar2000[-]команда [параметры] имя библиотеки [имя файла 1... имя файла n] · [-]Команда - сообщает архиватору, как управлять существующими элементами библиотеки и любыми файлами с указанными именами. Перед командой может быть необязательный дефис. Вы должны использовать одну из следующих команд, когда Вы вызываете архиватор, но Вы можете использовать только одну команду в обращении к архиватору. Команды архиватора следующие: · @ Использует содержание указанного файла вместо ввода в командной строке. Вы можете использовать эту команду, чтобы избежать ограничения на длину командной строки, наложенную операционной системой компьютера. Используйте (;) в начале строки в командном файле, чтобы включить комментарии. · a Прибавляет указанные файлы к содержимому библиотеки. Эта команда не заменяет существующий элемент, который имеет то же самое имя, как добавленный файл; она просто добавляет новые элементы в конец архива. · d Удаляет указанные элементы из библиотеки. · r Заменяет указанные элементы библиотеки. Если Вы не указываете имена файлов, архиватор заменяет элементы библиотеки файлами с тем же самым именем из текущего каталога. Если указанный файл не найден в библиотеке, · архиватор добавляет его, вместо замены. · t Печатает оглавление библиотеки. Если Вы определяете имена файлов, только эти файлы печатаются. Если Вы не определяете никаких имен, архиватор перечисляет все элементы указанной библиотеки. · x Извлекает указанные файлы. Если Вы не определяете имена элементов, архиватор извлекает все элементы библиотеки. Когда архиватор извлекает элемент, он
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-07; просмотров: 159; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.0.53 (0.005 с.) |