Подпрограммы оформляются как процедуры. Процедура начинается меткой — именем процедуры и заканчивается командой выхода ret(return). В программе процедура помещается в операторные скобки:
proc... endp
Около оператора proc могут быть указаны атрибуты дистанции: near — близкая процедура (в том же сегменте) или far — дальний вызов (если этот атрибут опущен, то подразумевается near).
Пример: DISP proc far; в отличие от метки после имени процедуры двоеточие не ставится:
ret
DISP endp
Команда перехода к подпрограмме: CALL opr
Вызов процедуры (call a procedure — вызов процедуры), безусловная передача управления, выполняющая короткий или дальний вызов процедуры. Флаги: не меняются.
В команде CALL атрибуты near или far указывать не надо, так как ассемблер нужную информацию получит сам из директивы определения процедуры. По команде CALL должно быть выполнено:
l запоминание в стеке адреса возврата (содержимого IP и CS для следующей команды: 16 битов, если near, и 32 бита, если far);
l переход к выполнению процедуры (инициируется записью в IP и в CS (если far) нового адреса команды).
Операнд opr, определяющий адрес процедуры, бывает:
l непосредственным: CALL имя_процедуры;
l прямым — процедуру с атрибутом near можно вызвать через регистр, в котором содержится смещение адреса процедуры: CALL r;
l косвенным:
l процедура с атрибутом near вызывается, используя переменную размером в слово: CALL word ptr символьное_имя,
l процедура с атрибутом far — используя переменную размером в двойное слово: CALL dword ptr символьное_имя.
Команда выхода из подпрограммы
RET — возврат из процедуры (return from procedure). Команда извлекает из стека адрес возврата и возвращает управление из процедуры, вызванной ранее командой CALL. Необязательный числовой параметр команды RET указывает количество байтов, которые освобождаются в стеке после извлечения адреса возврата. Если процедура имеет атрибут near, то команда RET извлекает из стека одно слово и заносит его в регистр IP; если процедура имеет атрибут far, то команда RET извлекает из стека два слова: сначала смещение адреса, а затем адрес сегмента, и заносит их, соответственно, в регистр IP и в регистр CS. Флаги не меняются.
Процедуры могут быть вложенными, глубина вложения допускается любая (ограничивается лишь емкостью стека).