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

Лекция 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