Вызов процедуры

  1. В начале программы;

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

  1. В конце программы;

В данном случае тело процедуры располагается после команды передачи управления операционной системе.

  1. В середине программы;

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

  1. В другом модуле;

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

Вызов процедуры.

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

Команда CALLсохраняет в стеке адрес возврата, т.е. адрес команды, следующей за CALL, и передает управление по адресу <имя процедуры>.

Модификатор здесь имеет то же значение, что и в команде JMP, модификаторы и их значения приведены на рисунке. Если вызываемая процедура находится внутри текущего сегмента кода и описана как ближняя, т.е. имеет тип NEAR, то в стеке сохраняется адрес возврата в виде счетчика команд IP. Если процедура описана как дальняя, т.е. имеет тип FAR, то вызов этой процедуры командой CALL вызовет сохранение в стеке полного адреса возврата, который состоит из CS и IP. Поскольку стек растет в сторону младших адресов, сохраняется сначала значение CS, затем IP(примеры обоих типов процедур см. на рисунках).

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

Если одна и та же процедура может вызываться и изнутри сегмента, и извне, то ей, очевидно, нужно присваивать дальний модификатор расстояния.

Ссылка на основную публикацию
Adblock detector