Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Особенности работы LINK
LINK создает исполнительный файл путем конкатенации кода программы и сегментов данных, соответствующих корректным инструкциям исходного текста. Эта сцепленная форма сегментов и является тем «исполнительным представлением», которое непосредственно копируется в память при загрузке программы. Частично управлять редактированием программных сегментов можно заданием атрибутов в директиве SEGMENT или использованием директивы DGROUP для формирования группы сегментов. Эти директивы определяют целую группу ассоциаций, классов и типов выравнивания, а также определяют порядок и относительные начальные адреса сегментов программы. Эта информация является дополнительной к той, которая задается опциями LINK. u Выравнивание сегментов Для установки начального адреса сегмента LINK использует задаваемый директивой SEGMENT тип выравнивания: BYTE, WORD, PARA или PAGE. Эти ключевые слова обеспечивают выравнивание начала сегмента соответственно по границе байта, слова (2 байта), параграфа (16 байтов) или страницы (256 байтов). По умолчанию используется тип PARA.
Байты, пропускаемые из-за выравнивания, заполняются двоичными нулями. u Номер кадра Вычисляемый LINK начальный адрес сегмента зависит от типа выравнивания сегмента и размеров уже скопированных в исполнительный файл сегментов. Этот адрес состоит из смещения и канонического номера кадра. Канонический адрес кадра определяет адрес первого параграфа в памяти, содержащего один или более байтов сегмента. Номер кадра всегда кратен 16. Смещением является расстояние в байтах от начала параграфа до первого байта сегмента. Для типов PAGE и PARA смещение всегда нулевое, а для типов BYTE и WORD может быть ненулевым. Номер кадра может быть получен из MAP-файла. Его содержат первые 5 16-ричных цифр start-адреса сегмента. u Последовательность сегментов LINK копирует сегменты в исполнительный файл в той же последовательности, в какой он их считывает из объектных файлов. Сегменты, имеющие идентичные имена классов, считаются принадлежащими к одному типу классов и копируются в исполнительный файл как непрерывный блок. u Комбинированные сегменты Для определения того, будут ли два или более сегмента, имеющие одно и то же имя, соединены в один большой сегмент, LINK использует комбинации типов сегментов. В языке Ассемблера имеются следующие Если сегмент имеет тип комбинации PUBLIC, LINK автоматически соединяет его с другими сегментами, имеющими то же имя и принадлежащими к тому же классу. При соединении сегментов предполагается, что сегменты непрерывны и все адреса в сегментах доступны через смещение относительно адреса кадра. Результат получается таким же, как если бы полученный большой сегмент был определен в исходном файле сплошным куском. LINK сохраняет тип выравнивания каждого сегмента. Это означает, что, хотя сегменты и включены в один большой сегмент, код и данные сегментов сохраняют свои типы выравнивания. Если размеры соединяемых сегментов превышают 64К, выдается сообщение об ошибке. Если сегмент имеет тип комбинации STACK, LINK выполняет ту же операцию, что и в случае PUBLIC. Различие заключается в том, что для STACK -сегментов в исполнительный файл записывается начальное значение указателя стека, которое представляет собой смещение от конца первого по порядку сегмента стека или комбинированного сегмента стека. В этом случае при использовании типа STACK для сегментов стека программисту нет необходимости предусматривать в программе загрузку регистра SS. Если сегмент имеет тип комбинации COMMON, LINK автоматически соединяет его с другими сегментами, имеющими то же имя и принадлежащими к тому же классу. Однако, когда LINK соединяет общие сегменты, начало каждого сегмента устанавливается на один адрес, в результате чего образуются серии перекрывающихся сегментов. В итоге получается один сегмент, который по длине не превышает самый длинный из комбинируемых сегментов. Сегменты с типом комбинации MEMORY трактуется LINK в точности так же, как и PUBLIC -сегменты. MASM обеспечивает тип MEMORY для совместимости с линкерами, выделяющие MEMORY как особый тип комбинации. Сегмент имеет тип комбинации PRIVATE в том случае, когда в исходном файле нет точных указаний относительно его типа комбинации. LINK не объединяет PRIVATE -сегменты. u Группы Объединение нескольких сегментов в группу позволяет адресовать их относительно одного адреса кадра. При этом неважно, принадлежат ли эти сегменты к одному классу. Когда LINK обнаруживает группу, он соответствующим образом перестраивает все адресные ссылки в ней. Сегменты в группе не являются смежными, не принадлежат к одному классу и имеют разные типы комбинации. Но суммарный объем всех сегментов в группе не должен превышать 64К. Группы не влияют на порядок загрузки сегментов в память. Даже если используются имена классов и объектные файлы вводятся в соответствующей последовательности, нет гарантии, что сегменты будут смежными. На практике LINK может поместить не принадлежащий группе сегмент в те же 64К памяти.
Хотя в LINK и нет строгой проверки того, помещаются ли все сегменты группы в 64К памяти, при обнаружении нарушения этого условия будет выдано сообщение о переполнении согласования. u Согласования Когда в процессе работы LINK уже известны адреса всех сегментов программы и организованы все комбинации сегментов и группы, линкер имеет возможность «согласовать» некоторые неразрешенные ссылки к меткам и переменным. Для этого LINK вычисляет соответствующие адрес сегмента и смещение и замещает временные значения, сгенерированные Ассемблером, на новые значения. В соответствии с типами ссылок LINK реализует следующие типы согласований: u Короткие. u Внутренние относительно себя. u Внутренние относительно сегмента. u Длинные. Размер вычисляемого значения зависит от типа ссылки. Если LINK обнаруживает ошибку в предсказанном размере ссылки, выдается сообщение о переполнении согласования. Это может произойти, например, когда программа пытается использовать 16-битовое смещение для доступа к инструкции в сегменте, имеющем другой адрес кадра. Это же сообщение может быть выдано, если все сегменты в группе не помещаются внутри блока памяти в 64К. Короткая ссылка имеет место в инструкции JMP, передающей управление на помеченную инструкцию в том же сегменте или группе, отстоящую от JMP не более, чем на 128 байтов. Для такой ссылки LINK вырабатывает 8-битовое число со знаком. Если инструкция, на которую передается управление, находится в другом сегменте или группе, то есть, имеет другой адрес кадра, или отстоит более, чем на 128 байтов в любом направлении, формируется сообщение об ошибке. Внутренняя относительно себя ссылка имеет место в инструкциях, адресующих данные относительно того же сегмента или группы. Для такой ссылки LINK формирует 16-битовое смещение. Если данные не принадлежат тому же сегменту или группе, выдается сообщение об ошибке. Внутренняя относительно сегмента ссылка имеет место в инструкциях, адресующих данные в определенном сегменте или группе или относительно указанного регистра сегмента. Для этой ссылки LINK вырабатывает 16-битовое смещение. Если это смещение внутри специфицированного кадра оказывается больше 64К или меньше 0 или если начало канонического кадра, содержащего требуемые данные, неадресуемо, выдается сообщение об ошибке. Длинная ссылка имеет место в инструкциях CALL, передающих управление в другой сегмент или группу. LINK в этом случае вырабатывает 16-битовый адрес кадра и 16-битовое смещение. Если вычисленное смещение больше 64К или меньше 0 или если начало канонического кадра, в который передается управление, неадресуемо, формируется сообщение об ошибке. u Поиск библиотек Процедура поиска библиотеки, иногда требуемой для разрешения внешних ссылок, обладает некоторыми особенностями. Если путь поиска указан вместе с именем библиотеки в командной строке, поиск осуществляется только там. Если же путь явно не указан, поиск производится в следующей последовательности: 1. В текущем подоглавлении. 2. Если в командной строке заданы один или несколько путей поиска для других библиотек, LINK просматривает их в порядке следования в строке. 3. На путях, определенных переменной LIB команды DOS SET. При помощи команды SET могут быть заданы несколько путей поиска, разделяемых точкой с запятой. Вид команды SET: SET LIB=<список путей> SYMDEB: символьный отладчик программ При помощи символьного отладчика SYMDEB могут быть выполнены следующие функции: u Просмотр и исполнение кода программы. u Внесение в тело программы точек выхода, которые останавливают исполнение программы.
u Проверка и изменение в памяти значений переменных. u Ассемблирование и реассемблирование кода. u Отладка программ, использующих соглашения языков Microsoft об эмуляции арифметики с плавающей точкой. Имеется возможность временного выхода в DOS с последующим возвратом в SYMDEB и сохранением его состояния. SYMDEB имеет несколько способов адресации данных и инструкций в памяти. К различным фрагментам программы можно получить доступ через адреса, глобальные символы или номера строк, что упрощает размещение и отладку специфических участков кода. Программы на языках C, PASCAL и FORTRAN могут быть отлажены как на уровне исходных файлов, так и на уровне исполнительного кода. При этом пользователю доступны исходные предложения, реассемблированный машинный код или их комбинация в зависимости от режима работы SYMDEB. Date: 2015-05-22; view: 483; Нарушение авторских прав |