Директивы процедур
Процедура (или подпрограмма) является одним из средств разработки модульных программ. Она представляет собой законченную последовательность, которая приводится в действие командой вызова CALL. Процедуры сокращают длину программы, обеспечивая экономию памяти. Отлаженные процедуры можно организовать в библиотеки. Метка в процедуре, которой передаёт управление команда CALL, называется точкой входа процедуры. Процедура выполняется до тех пор, пока не встретится команда возврата RET. В процедуре может быть несколько команд возврата.
Для организации процедур в языке ассемблера предназначены директивы PROC и ENDP. Директива PROC отмечает точку входа процедуры, а директива ENDP - окончание процедуры. Формат директив:
<имя> PROC <тип>
...
Тело процедуры
...
<имя> ENDP
В обеих директивах должно находиться одно и тоже имя процедуры. Оно представляет собой метку, указывающую точку входа процедуры. Тип процедуры может быть NEAR или FAR (по умолчанию принимается тип NEAR). Действие директив PROC/ENDP заключается в том, чтобы наименовать процедуру и установить её тип. В соответствии с типом ассемблер генерирует требуемые команды CALL и RET.
Рассмотрим пример. Пусть необходимо вывести на экран значения байтовой последовательности, предварительно увеличив каждое из них на 15h. Один из вариантов реализации указанной задачи представлен ниже:
Name procedur
Assume cs:cod, ds:data
Data segment
Aadb 9h,8h,3h,6h,5h,2h,3h,7h,1h,5h
Data ends
Cod segment
Start proc far
Push ds
Mov ax,0
Push ax
mov ax, data;инициализация сегментного
mov ds,ax;регистра
lea bx,aa;адрес байтовой последовательности в регистре BX
mov ah,0eh;в AH номер функции прерывания вывода символа на экран
mov cx,10;инициализация счётчика числа байт
l1: mov al,[bx];запись в AL значения текущего байта
add al,15h;сложение байта со значением 15h
call sym;вызов подпрограммы вывода байта на экран
l2: inc bx;смещение указателя на следующий байт
mov al, 20h;занесение в AL кода символа пробела
int 10h;вызов программного прерывания вывода символа на экран
Loop l1
Ret
Start endp