Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 21 - Процедуры.ppt
Скачиваний:
54
Добавлен:
18.02.2023
Размер:
207 Кб
Скачать
☆

Лекция 21

Процедуры на языке Ассемблер

Процедуры

Как в любом другом языке программирования в Ассемблере присутствует возможность декомпозиции программного исполняемого кода на отдельные модули

– процедуры (или, как их еще называют, подпрограммы и функции).

Описание процедур осуществляется в сегменте (или сегментах) кода.

Процедуры

Имя_процедуры PROC [[модификатор языка] язык] [расстояние] [ARG список_передаваемых_параметров]

[RETURNS список_возвращаемых_значений] [LOCAL список_локальных_объявлений] [USES список_используемых_регистров]

…

Команды и директивы языка Ассемблер

…

RET

[Имя_процедуры] ENDP

Процедуры

Единственным обязательным значением, которое необходимо указывать при описании процедуры является ее имя.

Так как программа может занимать более одного сегмента данных, то процедуры вызывающие друг друга могут находится в различных сегментах:

Если вызываемая процедура находится в текущем сегменте, то используется ближний вызов команды CALL.

Если же вызываемая процедура находится в другом сегменте, то используется дальний вызов команды CALL.

Управление характером возможного вызова процедуры осуществляется с помощью необязательного параметра в описании [расстояние]. Этот параметр может принимать одно из двух значении:

near – ближний вызов (используется по умолчанию),

far – дальний вызов.

Процедуры

Описание процедур на языке Ассемблер может располагаться, в принципе, в любом месте программы.

Таким образом возможны три варианта описания процедуры:

в начале сегмента кода,

в конце сегмента кода,

в середине сегмента кода.

Описание процедуры

В начале сегмента кода

В конце сегмента кода

Code SEGMENT use16

Code SEGMENT use16

 

 

ASSUME cs: Code

 

ASSUME cs: Code

MyProc

PROC

 

start:

 

 

 

 

…

 

 

…

 

 

 

ret

 

 

call

MyProc

MyProc

ENDP

 

 

…

 

start:

 

 

 

mov

ax, 4c00h

 

 

…

 

 

int

21h

 

 

call

MyProc

MyProc

PROC

 

 

 

…

 

 

…

 

Code ENDS

 

 

ret

 

end start

 

 

MyProc

ENDP

 

 

 

 

 

Code ENDS

 

 

 

 

 

end start

 

 

 

 

 

 

 

 

 

Описание процедуры

В середине сегмента кода

В середине сегмента кода

Code SEGMENT use16

Code SEGMENT use16

start:

ASSUME cs: Code

start:

ASSUME cs: Code

…

 

…

 

 

 

 

 

 

call

MyProc

 

jmp

next

 

…

 

MyProc

PROC

 

 

jmp

next

 

…

 

MyProc

PROC

 

 

ret

 

 

…

 

MyProc

ENDP

 

 

ret

 

next:

…

 

MyProc

ENDP

 

 

call

MyProc

next:

…

 

 

…

 

 

mov

ax, 4c00h

 

mov

ax, 4c00h

 

int

21h

 

int

21h

Code ENDS

 

Code ENDS

 

end start

 

 

end start

 

 

 

 

 

 

 

 

Описание процедур в различных сегментах

Code2 SEGMENT use16

Code1 SEGMENT use16

ASSUME cs: Code2

ASSUME cs: Code1

MyFarProc PROC far

start:

 

…

…

 

call MyNearProc

call far MyFarProc

…

…

 

ret

mov

ax, 4c00h

MyFarProc ENDP

int

21h

MyNearProc PROC near

Code1 ENDS

 

…

end start

 

ret

 

 

MyNearProc ENDP

Code2 ENDS

Описание процедур

Рекомендации по описанию процедур:

Располагайте описание процедуры либо в начале сегмента, либо в конце сегмента.

Если в программе описывается несколько процедур, то лучше если они все будут располагаться либо в начале, либо в конце.

Не создавайте вложенных описаний (когда процедура описывается внутри другой процедуры).

Рекомендуется команды составляющие основную программу (не входящие в процедуры) описать в фиктивной процедуре MAIN.

Описание процедур

Code SEGMENT use16

Code SEGMENT use16

 

ASSUME cs:Code

 

ASSUME cs:Code

MyPrc1

PROC

 

MAIN

PROC

 

 

…

 

start:

 

 

 

ret

 

 

…

 

MyPrc1

ENDP

 

 

mov

ax, 4c00h

MyPrc2

PROC

 

 

int

21h

 

…

 

MAIN

ENDP

 

 

ret

 

MyPrc1

PROC

 

MyPrc2

ENDP

 

 

…

 

MAIN

PROC

 

 

ret

 

start:

 

 

MyPrc1

ENDP

 

 

…

 

MyPrc2

PROC

 

 

mov

ax, 4c00h

 

…

 

 

int

21h

 

ret

 

MAIN

ENDP

 

MyPrc2

ENDP

 

Code

ENDS

 

Code

ENDS

 

end start

 

 

end start