русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Директивы SEGMENT и ENDS


Дата добавления: 2015-06-12; просмотров: 1091; Нарушение авторских прав


Синтаксис:

имя SEGMENT [[выравнивание]] [[комбинация]] [['класс']]

имя ENDS

Директивы SEGMENT и ENDS отмечают соответственно начало и конец программного сегмента и должны быть помечены одним и тем же именем, которое и считается именем сегмента. Программный сегмент представляет собой последовательность инструкций и/или полей данных, адресуемых относительно одного регистра сегмента. Имя сегмента должно быть уникальным и может появляться в поле метки только лишь в другом предложении SEGMENT. Все директивы SEGMENT с одним и тем же именем обозначают продолжение одного и того же сегмента. При этом следует помнить, что параметры всех директив SEGMENT, определяющих один и тот же программный сегмент, не должны противоречить друг другу.

Параметры выравнивания, комбинация и класс директивы SEGMENT задают информацию для линкера. Они должны кодироваться в указанной последовательности, но могут быть опущены в произвольной комбинации.

Выравнивание определяет границу адреса, начиная с которой сегмент будет загружаться в память. Могут быть заданы следующие значения:

u BYTE — использовать любую границу;

u WORD — граница слова (2 байта);

u PARA — граница параграфа (16 байтов);

u PAGE— граница страницы (256 байтов).

 

Если выравнивание не указано, предполагается PARA. Следует помнить, что точный адрес начала сегмента до его загрузки в память неизвестен. Тип выравнивания только накладывает на него ограничение.

Тип комбинации определяет возможность и способы объединения программных сегментов, имеющих одно имя. Могут быть указаны следующие значения:

u PUBLIC — все сегменты с одним и тем же именем объединяются в один непрерывный сегмент. Все инструкции и поля данных нового сегмента будут адресоваться относительно одного регистра сегмента, а все смещения будут вычисляться относительно начала этого сегмента.



u STACK — все сегменты с одним и тем же именем объединяются в один непрерывный сегмент. Этот тип комбинации отличается от PUBLIC лишь тем, что адресация в новом сегменте будет вестись относительно регистра SS; регистр SP при этом устанавливается на конец сегмента. Такой тип комбинации обычно имеют сегменты стека. Тип комбинации STACK автоматически обеспечивает инициализацию регистров SS и SP, и пользователю необязательно включать в свою программу инструкции для установки этих регистров.

u COMMON— все одноименные сегменты этого класса будут загружаться в память, начиная с одного адреса. Таким способом можно формировать оверлейные программы. Длина области загрузки равна длине максимального по объему сегмента. Все адреса в этих сегментах вычисляются относительно одного базового адреса. Если некоторые данные объявлены в более, чем одном сегменте с конкретным именем и типом комбинации COMMON, данные, объявленные последними, замещают все предыдущие.

u MEMORY — для Microsoft 8086 Object Linker (LINK) полностью совпадает с типом PUBLIC. MASM обеспечивает отдельный тип комбинации MEMORY для совместимости с программами LINK, различающими эти типы комбинации.

u AT адрес — все метки и адресные переменные сегмента должны быть вычислены относительно указанного адреса. Адрес может быть представлен любым допустимым выражением, не содержащим ссылок вперед. Сегмент с этим типом комбинации обычно не содержит программного кода или инициализируемых данных, а включает в себя адресные значения, фиксированные для вычислительной машины (например, адрес буфера экрана).

Если тип комбинации не указан, сегмент ни с чем не объединяется и рассматривается как отдельная программная единица.

Класс сегмента определяет порядок следования сегментов в памяти. Сегменты одного класса загружаются в память один после другого до того, как начнут загружаться сегменты другого класса.

В качестве класса сегмента может быть указан любой идентификатор, на который распространяются все требования и ограничения языка Ассемблера (в том числе условия чувствительности к регистру). Поскольку класс сегмента рассматривается как идентификатор, он не может быть определен где-либо еще в программе.

Если класс не указан, LINK копирует сегменты в исполнительный файл в той последовательности, в которой они расположены в объектном файле. Эта последовательность сохраняется до тех пор, пока LINK не обнаружит 2 или более сегмента одного класса, после чего LINKначинает объединение сегментов. Сегменты одного класса копируются в последовательные блоки исполнительного файла.

Все сегменты имеют класс. Сегменты, для которых класс не указан, считаются принадлежащими к классу с пустым именем и копируются в последовательные блоки памяти вместе с такими же сегментами.

Число сегментов, принадлежащих к одному классу, не ограничено, но их суммарный объем не должен превышать 64К.

Если на вход программы LINKподается несколько объектных файлов, правильное кодирование классов сегментов вообще говоря не обеспечивает правильную последовательность сегментов в исполнительном файле, так как эта последовательность в этом случае зависит еще и от последовательности объектных файлов в командной строке.

Пусть, например, LINK обрабатывает 2 объектных файла, 1-й из которых содержит 2 сегмента с классами CODE и STACK, а 2-й — один сегмент классаDATA.

В исполнительном файле сегменты всегда будут расположены в последовательности CODE, STACK, DATA. Если, например, программисту необходимо, чтобы сегменты располагались в последовательности CODE, DATA, STACK, ему следует создать объектный файл, содержащий фиктивные сегменты с теми же именами и теми же классами, но расположенные в нужном ему порядке, и в командной строке запуска LINK указать его первым.

Исходная программа, соответствующая такому объектному файлу, может иметь следующий вид:

code SEGMENT PARA PUBLIC 'CODE'

code ENDS

data SEGMENT PARA PUBLIC 'DATA'

data ENDS

stack SEGMENT PARA STACK 'STACK'

stack ENDS

Этот прием не может быть использован для программ на языках C, FORTRAN, PASCAL и BASIC, так как компиляторы этих языков следуют определенным соглашениям о порядке сегментов, который не следует нарушать.

Другим способом управления последовательностью сегментов является кодирование опции /A MASM, которая предписывает MASM располагать сегменты в объектном файле в алфавитном порядке. Сочетание опции /Aс формированием последовательности фиктивных сегментов позволяет реализовывать довольно сложные стратегии управления структурой исполнительного файла.

В некоторых ранних версиях MASM опция /A включена по умолчанию.



<== предыдущая лекция | следующая лекция ==>
Правила вывода | Директивы PROC и ENDP


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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