Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP_MET_2.DOC
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
689.66 Кб
Скачать

2.2.Процедуры и функции

В языке ассемблера, как и во многих других процедурных языках (С, Pascal, Fortran, BASIC), часто используются подпрограммы — блоки кода программ, которые могут вызываться из основной программы. Вызов подпрограммы представляет собой запоминание адреса точки вызова и переход к точке входа в подпрограмму. Подпрограммы имеют одну точку входа и одну точку выхода и в точке выхода содержат команду возврата управления в точку вызова (с использованием запомненного адреса). Вызов подпрограммы может осуществляться командами CALL и INT процессора, а возврат из подпрограммы — соответственно командами RET и IRET. Адрес возврата в обоих случаях сохраняется в стеке основной программы (в первом случае это одно либо два слова с адресом возврата, во втором — два слова с адресом возврата и байт флагов процессора).

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

Вызовы процедур, как и переходы, классифицируются следующим образом:

  • по относительному расположению процедуры и точки ее вызова:

  • ближние вызовы (внутрисегментные) — для процедур в текущем сегменте;

  • дальние вызовы (межсегментные) — для процедур за пределами текущего сегмента;

  • по способу определения адреса вызова:

  • прямые вызовы — когда адрес вызова указывается как непосредственное значение (чаще — метка или имя процедуры) и включается в код команды вызова;

  • косвенные вызовы — когда адрес вызова располагается в регистре или ячейке памяти, указываемой в команде вызова;

  • по способу формирования адреса вызова:

  • относительные вызовы — когда адрес формируется как сумма текущего содержимого указателя команд (IP) и смещения в команде;

  • абсолютные вызовы — когда указанный адрес вызова просто загружается в указатель команд IP.

(примеры)

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

Возврат из процедуры выполняется командой RET по адресу из стека программы — одно слово для ближней процедуры (RETN) и два — для дальней (RETF).

      1. Передача параметров

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

Параметры можно передавать с помощью одного из шести механизмов:

• по значению;

• по ссылке;

• но возвращаемому значению;

• по результату;

• по имени;

• отложенным вычислением.

Параметры можно передавать в одном из пяти мест:

• в регистрах;

• в глобальных переменных;

• в стеке;

• в потоке кода;

• в блоке параметров.

Так что всего в ассемблере возможно 30 различных способов переда­чи параметров для процедур. Рассмотрим их по порядку.

Передача параметров по значению

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

Например, если параметры передаются в регистрах:

mov ax, word ptr value ; сделать копию значения

call procedure ; вызвать процедуру

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]