Классификация подпрограмм
Описание подпрограмм
Для оформления подпрограмм предназначены две директивы 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