Оперативная память
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 общедоступными, а вторая описывает имена и типы внешних подпрограмм. После включения указанных директив основной текст задачи компилируется для получения объектного модуля.



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