Модуль – продукт процесса разбиения большой задачи на ряд более мелких функционально самостоятельных подзадач. Этот процесс называется функциональной декомпозицией задачи.
Между структурными единицами программы (модулями) существуют управляющие и информационные связи. Применительно к языку ассемблера рассматривают несколько форм организации управляющих связей:
· Макроподстановки;
· Объединение в одну программу подпрограмм, написанных на языке ассемблера;
· Объединение в единый модуль подпрограмм, написанных на разных языках программирования.
В качестве информационных связей выделяют:
· Общие области памяти и общие программно-аппаратные ресурсы процессора;
· Унифицированная передача аргументов при вызове модуля;
· Унифицированная передача аргументов при возвращении управления из модуля.
Типы объединения модулей
<имя сегмента> SEGMENT <параметр(ы)>
[<объединение>]
Параметр «объединение» может принимать следующие значения: PUBLIC, COMMON, STACK.
Обращение к внешним идентификаторам
|
|
Внешние имена
Директива EXTRN (external, внешний):
EXTRN <имя>: <тип>, …, <имя>: <тип>
EXTRN X: BYTE; переменная X размером в байт
Общие имена
Директива PUBLIC
PUBLIC <имя>, …, <имя>
PUBLIC X
Процедуры
.
Описание подпрограммы в виде процедуры:
<имя процедуры> PROC <параметр>
<тело процедуры>
<имя процедуры> ENDP
При параметре NEAR или при его отсутствии процедура называется «близкой», при параметре FAR – «дальней».
Вызов процедур и возврат из них
Чтобы из основной программы вызвать процедуру, необходимо указать в команде перехода имя процедуры.
При обращении к процедуре основная программа обязана сообщить ей адрес возврата.
Как сообщить адрес возврата?
1. Передать через регистр: основная программа записывает в некоторый регистр адрес возврата, а процедура извлекает его оттуда и делает по нему переход.
2. Передать через стек: основная программа записывает адрес возврата в стек, а процедура считывает его и использует для перехода.
В большинстве случаев принято передавать адрес возврата через стек. В систему команд МП введены специальные команды, которые упрощают реализацию переходов между основной программой и процедурами.
Вызов процедуры (переход с возвратом):
CALL <имя процедуры>
Возврат из процедуры (return):
RET