Директивы PROC и ENDP служат для определения процедуры. Процедура представляет собой набор инструкций и директив, образующих некоторую подпрограмму в рамках какого-либо сегмента.
Процедура имеет следующий вид:
имя PROC [[расстояние]]
...
предложения
...
имя ENDP
Директивы PROC и ENDP обозначают соответственно начало и конец процедуры и должны быть помечены одним и тем же именем, которое считается именем процедуры.
Необязательное расстояние может принимать значения FAR и NEAR. Если этот параметр опущен, предполагается NEAR.
Имя процедуры имеет атрибуты метки и может быть использовано как операнд в инструкциях перехода, вызовах или циклах.
Возврат из процедуры должен быть выполнен инструкцией RET. При этом следует помнить, что адрес возврата выбирается из стека (в соответствии со значениями регистров SS и SP). Для процедур с расстоянием NEAR адрес возврата состоит только из смещения и занимает в стеке 2 байта. Для FAR-процедур он занимает 4 байта стека, включая в себя базовый адрес (содержимое регистра сегмента) и смещение.
Допускается вложенность процедур.
Процедуре могут быть переданы параметры. Вообще говоря, передача параметров и их распознавание в процедуре возлагается на программиста. Но при соблюдении стандартных соглашений, принятых в языках высокого уровня, параметры процедуры могут быть отслежены командой трассировки стека K SYMDEB.
Согласно стандартным соглашениям параметры размещаются в стеке, верх которого определяется содержимым регистров SP и SS.
Пример передачи параметров:
...
PUSH AX ; 2-й параметр
PUSH BX ; 1-й параметр
CALL addup
ADD SP,4 ; уничтожение параметров
...
addup PROC NEAR ; адрес возврата для NEAR - 2 байта
PUSH BP ; сохранение базового указателя
MOV BP,SP ; загрузка базового регистра
MOV BX,[BP+4] ; адрес 1-го параметра
MOV AX,[BP+6] ; адрес 2-го параметра
...
POP BP
RET addup ENDP
Из этого примера ясно, что адрес возврата запоминается в верхушке стека перед параметрами (стек «растет» от больших адресов к малым).
Если бы процедура специфицировала расстояние FAR, адрес возврата занял бы 4 байта, а смещение для 1-го параметра составило бы 6 байтов.