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

         

В 1 Три подпрограммы для работы с видеоокнами



Пример В.1. Три подпрограммы для работы с видеоокнами

NxtWin PROC far описание процедуры NxtWin
push ax сохраняем содержимое ах
mov ax, GrUnit читаем единицу приращения окна
add Cur_win, ax увеличиваем номер окна
pop ax восстанавливаем содержимое ах
SetWin LABEL far точка входа в процедуру SetWin
@@: PushReg <ax,bx,dx> сохранение содержимого регистров
хог bx, bx признак установки окна
mov dx, Cur_win номер устанавливаемого окна
call [VMC] обращение к подпрограмме BIOS
PopReg <dx,bx,ax> восстановление содержимого регистров
ret возврат в вызывающий модуль
PrevWin LABEL far точка входа в процедуру PrevWin
push ax сохранение содержимого ах
mov ax, GrUnit читаем единицу приращения окна


sub Cur_win, ax уменьшаем номер окна
pop ax восстанавливаем содержимое ах
jmp SHORT @B переход на установку окна
NxtWin ENDP конец процедуры NxtWin

По сравнению с исходным текстом в примере В.1 добавились директивы, описывающие блок процедуры Nxtwin, и две дополнительные точки входа Setwin и Prevwin. Кроме того, введена локальная метка @@, переход на нее выполняет команда jmp SHORT @в. В оригинале ей соответствовала команда jmp SHORT Setwin. В данном случае метка Setwin описана как удаленная, короткий переход на нее не возможен, поэтому введена локальная метка.

Замечание 1
Замечание 1
Подпрограммы примера В.1 еще нельзя использовать для работы. Предварительно их надо оформить в виде программного модуля и объявить общедоступными. Как это делается, описано в следующем разделе.

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

PUBLIC name[[, name]]

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

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

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

EXTERN name:type[[, name:type]]

В программном модуле данная директива обязательно располагается перед описанием первого сегмента. Если список внешних имен большой, то директива повторяется нужное число раз. Тип зависит от назначения имени. Переменные могут иметь типы byte, word, dword и т. д. Метки и имена подпрограмм имеют тип far.

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

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

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



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