Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛК_МашЗавЯП_А4.doc
Скачиваний:
157
Добавлен:
10.06.2015
Размер:
19.94 Mб
Скачать
    1. Формат объектного файла

Ассемблер и компоновщик создают объектные файлы, которые могут выполняться устройством. Формат для этих объектных файлов назван общим объектным файловым форматом (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раздела.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]