Процедуры на языке Ассемблер
Как в любом другом языке программирования в Ассемблере присутствует возможность декомпозиции программного исполняемого кода на отдельные модули – процедуры (или, как их еще называют, подпрограммы и функции).Описание процедур осуществляется в сегменте (или сегментах) кода.
Имя_процедуры PROC [[модификатор языка] язык] [расстояние]
[ARG список_передаваемых_параметров]
[RETURNS список_возвращаемых_значений]
[LOCAL список_локальных_объявлений]
[USES список_используемых_регистров]
…
Команды и директивы
языка Ассемблер
…
RET
[Имя_процедуры] ENDP
Единственным обязательным значением, которое необходимо указывать при описании процедуры является ее имя.
Так как программа может занимать более одного сегмента данных, то процедуры вызывающие друг друга могут находится в различных сегментах:
Если вызываемая процедура находится в текущем сегменте, то используется ближний вызов команды CALL.
Если же вызываемая процедура находится в другом сегменте, то используется дальний вызов команды CALL.
Управление характером возможного вызова процедуры осуществляется с помощью необязательного параметра в описании [расстояние]. Этот параметр может принимать одно из двух значении:
near – ближний вызов (используется по умолчанию),
far – дальний вызов.
Описание процедур на языке Ассемблер может располагаться, в принципе, в любом месте программы.
Таким образом возможны три варианта описания процедуры:
в начале сегмента кода,
в конце сегмента кода,
в середине сегмента кода.
В начале сегмента кода
Code SEGMENT use16
ASSUME cs: Code
MyProc PROC
…
ret
MyProc ENDP
start:
…
call MyProc
…
Code ENDS
end start
В конце сегмента кода
Code SEGMENT use16
ASSUME cs: Code
start:
…
call MyProc
…
mov ax, 4c00h
int 21h
MyProc PROC
…
ret
MyProc ENDP
Code ENDS
end start
В середине сегмента кода
Code SEGMENT use16
ASSUME cs: Code
start:
…
call MyProc
…
jmp next
MyProc PROC
…
ret
MyProc ENDP
next: …
mov ax, 4c00h
int 21h
Code ENDS
end start