Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект_ОС_и_среды.rtf
Скачиваний:
59
Добавлен:
13.09.2019
Размер:
12.88 Mб
Скачать

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

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

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

6.7. Межсегментный вызов процедур

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

call far ptr MyProc

Для возврата в исходную точку программу в стек процессором заносится адрес текущего сегмента – содержимое регистра CS и смещение к следующей команде – содержимое регистра IP. Два слова(4 байта). Процедура задается в сегменте кода с модификатором far.

Пример программы с двумя сегментами и дальним вызовом процедуры.

;EXE program

codesg1 segment 'CODE1'

assume CS:codesg1,DS:datasg,SS:stacksg

;------------------

begin:

;-------------------

mov ah,0

mov al,176 ;символ в стек

push ax

call far ptr getSym ;дальний вызов

;----------------------------

mov AX,4C00h

int 21h

;---------------------------

codesg1 ends

;второй сегмент кода программы

codesg2 segment 'CODE2'

assume cs:codesg2

;-----------------

getSym proc far

mov bp,sp

mov ah,02h

mov dx,[bp+4] ;извлечь код

;символа

int 21h

ret 2

getSym endp

codesg2 ends

datasg segment 'DATA'

mes db 128 dup(0)

datasg ends

stacksg segment stack 'STACK'

dw 128 dup(0)

stacksg ends

end begin

Для управления адресами вызываемых процедур может использоваться технология косвенного вызова. Ближний вызов имеет формат:

call DS:adrproc

Где:

adrproc dw MyProc

Дальний вызов выполняется командой:

call dword ptr DS:adrproc

Где:

adrproc dd MyProc