Понятие модульного программирования. Понятие подпрограммы. Ассемблерные процедуры и функции.
Понятие модульного программирования.
Применительно к языку ассемблера при использовании концепции модульного программирования можно выделить несколько форм организации управляющих связей.
1. Использование механизма макроподстановок, позволяющего изменять исходный текст программы в соответствии с некоторыми предварительно описанными параметризованными объектами, имеющими формальные аргументы.
2. Использование механизма подпрограмм, написанных на ассемблере и структурно входящих в одну программу.
3. Использование механизма подпрограмм, написанных на разных языках программирования и соединяемых в единый модуль на этапе компоновки.
При описании модулей и процедур часто оперируют такими понятиями как аргумент, переменная, константа.
Аргумент – это ссылка на некоторые данные, которые требуются для выполнения возложенных на модуль функций и размещенных вне этого модуля.
Переменная – это нечто, размещенное в регистре или ячейке памяти, что может в дальнейшем подвергаться изменению.
Константа – данные, значение которых никогда не изменяется.
Если некоторые данные в модуле могут подвергаться изменению, то это переменные.
Если переменная находится за пределами модуля (процедуры) и должна быть как-то передана в него, то для модуля она является формальным аргументом. Значение переменной передается в модуль для замещения соответствующего параметра при помощи фактического аргумента.
Понятие подпрограммы. Ассемблерные процедуры и функции.
Процедура (подпрограмма) – это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи и представляет собой группу команд для решения конкретной подзадачи, обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку.
В простейшем случае программа может состоять из одной процедуры. Другими словами, процедуру можно определить как правильным образом оформленную совокупность команд, которая, будучи однократно описана, при необходимости может быть вызвана в любом месте программы.
Процедура может размещаться в любом месте программы, но так, чтобы на нее случайным образом не попало управление. Если процедуру просто вставить в общий поток команд, то микропроцессор будет воспринимать команды процедуры как часть этого потока и, соответственно, будет осуществлять выполнение команд процедуры. Учитывая это обстоятельство, есть следующие варианты размещения процедуры в программе:
- в начале программы, до первой исполняемой команды;
- в конце, после команды, возвращающей управление операционной системе;
- промежуточный вариант – тело процедуры располагается внутри другой процедуры или основной программы, в этом случае необходимо предусмотреть обход процедуры с помощью команды безусловного перехода JMP;
- в другом модуле.
При разработке процедур следует учитывать специфику механизма вызова процедур, благодаря которому сохраняется информация о контексте программы в точке вызова процедуры. Контекст – информация о состоянии программы в точке вызова процедуры.
В системе команд микропроцессора есть две команды, осуществляющие работу с контекстом. Это команды call и ret:
- CALL [модификатор] имя процедуры – вызов процедуры (подпрограммы). Команда CALL, подобно JMP, передает управление по адресу с символическим именем имя процедуры, но при этом в стеке сохраняется адрес возврата. Адрес возврата – это адрес команды, следующей после команды call;
- RET [число] – возвращает управление вызывающей программе, т.е. считывает адрес возврата из стека и загружает его в регистры CS и IP/EIP, тем самым возвращая управление на команду, следующую в программе за командой CALL, [число] – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате из процедуры.
При использовании CALL необходимо учитывать особенности организации ближних и дальних переходов (параметр [модификатор]).