Иллюстрированный самоучитель по SVGA

Классификация подпрограмм

Описание подпрограмм

Для оформления подпрограмм предназначены две директивы PROC и ENDP. Первая объявляет начало блока подпрограммы, а вторая – его конец. Перед обеими директивами указывается одно и то же имя, которое является именем точки входа в подпрограмму.

Упрощенная форма директивы PROC имеет следующий вид:

имя_подпрограммы PROC far ИЛИ near

Обратите внимание на отсутствие символа "двоеточие" после имени подпрограммы. Слова far или near задают тип процедуры, т. е. характеризуют ее удаленность от точки вызова.

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

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

Упрощенная форма директивы PROC применима при работе с любой версией Макроассемблера, начиная с 5.1. В последующих версиях MASM появилась расширенная форма директивы PROC (см. раздел В.5).

Дополнительные точки входа

В зависимости от конкретного назначения подпрограмма может иметь не одну, а несколько точек входа. Для описания дополнительных точек входа в процедуры применяется специальная директива:

name LABEL far ИЛИ near

Здесь name соответствует имени точки входа, a far или near указывает ее удаленность от точки вызова. Данная директива просто описывает удаленную метку, независимо от ее конкретного назначения. Если она является точкой входа в подпрограмму, то для вызова используется команда call name. А если это продолжение программы, расположенное в друге сегменте, то переход на него выполняет команда jmp name. Пример описания подпрограмм. Для работы с окнами видеопамяти в основной части книги неоднократно использовались процедуры и Prevwin, их исходный текст приведен в примере 2.8. Покажем (см. пример В.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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.