Распознавание ошибок Ассемблером

Большинство Ассемблеров немедленно распознает наиболее распространенные ошибки, такие как:

u Неопределенный код операции(обычно это неправильное написание или отсутствие двоеточия или метки);

u Неопределенное имя (часто это неправильное написание или отсутствие определенного имени);

u Неверный символ (например, 2 в двоичном числе или В в десятичном числе);

u Неправильное значение(обычно это число, которое слишком велико для 8 или 16 разрядов);

u Отсутствует операнд;

u Двойное определение(одному и тому же имени присваиваются два различных значения);

u Недопустимая метка(например, метка, предписанная псевдооперации, не допускающей метки);

u Отсутствие метки (например, при псевдооперации EQU, для которой требуется метка).

Эти ошибки неприятны, но они легко исправимы. Единственная трудность возникает тогда, когда ошибка (такая, как отсутствие точки с запятой у строки с комментарием) приводит Ассемблер в «замешательство», результатом чего является ряд бессмысленных сообщений об ошибках.

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

Типичны следующие примеры.

u Пропущенные строки.

u Пропущенные определения.

u Ошибки в написании, когда запись сама по себе допустима.

u Обозначение команд как комментариев.

u Если в команде, которая работает с парой регистров, задается одинарный регистр.

u Если вводится неправильная цифра, такая как Х в десятичном или шестнадцатеричном числе или 7 в двоичном числе.

В Ассемблере могут распознаваться только такие ошибки, которые предусмотрел его разработчик.

Программисты же часто способны делать ошибки, которые разработчик не мог и вообразить, такие ошибки возможно найти при проверке программ вручную строчка за строчкой.

Распространенные ошибки в драйверах
ввода-вывода

Так как большинство ошибок в драйверах ввода-вывода связано как с аппаратурным, так и с программным обеспечением, они трудно поддаются классификации. Приведем некоторые возможные случаи.

u Смешивание портов ввода и вывода.

u Попытка выполнить операции, которые физически невозможны.

u Упущенные из вида неявных эффектов аппаратуры.

u Чтение или запись без проверки состояния.

u Игнорирование различия между вводом и выводом.

u Ошибка при сохранении копии выводимых данных.

u Чтение данных до того, как они стабилизируются, или во время их изменения.

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

u Смешивание действительных портов ввода-вывода с внутренними регистрами интегральных схем ввода-вывода.

u Неправильное использование двунаправленных портов.

u Отсутствие очистки состояния после выполнения команды ввода-вывода.

Распространенные ошибки в программах прерывания

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

u Отсутствие разрешения прерываний.

u Отсутствие сохранения регистров.

u Сохранение или восстановление регистров в неправильном порядке.

u Разрешение прерываний до инициализации приоритетов и других параметров системы прерываний.

u Неучет того, что реакция на прерывание включает сохранение счетчика команд в вершине стека.

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

u Отсутствие разрешения прерываний после последовательности команд, которая должна выполняться без прерываний.

u Отсутствие очистки сигнала, вызывающего прерывание.

u Ошибка в общении с основной программой.

u Отсутствие сохранения и восстановления приоритетов.

u Отсутствие разрешения прерываний от дополнительных аппаратурных входов, которое выполняется с помощью очистки разрядов масок в регистре I.

u Неправильное использование разрядов разрешения прерываний в командах SIM.

Лекция 19.
Введение в макроассемблер

Состав пакета

Пакет макроассемблера включает в себя основные программы, необходимые для создания, отладки и сопровождения программ на языке Ассемблера.

В состав пакета макроассемблера входят следующие программные компоненты:

u MASM — макроассемблер;

u LINK — объектный линкер;

u SYMDEB — символьный отладчик программ;

u MAPSYM — генератор символьного файла;

u CREF — утилита перекрестных ссылок;

u LIB — утилита обслуживания библиотек;

u MAKE — утилита сопровождения программ.

Линкер LINK обрабатывает выработанную MASM объектную программу с целью разрешения ссылок к другим модулям и приведения программы к виду, пригодному для загрузки в память.

Утилита LIB обеспечивает формирование и обслуживание библиотек объектных модулей, которые могут быть использованы LINK для разрешения внешних ссылок.

Отладчик SYMDEBреализует отладку сформированной программы на двух уровнях: на уровне символических имен и на уровне абсолютных адресов.

Программа MAPSYM предназначена для создания символьного файла для SYMDEB. Символьный файл формируется на основе информации, полученной от MASM, и необходим для символьной отладки.

Утилита CREF может быть использована для формирования листинга перекрестных ссылок программы, наличие которого облегчает отладку.

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

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

Пакет макроассемблера работает в операционной системе MS-DOS или PC-DOS версии 2.0 и выше и требует наличия минимум 128К памяти (использование команды SYMDEBможет потребовать дополнительной памяти).

Общие сведения

Макроассемблер MASM ассемблирует программы на языке Ассемблера и создает переместимые объектные файлы, которые могут редактироваться и выполняться в операционной системе MS-DOS.

Макроассемблер обеспечивает выполнение следующих функций:

u Анализ исходного текста на языке Ассемблера на предмет наличия в нем макрокоманд и/или макроопределений и обработка этих конструкций с соответствующей коррекцией исходного текста.

u Синтаксический анализ полученного текста и вывод необходимой диагностической информации.

u Формирование объектного модуля.

Воспринимая в качестве входа один файл с исходным текстом, макроассемблер может формировать до трех выходных файлов.

Файл листинга содержит распечатку исходного текста в соответствии со специфицированными директивами Ассемблера режимами и диагностическими сообщениями о результатах синтаксического анализа. Эти же сообщения дублируются на консоли.

Файл перекрестных ссылок содержит все используемые во входном тексте идентификаторы. В дальнейшем он может быть использован утилитой CREF.

В файле объектного кода формируется объектный модуль. Этот файл не формируется, если в тексте обнаружены ошибки.

Запуск макроассемблера

Ассемблирование исходного файла может производиться в двух режимах:

u С использованием подсказок.

u Посредством командной строки.

Для запуска макроассемблера с использованием подсказок необходимо ввести командную строку, содержащую только имя макроассемблера MASM со спецификацией подоглавления, если она требуется. MASM перейдет в диалоговый режим и серией подсказок запросит у пользователя информацию о следующих файлах (ответ заключается в наборе требуемых символов и нажатии клавиши ENTER):

1. Имя исходного файла. Если при ответе не указано расширение, предполагается ASM.

2. Имя объектного файла. Если при ответе не указано расширение, предполагается OBJ. Базовое имя объектного файла по умолчанию совпадает с базовым именем исходного файла.

3. Имя файла листинга. Если при ответе не указано расширение, предполагается LST. Базовое имя файла листинга по умолчанию NUL.

4. Имя файла перекрестных ссылок. Если при ответе не указано расширение, предполагается CRF. Базовое имя файла листинга по умолчанию NUL.

В конце любого ответа после символов / или — могут быть заданы опции макроассемблера, которые описаны ниже.

Если в каком-либо ответе специфицирован символ ; MASM выйдет из диалогового режима и установит оставшиеся имена по умолчанию из следующего списка:

<имя исходного файла>.OBJ

NUL.LST

NUL.CRF

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

Для запуска MASM посредством командной строки необходимо ввести командую строку следующего вида:

MASM <имя исходного файла>[,[<имя объектного файла>]

[,[<имя файла листинга>][,[<имя файла перек. ссылок>]]]]

[<опции>][;]

Символ ; может быть специфицирован в любом месте командной строки до того, как были определены все файлы.

В этом случае имена оставшихся неопределенными файлов принимаются по умолчанию из приведенного выше списка.

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

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

Опции MASM могут располагаться в любом месте командной строки.

Следующие базовые имена выходных файлов MASM имеют фиксированный смысл (независимо от того, как запускается MASM):

u NUL — соответствующий файл не формируется;

u PRN — соответствующий файл направляется на печать.

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

Работа MASM может быть в любой момент прекращена нажатием клавиш CTRL-C.

Опции MASM

Опции MASM позволяют в некоторой степени управлять работой макроассемблера вне связи с исходной программой.

Каждая опция обозначается предшествующим символом /или — и может кодироваться как строчными, так и заглавными буквами.

Опции могут располагаться в любом месте командной строки или ответа на подсказку.

Ниже приведен список опций MASM с описанием выполняемых ими функций.

/A

Сегменты в объектном файле располагаются в алфавитном порядке. При отсутствии опции расположение сегментов соответствует порядку в исходном файле.

/S

Сегменты в объектном файле располагаются в порядке следования в исходном файле. Эта опция введена для совместимости с XENIX.

/B<число>

Установить размер буфера исходного файла (в килобайтах). Увеличение размера буфера ускоряет ассемблирование, но требует больше памяти.

Размер буфера может варьироваться от 1 до 63 (К). Если опция не задана, полагается 32 (32К).

/D

Диагностические сообщения после 1-го прохода поместить в листинг программы. Многие ошибки 1-го прохода исправляются на 2-м проходе, и, если не задано /D, в листинг не попадают. Задание этой опции дает более глубокую диагностику исходного текста. При спецификации /D ошибки как 1-го, так и 2-го проходов выдаются на консоль, даже если файл листинга не создается.

/D<символ>

Определить символ. Указанный символ вводится в исходный текст как пустая строка (аналогично использованию директивы EQU) и может быть использован в директивах условного ассемблирования.

/I<путь>

Задание пути поиска файлов, подключаемых в исходный текст директивой INCLUDE без явного указания пути. Указание пути в INCLUDE более приоритетно, чем в опции /I.

/ML

Установить различие между строчными и заглавными буквами в метках, переменных и именах. При отсутствии этой опции строчные буквы автоматически преобразуются в заглавные. Опция может потребоваться для совместимости с программами на регистро-чувствительных языках.

/MX

Установить различие между строчными и заглавными буквами в общих и внешних переменных. Опция подобна /ML, но ее действие распространяется лишь на имена, используемые в директивах PUBLIC или EXTRN.

/MU

Преобразовать в общих и внешних именах строчные буквы в заглавные. Опция включена по умолчанию и введена для совместимости с XENIX.

/N

Запретить вывод в файл листинга таблиц, макроструктур, записей, сегментов и имен. На генерируемый код опция не влияет.

/P

Контроль запрещенного кода. Выполнение некоторых инструкций может привести к нежелательным последствиям (например, загрузка регистра CS). Кодирование таких инструкций может быть запрещено опцией /P, наличие которой в таких случаях вызывает генерацию ошибки с кодом 100. Директива .286p отменяет эту опцию и разрешает кодирование запрещенных инструкций.

/R

Генерация кода для процессора с плавающей точкой. Генерируются коды инструкций арифметики с плавающей точкой, которые могут быть выполнены только при наличии сопроцессоров.

/E

Генерация кода для эмуляции плавающей точки.

Генерируется код, эмулирующий инструкции арифметики с плавающей точкой. Эта возможность используется при отсутствии указанных сопроцессоров.

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

/V

Включить в диагностику на консоль информацию о числе обработанных строк и символов. При отсутствии этой опции на консоль выдается информация об ошибках и памяти.

/X

Выводить в листинг тела блоков IF (IF, IFE, IF1, IF2, IFDEF, IFNDEF, IFB, IFNB, IFIDN и IFDIF), для которых условия ассемблирования оказываются ложными и код по этой причине не генерируется. Следующие директивы Ассемблера влияют на действие опции /X:

u .SFCOND подавляет печать «ложных» блоков;

u .LFCOND — разрешает печать «ложных» блоков;

u .TFCOND — каждая обработка директивы меняет состояние опции на противоположное.

/Z

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

/C

Создать файл перекрестных ссылок. Файл создается, даже если он подавлен командной строкой или ответом на подсказку. В последнем случае имя файла устанавливается по умолчанию (<имя исходного файла>.CRF). Опция /C введена для совместимости с XENIX.

/L

Аналогично /C, но относится к файлу листинга (с учетом умалчиваемого имени файла).

/T

Подавить все сообщения, если в исходном тексте не встретится ошибок.

LINK: линкер модулей

Объектный линкер предназначен для создания исполнительных файлов из объектных файлов, сформированных MASM или компиляторами C или PASCAL.LINK формирует переместимый исполнительный код, снабженный информацией перемещения, используя которую, MS-DOS сможет загрузить в память и исполнить соответствующую программу. LINK может формировать программы, содержащие свыше 1Мб кода и данных. Воспринимая в качестве входа 2 файла, LINK может формировать 2 выходных файла.

имя.LIB имя.MAP

(библиотека) \ / (план)

LINK

имя.OBJ / \ имя.EXE

(объектный файл) (исполнительный файл)

Расширения имен файлов, показанные на схеме принимаются по умолчанию.

Объектный файл содержит объектные модули программных сегментов, сформированные MASM или компилятором языка высокого уровня.

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

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

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

Файл плана содержит имена, загрузочные адреса и длины всех сегментов программы. Кроме того, сюда входят имена и загрузочные адреса групп в программе, адрес точки входа, а также сообщения о возможных ошибках.

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

Если заданы опции /HIGH или /DSALLOCATE и объем программы и данных в совокупности не превышает 64К, план может содержать символы с необычно большими адресами сегментов. Эти адреса отражают переменные, расположенные ниже действительного начала сегмента. Пример:

FFF0:0A20 TEMP

Адрес TEMP - 00:920h.

Необходимо иметь ввиду, что, кроме двух выходных файлов, LINK может формировать временный файл с именем VM.TMP. Это происходит в том случае, когда линкеру не хватает оперативной памяти. Создание файла VM.TMP сопровождается сообщением на консоли и всегда осуществляется в текущем подоглавлении. В этом случае нельзя использовать опцию /PAUSE и снимать дискету, если она находится на активном драйве, до того, как LINK не уничтожит файл VM.TMP. Не рекомендуется создавать в текущем подоглавлении файл с таким именем, который в этом случае может быть испорчен.

Запуск LINK

Запуск LINK может быть осуществлен тремя способами:

u С использованием подсказок.

u При помощи командной строки DOS.

u С использованием файла ответа.

Для запуска LINK с использованием подсказок необходимо ввести командную строку, содержащую только имя линкера LINK со спецификацией подоглавления, если она требуется. LINK перейдет в диалоговый режим и серией подсказок запросит у пользователя информацию о следующих файлах (ответ заключается в наборе требуемых символов и нажатии клавиши ENTER):

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

2. Имя исполнительного файла. Если при ответе не указано расширение, предполагается EXE. Базовое имя исполнительного файла по умолчанию совпадает с базовым именем объектного файла.

3. Имя файла плана модуля. Если при ответе не указано расширение, предполагается MAP. Базовое имя по умолчанию NUL.

4. Имя библиотеки. Если при ответе не указано расширение, предполагается LIB. Можно задавать несколько имен библиотек по аналогии с OBJ-файлами. Если, не вводя имени, сразу нажать ENTER, библиотеки использоваться не будут.

Если в каком-либо ответе специфицирован символ ; LINK выйдет из диалогового режима и установит оставшиеся имена по умолчанию из следующего списка:

<имя объектного файла>.EXE

NUL.MAP

Библиотеки не используются.

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

Для запуска LINK посредством командной строки, необходимо ввести командую строку следующего вида:

LINK <имя объектного файла>[,[<имя исполнительного файла>]

[,[<имя файла плана>][,[<имя библиотеки>]]]] [<опции>][;]

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

Если специфицирована хотя бы одна из опций /MAP или /LINENUMBERS, файл плана создается независимо от того, указано ли его имя в командной строке. В этом случае, если его имя не специфицировано, оно принимается по умолчанию — <имя объектного файла>.MAP.

При указании нескольких объектных файлов или библиотек их имена разделяются символами +.

Если определены не все файлы (но не опущены посредством лишней запятой, и не специфицирована установка оставшихся имен по умолчанию указанием символа ;), LINK входит в диалоговый режим и запрашивает оставшиеся неопределенными имена через подсказки.

Спецификации имен файлов и опции могут быть заранее занесены в специальный файл ответа. Имя этого файла с предшествующим символом @ и указанием пути поиска, если он нужен, может быть помещено в любом месте ответа на подсказку или командной строки и трактуется, как если бы содержимое файла ответа было непосредственно вставлено в это место. Следует, однако, помнить, что комбинация символов

CARRIAGE-RETURN / LINE-FEED в файле ответа интерпретируется как ENTER в подсказке или запятая в командном файле.

Общий вид файла ответа:

<имя объектного файла>

[<имя исполнительного файла>]

[<имя файла плана>]

[<имя библиотеки>]

Каждая группа файлов должна задаваться на отдельной строке, а файлы в группе, если их несколько, должны разделяться символом +. Если группа не помещается на одной строке, в последней позиции строки должен стоять признак продолжения — символ +. В любой строке файла ответа после символа / могут быть заданы опции LINK.

В файле ответа могут быть опущены компоненты, уже определенные ответами на подсказки или командной строкой.

При обнаружении в файле ответа символа ; остаток файла игнорируется, и оставшиеся неопределенными имена устанавливаются по умолчанию из приведенного выше списка.

При использовании файла ответа его содержимое выдается на консоль в форме подсказок. Если определены не все имена, LINK переходит в диалоговый режим.

Если файл ответа не содержит комбинации символов

CARRIAGE-RETURN / LINE-FEEDили символа; LINK выдает на консоль последнюю строку файла и ожидает нажатия ENTER.

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

Работа LINK может быть в любой момент прекращена нажатием клавиш CTRL-C.

Опции LINK

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

Ниже приведены описания всех опций LINK (в скобках указаны минимальные сокращения):

/HELP (HE)

Выдать список действующих опций. Эту опцию нельзя использовать вместе с именем файла.

/PAUSE (P)

Пауза перед записью модуля в EXE-файл (и после записи в MAP-файл, если это предусмотрено). Во время этой паузы можно при необходимости переставить дискеты. Если используется файл VM.TMP, он должен находиться на той же дискете, что и EXE-файл.

/EXEPACK (E)

Установить компактную запись последовательностей одинаковых бит. Такой EXE-файл имеет меньший объем и быстрее загружается в память, но его нельзя отлаживать при помощи SYMDEB. Опция дает эффект, если программа содержит длинные потоки идентичных битов и требует большого числа (более 500) перемещений при загрузке.

/MAP (M)

Формировать MAP-файл. Файл формируется, даже если он не специфицирован при запуске LINK, и имеет в этом случае умалчиваемое имя.

/LINENUMBERS (LI)

Зафиксировать в MAP-файле номера строк исходного файла. Эта информация может в дальнейшем использоваться MAPSYM и SYMDEB. Запись номеров строк будет производиться, если создается MAP-файл и объектный модуль содержит данные о строках исходного текста. Компиляторы FORTRAN и PASCAL (версии 3.0 и выше) и C (версии 2.0 и выше) такие данные автоматически формируют; в MASM это не предус мотрено. Если MAP-файл не специфицирован, его можно создать принудительно, указав описываемую опцию в подсказке на этот файл.

/NOIGNORECASE (NOI)

Установить различие между строчными и заглавными буквами. Различие может быть установлено также опциями /ML и /MX MASM.

/NODEFAULTLIBRARYSEARCH

Игнорировать умалчиваемые (NOD) библиотеки, ссылки на которые содержатся в объектном модуле (их туда помещают компиляторы языков высокого уровня). Используются только библиотеки, специфицированные при запуске LINK.

/STACK:<число> (ST)

Установить размер стека (в байтах). Информация о размере стека, содержащаяся в объектном модуле, игнорируется. Размер стека может быть задан в виде десятичного, 8-ричного (с предшествующим 0) или 16-ричного (с предшествующими 0 и x на малом регистре) числа в пределах от 1 до 65535. Размер стека может быть изменен утилитой EXEMOD.

/CPARMAXALLOC:<число>

Установить максимальное число (C) 16-байтных параграфов, необходимых при загрузке программы в память. Обычно LINK устанавливает максимальное число параграфов — 65535. Указание этой опции позволяет более эффективно использовать память. Число параграфов может быть задано в виде десятичного, 8-ричного (с предшествующим 0) или 16-ричного (с предшествующими 0 и x на малом регистре) числа в пределах от 1 до 65535. Если число параграфов недостаточно для размещения программы, LINK наращивает его до минимально подходящего. Число параграфов может быть изменено утилитой EXEMOD. Кроме размещения программы, опция может понадобиться для команды ! SYMDEB.

/HIGH (H)

Установить адрес начала программы на наивысший возможный адрес свободной памяти. Без этой опции установка осуществляется на минимальный возможный адрес.

/DSALLOCATE (D)

Обработать группу с именем DGROUP. Обычно LINK присваивает младшему байту группы смещение 0000h. При задании этой опции старшему байту группы с именем DGROUP присваивается смещение FFFFh. В результате данные будут размещаться в областях программы с максимально большими адресами. Опция /D обычно применяется вместе с опцией /H для более эффективного использования незанятой памяти до старта программы. LINK предполагает, что все свободные байты в DGROUP занимают память непосредственно перед программой. Для

использования группы необходимо загрузить в регистр сегмента адрес начала DGROUP.

/NOGROUPASSOCIATION

Игнорировать группы (NOG) при присвоении адресов элементам данных и кода. Опция введена для совместимости с ранними версиями компиляторов FORTRAN и PASCAL (версии MICROSOFT 3.13 и ранее и IBM до 2.0). Не рекомендуется использовать эту опцию в других целях.

/OVERLAYINTERRUPT:<число>

Установить номер прерывания (O) при загрузке оверлейного модуля.

Указанное число замещает номер стандартного оверлейного прерывания (03Fh). Номер может быть задан в виде десятичного, 8-ричного (с предшествующим 0) или 16-ричного (с предшествующими 0 и x на малом регистре) числа в пределах от 0 до 255. MASM не способствует созданию оверлейных программ. Поэтому только при помощи опции /O ассемблерные модули могут быть включены в оверлейные программы на языках высокого уровня, компиляторы которых поддерживают оверлей. Не рекомендуется устанавливать номер, совпадающий с каким-либо другим прерыванием.

/SEGMENTS:<число> (SE)

Установить максимальное число сегментов, которое может обработать LINK. Число может быть задано в десятичной, 8-ричной (с предшествующим 0) или 16-ричной (с предшествующими 0 и x на малом регистре) форме в пределах от 1 до 1024. При отсутствии спецификации опции полагается 128. Память выделяется с учетом этого максимального числа сегментов.

/DOSSEG (DO)

Упорядочить сегменты в EXE-файле. При спецификации этой опции сегменты располагаются в следующей последовательности:

u сегменты с классом CODE;

u другие сегменты, не входящие в группу DGROUP;

u сегменты, входящие в DGROUP.

Особенности работы 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, STACK, COMMON, MEMORY, AT и PRIVATE.

Если сегмент имеет тип комбинации 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К.

<

Наши рекомендации