Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Формат объектного файла




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




Поделиться с друзьями:


Дата добавления: 2014-10-17; Просмотров: 595; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.