Создание процедур и передача параметров

Процедура это блок программного кода к которому можно обращаться из различных точек программы. Процедуры создаются либо для упорядочивания структуры программы, либо для автоматизации часто выполняемой последовательности действий с различными исходными данными. В отличие от макрокоманды процедуры транслируются в машинный код, а текст макрокоманды «подставляется» вместо команды ее вызова. Структура процедуры:

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