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

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

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

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

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

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

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

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

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

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

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: