- •Лекция 21
- •Процедуры
- •Процедуры
- •Процедуры
- •Процедуры
- •Описание процедуры
- •Описание процедуры
- •Описание процедур в различных сегментах
- •Описание процедур
- •Описание процедур
- •Передача параметров
- •Передача параметров через регистры
- •Пример
- •Пример
- •Пример
- •Пример
- •Передача параметров через общую память
- •Пример
- •Пример
- •Пример
- •Передача параметров через стек
- •Передача параметров через стек
- •Пример
- •Пример
- •Пример
- •Передача параметров через стек
- •Возврат значений из процедуры
- •Возврат результата
- •Локальные переменные
- •Пример
- •;Процедура рисования линии из символов.
Лекция 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 |
|
|
|
|
|
|
|
|