Оперативная память
04d1509c

В З Исходный текст для получения объектного модуля



Пример В.З. Исходный текст для получения объектного модуля

; Сюда надо вставить макроопределения из примера 2.12
subr SEGMENT word public 'subr' ; начало сегмента
EXTERN GrUnit:word, Cur win:word, VMC:dword
PUBLIC NxtWin, SetWin, PrevWin
ASSUME cs:subr ; установка соответствия
; .386 ; тип микропроцессора
; Далее располагается текст примера В.1, содержащий
; описание подпрограмм NxtWin, SetWin и PrevWin
subr ENDS ; конец сегмента
END ; конец текста модуля

Текст примера В.З начинается с комментария, напоминающего о том, что перед описанием сегмента надо расположить макроопределения PushReg и PopReg. Они используются в подпрограмме SetWin для сохранения в стеке и последующего восстановления содержимого регистров ах, bx и dx (см. пример В.1). Можно отказаться от их включения, заменив первый макровызов тремя командами push, а второй тремя командами pop. Раньше мы об этом не говорили, поскольку модуль предназначался для совместной компиляции с текстом программы, в котором описаны указанные макроопределения.

В директиве EXTERN перечислены имена переменных GrUnit, cur_win и VMC, которые описаны в сегменте данных основной программы. Назначение и способ определения значений этих переменных подробно обсуждались в главе 2 , а их описание показано в примере 2.11 той же главы.



Следующая директива PUBLIC объявляет имена подпрограмм Nxtwin, setwin и PrevWin общедоступными.

Обратите внимание на то, что в директиве ASSUME описан только кодовый сегмент, а если вы работаете с MASM 6.0 или более поздней версией, то эту директиву можно вообще исключить.

Далее в модуле должно располагаться описание подпрограмм, текст которого приведен в примере В.1, а после него директива END без указания метки, поскольку модуль не является выполняемой задачей.

Текст примера В.З не может быть использован для включения в основную программу с помощью директивы INCLUDE. Он компилируется отдельно. При этом Макроассемблер формирует объектный модуль, который понадобится компоновщику при построении задачи.

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

PUBLIC GrUnit, Cur_win, VMC
EXTERN NxtWin:far, SetWin:far, PrevWin:far

Первая из них объявляет переменные GrUnit, cur_win и VMC общедоступными, а вторая описывает имена и типы внешних подпрограмм. После включения указанных директив основной текст задачи компилируется для получения объектного модуля.

Построение задачи

Условимся считать, что файл, содержащий объектный модуль основного текста будущей задачи, имеет имя bmpsuper.obj, а файл, содержащий объектные модули подпрограмм, имя bmpsub.obj. Для их объединения в одну задачу выполняется следующая команда:
link bmpsuper bmpsub или link bmpsuper+bmpsub

В данном случае предполагается, что файлы bmpsuper и bmpsub имеют тип obj и расположены в том же каталоге, в котором находится задача iink.exe (компоновщик). Если это не так, то указывается спецификация, позволяющая найти файлы в других каталогах.

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

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



Содержание раздела