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

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

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

1. Использование механизма макроподстановок, позволяющего изменять исходный текст программы в соответствии с некоторыми предварительно описанными параметризованными объектами, имеющими формальные аргументы.

2. Использование механизма подпрограмм, написанных на ассемблере и структурно входящих в одну программу.

3. Использование механизма подпрограмм, написанных на разных языках программирования и соединяемых в единый модуль на этапе компоновки.

При описании модулей и процедур часто оперируют такими понятиями как аргумент, переменная, константа.

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

Переменная – это нечто, размещенное в регистре или ячейке памяти, что может в дальнейшем подвергаться изменению.

Константа – данные, значение которых никогда не изменяется.

Если некоторые данные в модуле могут подвергаться изменению, то это переменные.

Если переменная находится за пределами модуля (процедуры) и должна быть как-то передана в него, то для модуля она является формальным аргументом. Значение переменной передается в модуль для замещения соответствующего параметра при помощи фактического аргумента.

 

Понятие подпрограммы. Ассемблерные процедуры и функции.

Процедура (подпрограмма) – это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи и представляет собой группу команд для решения конкретной подзадачи, обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку.

В простейшем случае программа может состоять из одной процедуры. Другими словами, процедуру можно определить как правильным образом оформленную совокупность команд, которая, будучи однократно описана, при необходимости может быть вызвана в любом месте программы.

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

- в начале программы, до первой исполняемой команды;

- в конце, после команды, возвращающей управление операционной системе;

- промежуточный вариант – тело процедуры располагается внутри другой процедуры или основной программы, в этом случае необходимо предусмотреть обход процедуры с помощью команды безусловного перехода JMP;

- в другом модуле.

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

В системе команд микропроцессора есть две команды, осуществляющие работу с контекстом. Это команды call и ret:

- CALL [модификатор] имя процедуры – вызов процедуры (подпрограммы). Команда CALL, подобно JMP, передает управление по адресу с символическим именем имя процедуры, но при этом в стеке сохраняется адрес возврата. Адрес возврата – это адрес команды, следующей после команды call;

- RET [число] – возвращает управление вызывающей программе, т.е. считывает адрес возврата из стека и загружает его в регистры CS и IP/EIP, тем самым возвращая управление на команду, следующую в программе за командой CALL, [число] – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате из процедуры.

При использовании CALL необходимо учитывать особенности организации ближних и дальних переходов (параметр [модификатор]).