Слайд 1Ассемблер Intel 8086
Подпрограммы
Подпрограмма – это помеченный модуль программы, синтаксически оформленный
по правилам какой-либо системы программирования так, что он может быть
использован в качестве конструктивного элемента при решении более общей задачи на вычислительной машине.
Назначение подпрограмм:
программирование на более высоком уровне;
сокращение размеров программ.
Возникающие проблемы:
1) связь по управлению – проблема возврата в вызывающую программу (сохранение адреса возврата);
2) связь по данным – проблема обмена данными вызывающей программы и подпрограммы.
Слайд 2Ассемблер Intel 8086
Подпрограммы: связь по управлению
Для организации связи по управлению
в Intel 8086 используется стек, в котором хранится адрес возврата,
а также команды вызова подпрограммы (CALL) и выхода из подпрограммы (RET).
Слайд 3Ассемблер Intel 8086
Подпрограммы: связь по данным
Для организации связи по данным
используются регистры, глобальные переменные и стек.
При использовании стека параметры записываются
с помощью команды PUSH непосредственно перед вызовом подпрограммы.
ВАЖНО: после окончания работы подпрограммы необходимо удалить из стека переданные подпрограмме параметры.
Удалить параметры из стека можно следующими способами:
подпрограмма сама удаляет параметры из стека: используется команда RET с параметром, в котором указывается, сколько байтов из стека необходимо удалить;
вызывающая программа сама очищает стек:
используется последовательность команд POP (количество команд равно количеству слов, помещённых в стек);
используется команда ADD SP, NumBytes , в которой параметр NumBytes равен количеству байтов, помещённых в стек.
Слайд 4Ассемблер Intel 8086
Подпрограммы: связь по данным
Параметры в подпрограмму могут передаваться
по значению и по ссылке.
Передача параметров по значению:
mov AX, 10
push
AX
add AX, 20
push AX
call MyProc1
Передача параметров по ссылке (в стек помещается адрес фактического параметра):
mov AX, OFFSET ArrayOfWords
add AX, SI
push AX
call MyProc2
Слайд 5Ассемблер Intel 8086
Подпрограммы: связь по данным
Обращение к параметрам подпрограммы организуется
через регистры BP и SP.
Процедуру рекомендуется оформлять следующим образом:
заголовок процедуры:
MyProc
proc
настройка регистра BP:
push BP
mov BP, SP
сохранение регистров необходимо, если подпрограмма изменяет содержимое регистров, а их значения потребуются вызывающей программе;
работа подпрограммы, обращение к параметрам подпрограммы;
восстановление регистров, если их значения были сохранены в начале подпрограммы; восстановление регистра BP
pop BP
выход из подпрограммы:
ret N
где N – количество байтов, которые необходимо удалить из стека перед возвратом из подпрограммы.
Слайд 6Ассемблер Intel 8086
Подпрограммы: связь по данным
Обращение к параметрам подпрограммы:
параметры, переданные
по значению:
в стек были записаны значения, с которыми можно
сразу работать:
mov AX, [BP+6] ; загрузка значения параметра в регистр AX
параметры, переданные по ссылке:
в стек были записаны адреса, по которым расположены фактические параметры, поэтому для доступа к значениям будет использоваться, например, следующая последовательность операторов:
mov BX, [BP+8] ; загрузка адреса параметра в регистр BX
mov AX, [BX] ; загрузка значения этого параметра в регистр AX
Слайд 7Ассемблер Intel 8086
Подпрограммы: связь по данным
Правила вычисления смещения параметра подпрограммы
относительно регистра BP очевидны при рассмотрении следующего рисунка.
ВНИМАНИЕ! Если был
выполнен дальний вызов подпрограммы, то в стек заносится дополнительно значение сегментного регистра CS, поэтому для обращения к параметрам необходимо будет скорректировать смещения на 2.