Процедура это блок программного кода к которому можно обращаться из различных точек программы. Процедуры создаются либо для упорядочивания структуры программы, либо для автоматизации часто выполняемой последовательности действий с различными исходными данными. В отличие от макрокоманды процедуры транслируются в машинный код, а текст макрокоманды «подставляется» вместо команды ее вызова. Структура процедуры:
Myproc proc
;команды
ret ;команда завершения процедуры
Myproc endp
Располагаются процедуры в «ЕХЕ» программах перед точкой входа. В «СОМ» программах после данных, в конце программы. Вызов процедуры выполняется с помощью команды: call Myproc.
При вызове процедуры в стек заносится слово — содержимое регистра IP (адрес следующей команды), и в него загружается смещение к началу процедуры. При выполнении команды ret из стека восстанавливается содержимое регистра IP и программа продолжается с команды следующей за оператором call.
Наиболее часто используется передача параметров процедуре через стек. Перед вызовом процедуры в стек заносят требуемые параметры, которые затем извлекаются в процедуре с помощью косвенной адресации через региcтр BP. Используется косвенная адресация со смещением кратным 2. При возврате из процедуры указывается количество байтов помещенных в стек при ее вызове.
Пример. Процедура вывода символа по его коду.
;EXE program
codesg segment 'CODE'
assume CS: codesg,DS: datasg,SS: stacksg
;-----------------
getSym proc
mov bp,sp ;адрес верхушки стека
mov ah,02h
mov dx,[bp+2] ;извлечь код символа
int 21h
ret 2
getSym endp
;------------------
begin:
;-------------------
mov ah,0
mov al,176
push ax ;код символа в стек
call getSym ;вызов процедуры
;----------------------------
mov AX,4C00h
int 21h
;---------------------------
codesg ends
datasg segment 'DATA'
mes db 128 dup(0)
datasg ends
stacksg segment stack 'STACK'
dw 128 dup(0)
stacksg ends
end begin