ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.


С хорошей скидкой дом под ключ под любые нужды.
ГЛАВА 5    СБОРЩИК MS-DOS

     __________________________________________________________

     Примечание:
     Вам необходимо прочитать эту главу, только если вы пишете
программы на языке программирования, создающем объектные файлы (.obj).
Описываемый сборщик создает выполняемый файл (.exe), собирая отдельные
объектные модули, генерируемые Макро Ассемблером фирмы Микрософт (MASM) и
компиляторами для таких языков высокого уровня, как Паскаль и
Си.

                       Запуск сборщика
                       ----------------
     Можно выделить три основных метода запуска сбощика:

     - Отвечая на запросы сборщика
     - Используя командную строку
     - Используя файл параметров

     Работу сборщика можно прервать влюбой момент нажатием
     клавиш CONTROL+C.

     Метод 1:
     Определение собираемых модулей ответами на запросы
     сборщика.

     - Наберите имя программы сборщика и нажмите ввод:

       link

       На экране появится запрос на ввод имен файлов,
       подготовленных к сборке:

       Object modules [.obj]:

     - Наберите одно или несколько имен. Если вы не укажете
       расширение файлов, то по умолчанию будет присвоено
       расширение .obj. Если вы укажете несколько имен, то
       последние должны разделяться пробелами или знаком плюс
       (+). Если все имена не помещаются в на одной строчке,
       то поместите в качестве последнего символа строки знак
       плюс (+) и нажмите ввод. На новой строке опять появится
       запрос на ввод имен собираемых объектных модулей.
       Теперь, вы сможете продолжить ввод. Когда все имена
       будут перечислены нажмите ввод. На экране появится
       новый запрос:

       Run file [имя_файла.EXE]:
       Выполняемым файлом будет [имя_файла.EXE]:

     - Обратите внимание на то, что имя_файла, появившееся в
       запросе, совпадает с первым введенным именем файла
       при ответе на первый запрос сборщика. Это означает то,
       что если вы сейчас просто нажмете ввод, то именно такое

                             - 352 -


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

       List file [NUL.MAP]:
       Создать файл карты памяти [NUL.MAP]:

     - Наберите имя файла карты памяти и нажмите ввод. По
       умолчанию расширение этого файла всегда .MAP. Если вы
       не нуждаетесь в этом файле, то просто нажмите ввод. На
       экране теперь можно увидеть новый запрос сборщика:

       Libraries [.LIB]:
       Включаемые библиотеки [.LIB]:

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

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


     Метод 2:
     Определение собираемых файлов в командной строке

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

     link объектные_файлы [,[выполняемый_файл]
          [,[файл_карта_памяти][,[библиотеки]]]][опции][;]


                             - 353 -


     где:

     объектные_файлы   Одно или несколько имен объектных
                       файлов, созданных программой MASM или
                       компилятором языка высокого уровня.
                       Должно присутствовать хотя бы одно имя
                       объектного модуля (файла)).
                       Если вы не укажете расширение файлов,
                       то по умолчанию будет присвоено
                       расширение .LIB.
     выполняемый       Имя выполняемого файла. Если вы не
     файл              укажете это имя, то по умолчанию в
                       качестве такового будет выбрано имя
                       первого указанного объектного файла с
                       заменой расширения на .EXE.
     файл -            Имя файла, в который помещается
     карта памяти      информация о взаимном расположении
                       собранных сегментов в памяти.
                       Если вы не укажете расширение файла,
                       то по умолчанию будет присвоено
                       расширение .MAP.
                       Если вы укажете опции /map и
                       /linenumbers, то описываемый файл будет
                       создан, даже если вы не укажете его имя
                       в командной строке вызова сборщика.
     библиотеки        Одно или несколько имен библитечных
                       файлов, содержащих процедуры или
                       определения переменных, к которым
                       обращается ваша программа. Если вы не
                       укажете расширение файлов, то по
                       умолчанию будет присвоено
                       расширение .LIB.
     опции             Эти опции управляют работой сборщика.
                       Вы можете указывать их в любом месте
                       командной строки. Описание опций дается
                       далее в этой главе.

     Запятые должны разделять разные группы файлов, даже если
вы пользуетесь значением по умолчанию. Командная строка должна
завершаться точкой с запятой (;). Если вы указали не все файлы
или опустили символ точки с запятой, то сборщик будет
запрашивать ввод оставшихся файлов по методу 1 (см. выше).
Если какой-либо файл находится не в текущем каталоге или не на
текущем диске, то дисковод или каталог для такого файла нужно
указывать в командной строке. Указанные значения
распространяются только на этот файл.

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


     Метод 3:
     Определение собираемых файлов в файле параметров.

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

     link @имя_файла_параметров

                             - 354 -



     Кроме того, имя файла параметров вы можете указать,
отвечая на запросы сборщика или поместив его в любое место
командной строки. Таким образом, содержимое этого файла
зависит только от вас, т.е. вы можете опустить в нем уже
введенные при ответах на запрос или в командной строке
элементы. Главное условие - он должен отвечать синтаксису
командной строки и иметь имя, начинающееся с символа (@).
Следует, однако, иметь ввиду, что любая комбинация ВК/ПС
рассматривается также, как если бы вы нажали при ответе на
запрос - ВВОД, или указали запятую в командной строке. Поэтому
каждую группу файлов нужно помещать на отдельной строке. Если
группа не помещается на одной строке, то для перехода на
другую строку последними ее символами должны быть знак (+) и
ВВОД. Если вы не указываете имя файла для группы, то строка
этой группы пропускается (оставляется чистой). Опции для
сборщика вы можете указывать на любой строке. Если сборщик
встречает символ точки запятой (;), то для всех, еще не
введенных вами имен файлов указываются значения по умолчанию,
а оставшаяся часть файла игнорируется. При сборке программы
значения, указанные в файле параметров, выводятся на экран
ввиде ответов на запросы сборщика. Если для сборки не хватает
некоторых параметров, то сборщик приглашает вас ввести эти
параметры.
     Перед именем файла параметров можно указать маршрут.

     Примечание:
     Файл параметров должен завершаься символом (;) или
комбинацией ВК/ПС (возврат каретки и перевод строки). Если
этого не будет сделано, то при сборке на экран будет выведена
последняя строка файла с приглашением нажать ВВОД.

     Для указания маршрутов поиска библиотек можно
воспользоваться командой MS-DOS set с форматом:

     set LIB=маршрут[;маршрут]...

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

     1. Текущий маршрут (дисковод и каталог).
     2. Если указанных библиотек там нет, то просматриваются
        маршруты, содержащиеся в командной строке вызова
        сборщика (в том же порядке).
     3. Если и там их нет, то просматриваются маршруты,
        указанные в качестве параметров переменной среды LIB.
     4. Если библиотеки опять не будут найдены, то выводится
        сообщение об ошибке.

     Файл-карта памяти содержит информацию о взаимном
расположении собранных сегментов и групп в памяти, а также
сообщения о встреченных ошибках. Если в командной строке
вызова сборщика указана опция /map, то в файл будет включен
листинг всех имен "public" с соответствующими адресами.
     Информация о сегментах имеет форму, показанную в примере:

                             - 355 -



     start    stop     length   name    class
     начало   конец    длина    имя     класс

     00000Н   0172СН   0172DH   text    code
     01730H   01E19H   006EAH   data    data

     Информация о группах имеет примерно такую форму:

     origin                  group
     начало                  группы

     0000:0                  IGGROUP
     0173:0                  DGGROUP

     В конце файла дается стартовый адрес программы (точка
входа в программу). Если в командной строке вызова сборщика
указана опция /map, то в файл будет включен листинг всех имен
"public" с соответствующими адресами, причем это будет сделано
дважды - первый раз в алфавитном порядке и второй - по
значению адреса, например:

     address                 publics by name
     адрес                   имена "public" по алфавиту

     0000:1567               BRK
     0000:1696               CHMOD
     0000:01DB               CHKSTK
     0000:131C               CLEARERR
     0173:0035               FAC

     address                 publics by value
     адрес                   имена "public" по адресам

     0000:01DB               CHKSTK
     0000:131C               CLEARERR
     0000:1567               BRK
     0000:1696               CHMOD
     0173:0035               FAC

     Адреса показаны по принципу - сегмент:смещение,
относительно начала загрузочного модуля ( 0000:0000 ).

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

     VM.TMP has been created
     Do not change diskette in drive x:
     (Создан временный файл VM.TMP
     Дискету в дисководе х: до конца сборки не вынимать)

     Если создан временный файл, то опция /pause не может быть
использована. После завершения сборки созданный временный файл
удаляется автоматически.

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

                             - 356 -




                    Опции сборщика
                    --------------
     Опции сборщика управляют его работой. Вы можете указывать
их в любом месте командной строки. Все опции начинаются с
символа (/). Максимально возможная аббревиация показана при
описании каждой опции. Вы можете указывать и большее
количество символов имени опции. Для понимания смысла
некоторых опций желательно предварительно обратиться к
Справочнику программиста MS-DOS (к разделам, посвященным
формату заголовка .exe файла).



     __________________________________________________________
     HELP (просмотр списка имеющихся опций)

     Синтаксис:

     /help

     На экран выводится список всех опций.
     Минимальная аббревиация: /he

     Пример:

     link /he





     __________________________________________________________
     PAUSE (пауза перед записью созданного .exe файла на диск)

     Синтаксис:

     /pause

     Минимальная аббревиация: /р

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

     About to generate .exe file
     Change diskette in drive x: and press 

     Готов сгенерировать .EXE файл
     Смените дискету в дисководе х: и нажмите <ВВОД>

     После завершения вывода созданного файла на указанный
дисковод, на экране вновь появится сообщение:

     Please replace original diskette
     in drive letter and press 

     Вставьте обратно вынутую дискету и нажмите <ВВОД>


                             - 357 -


     Примечание:
     Нельзя вынимать дискету, если на ней был создан файл
vm.tmp, даже если вы указывали опцию /р. В таких случаях
вам придется прерывать сборку нажатием CONTROL+C и
реорганизовывать структуру ваших файлов таким образом, чтобы
временный и созданный файлы могли быть записаны на один диск.





     __________________________________________________________
     EXEPACK (упаковать созданный файл)

     Синтаксис:

     /exepack

     Минимальная аббревиация: /е

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





     __________________________________________________________
     MAP (включить в файл .map листинг всех имен "public")

     Синтаксис:

     /map

     Минимальная аббревиатура: /m

     Эту опцию вы указываете в основном при работе с
     отладчиком symdeb.

     Примечание:
     Если вы не указали в командной строке имя файла карты
памяти, то с помощью этой опции вы можете заставить сборщик
создать его с именем, совпадающим с именем, указанным в
командной строке в качестве первого имени объектного файла, и
расширением .MAP. Формат вывода листинга описан ранее в этой
главе.





                             - 358 -



     __________________________________________________________

     LINENUMBERS (копировать номера строк в файл .MAP)

     Синтаксис:

     /linenumbers

     Минимальная аббревиатура: /li

     Если вы укажете эту опцию, то сбощик скопирует начальные
адреса всех командных строк программы в файл карты памяти.
Начальный адрес строки - это адрес первого байта кода первой
команды, входящей в исходную командную строку. Эти данные вы
можете затем скопировать с помощью программы mapsym в файл
имен, используемый отладчиком symdeb.
     Информация о строках исходного текста копируется в файл
.map только в том случае, если вы укажете в командной строке
вызова сборщика имя этого файла, и только если объектный файл
содержит такую информацию (компиляторы Microsoft FORTRAN и
PASCAL версий 3.0 и позже, и Microsoft C версии 2.0 и позже).
В противном случае эта опция игнорируется.
     MASM не копирует информацию о строках исходного текста в
объектный файл.

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





     __________________________________________________________
     NOIGNORECASE  (не игнорировать регистр буквы)

     Синтаксис:

     /noignorecase

     Минимальная аббревиатура: /noi

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





                             - 359 -



     __________________________________________________________
     NODEFAULTLIBRARYSEARCH (включать только явно указанные
                             имена библиотек)

     Синтаксис:

     /nodefaultlibrarysearch

     Минимальная аббревиатура: /nod

     Этой опцией вы указываете сборщику игнорировать все имена
библиотек, которые он находит в объектном файле. Таким
образом, имена всех используемых библиотек вы можете ввести
явно (например в командной строке), игнорируя все ссылки
вашего объектного файла на какие бы то ни было библиотеки.





     __________________________________________________________
     STACK (установить размер стека)

     Синтаксис:

     /stack:размер

     Минимальная аббревиация: /st

     Размер стека указывается в байтах и используется сборщиком
вместо значений, вычесленных им, исходя из размеров стековых
сегментов объектных файлов. Размер может быть указан в
десятичной, восьмиричной или шестнадцатеричной форме от 1 до
65535. Восьмиричное значение указывается с лидирующим нулем, а
шестнадцатеричное значение с лидирующим нулем и прописной
буквой х, например:

     0х1В

     Размер стека после сборки можно изменить с помощью
     утилиты exemod.





     __________________________________________________________
     CPARMAXALLOC (установить максимальный объем требуемой
                   памяти в параграфах)

     Синтаксис:

     /cparmaxalloc:количество

     Минимальная аббревиатура: /с

     С помощью этой опции вы определяете максимальное
количество страниц памяти (16 байт), необходимое программе при
ее загрузке. Это значение в последствии используется

                             - 360 -


операционной системой при загрузке программы.
     Обычно сборщик выставляет это значение равным 65535, что
означает всю адресуемую память. При загрузке, такой программе
будет выделен наибольший свободный участок памяти. С помощью
описываемой опции вы можете указать значительно меньшую
величину и тем самым оставить место для других прикладных
программ.
     Размер может быть указан в десятичной, восьмиричной или
шестнадцатеричной форме от 1 до 65535. Восьмиричное значение
указывается с лидирующим нулем, а шестнадцатеричное значение с
лидирующим нулем и прописной буквой х, например: 0х1В.
     Если вы укажете величину, меньше минимально необходимой
для загрузки программы, то сборщик проигнорирует указанную
вами величину и выставит по умолчанию 65535.






     __________________________________________________________
     HIGH (загружать по старшим адресам)

     Синтаксис:

     /high

     Минимальная аббревиатура: /h

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






     __________________________________________________________
     DSALLOCATE (поместить группу данных в старшие адреса
                 сегмента памяти)

     Синтаксис:

     /dsallocate

     Минимальная аббревиатура: /d

     С помощью этой опции вы можете указать сборщику изменить
обычный порядок назначения адресов элементам группы DGROUP.
Обычно сборщик назначает смещение 0000Н младшему байту группы.
Теперь же, после указания ключа dsallocate, смещение FFFFH
будет назначено старшему байту группы. В результате группа
данных (DGROUP) будет размещена в самых старших адресах
сегмента памяти.
     Обычно эту опцию используют вместе с опцией /high для
максимального использования свободной памяти. Для обращения к
данным группы вы должны загрузить в сегментный регистр
сегментный адрес начала группы.

                             - 361 -





     __________________________________________________________
     NOGROUPASSOCIATION  (игнорировать ассоциации в группы)

     Синтаксис:

     /nogroupassociation

     Минимальная аббревиатура: /nog

     По этой опции сборщик будет игнорировать ассоциации в
     группы при назначении адресов сегментам кодов и данных.

     Примечание:
     Эта опция включена в сборщик только для обеспечения
совместимости со старыми версиями Фортрана и Паскаля (версии
Микрософт 3.13 и раньше, или версии IBM до 2.0). Вы никогда не
должны использовать этот ключ, за исключением случаев, когда
это продиктовано указанными выше соображениями.





     __________________________________________________________
     OVERLAYINTERRUPT (установить номер прерывания процедуры
                       загрузки наложением)

     Синтаксис:

     /overlayinterrupt:величина

     Минимальная аббревиатура: /о

     По этому ключу номер прерывания процедуры загрузки
программы наложением (03FH) заменяется на указанную величину
(от нуля до 255). Величина может быть указана в десятичной,
восьмиричной или шестнадцатеричной форме. Восьмиричное
значение указывается с лидирующим нулем, а шестнадцатеричное
значение с лидирующим нулем и прописной буквой х, например:
0х1В.
     MASM не обеспечивает создание абсолютных модулей.

     Примечание:
     Выбираемые вами номера прерываний не должны совпадать с
номерами стандартных прерываний MS-DOS.



                             - 362 -



     __________________________________________________________
     SEGMENTS (установить максимальное количество сегментов)

     Синтаксис:

     segments:количество

     Минимальная аббревиатура: /se

     С помощью этой опции вы можете установить максимальное
количество сегментов, которое сборщику разрешается собрать в
одной программе (1 - 1024). Если этих сегментов при сборке
окажется больше, то сборка будет остановлена, а на экран будет
выведено сообщение об ошибке. По умолчанию сборщику разрешено
собирать вместе 128 сегментов, соответственно выделяется и
память для этих сегментов. Сборщик может попросить вас
уменьшить разрешенное количество сегментов:

     Segment limit too high

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





     __________________________________________________________
     DOSSEG (расположить сегменты в программе в соответствии с
             соглашениями MS-DOS)

     Синтаксис:

     /dosseg

     Минимальная аббревиатура: /do

     Соглашения MS-DOS о выравнивании сегменто включают
     следующее :

     - Все сегменты с именем класса CODE помещаются в начало
       файла.
     - Любые другие сегменты, не входящие в группу DGROUP,
       следуют непосредственно за сегментами кодов.
     - Все сегменты, входящие в группу DGROUP, помещаются
       в конец файла.

     Обычный порядок расположения сегментов подробно описан
     в справочнике по Макро Ассемблеру фирмы Микрософт.


© KOAP Open Portal 2000



?????? ???????????