Микропроцессорные устройства систем управления. Иванов В.Э - 25 стр.

UptoLike

Составители: 

25
ЛАБОРАТОРНАЯ РАБОТА 13
ОРГАНИЗАЦИЯ ПОДПРОГРАММ
Цель работы: изучение принципов организации подпрограмм.
Основные сведения
Для вызова подпрограммы используется команда CALL, которая
передает управление с автоматическим сохранением адреса возврата в
стеке для успешного возвращения к выполнению текущей программы
после вызова подпрограммы. В поле операнда этой команды содержится
адрес первого оператора подпрограммы. Возврат управления в основную
программу
происходит по команде RET.
В силу сегментирования памяти микропроцессора ВМ86 выделяют два
типа команды CALL: NEAR (внутрисегментный вызов), когда
подпрограмма находится в текущем сегменте кода, и FAR (межсегментный
вызов), когда код подпрограммы находится в другом сегменте. В
соответствии с типом вызова в стеке запоминаются соответственно либо
только указатель команд PC, либо указатель команд PC и
сегментный
регистр CS.
В подпрограмме обязательно должна находиться хотя бы одна команда
возврата из подпрограммы RET. По этой команде осуществляется возврат
управления в основную программу. По этой команде из стека извлекается
старое содержимого PC и, при необходимости (в зависимости от типа
вызова), содержимого CS.
Для передачи подпрограмме некоторых данных из основной программы
используют стек. В
этом случае сначала в стек загружаются необходимые
данные и только после этого происходит вызов подпрограммы. Если
использовать обычную команду RET, после возврата из подпрограммы в
стеке будут все еще находиться данные, помещенные перед вызовом.
Поэтому необходимо будет принять меры по очистке стека, иначе он
может переполниться, что приведет к аварийному останову программы
.
Для упрощения такой работы со стеком в систему команд ВМ86 была
введена модификация команды возврата из прерывания RET disp. При
возврате управления, после того как из стека были выгружены PC и CS, к
содержимому указателя стека прибавляется значение disp, заданное в
команде. Таким образом, в основной программе после вызова
подпрограммы не нужно освобождать стек
от переданных данных, это
делается автоматически.