Однокристальные микроконтроллеры семейства MCS-51. Подпрограммы и стек. Память данных. Исследование команд загрузки и извлечения из стека, страница 2

При возврате из подпрограммы в счетчик команд из стека записывается адрес возврата. Сначала извлекается старший байт PCH, а затем – младший байт PCL. Указатель стека при этом дважды декрементируется.

Для корректного выполнения возврата из подпрограммы необходимо, чтобы непосредственно перед выполнением команды возврата верхним элементом стека являлось значение адреса возврата, то есть, чтобы между командами вызова подпрограммы и возврата не было команд загрузки в стек без извлечения из него.

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

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

При передаче входных параметров через память основная программа обязательно содержит команды загрузки некоторых ячеек памяти, а подпрограмма – команды считывания из этих ячеек. При передаче выходных параметров подпрограмма должна загрузить некоторые ячейки памяти, а основная программа – считать. Передача параметров через регистры осуществляется аналогичным образом. В третьем способе используются флаги C и F0, сохраняемые в регистре состояния PSW, либо флаги пользователя (128 флагов) из области прямоадресуемых битов памяти данных (адреса ячеек 20H…2FH).

                                        3.  Порядок  выполнения работы        

3.1. Исследование команд загрузки и извлечения из стека                                                   

3.1.1. Запустите симулятор/отладчик AVSIM51, отключите отображение меток и запишите в память программу загрузки в стек содержимого регистров микроконтроллера  A, B и DPTR:

MOV  SP, #38H  ; Определить стек

PUSH  ACC        ; Загрузить в стек содержимое аккумулятора

PUSH  B              ; Загрузить в стек содержимое регистра B

PUSH  DPL         ; Загрузить в стек младший байт регистра DPTR

PUSH  DPH         ; Загрузить в стек старший байт регистра DPTR

NOP

Задайте содержимое регистров:  (A) = AAH,  (B) = BBH,  (DPTR) = 2211H. Выполните программу в пошаговом режиме, наблюдая за изменением  указателя стека SP и содержимого ячеек стека (нижний дамп памяти данных). Содержимое стека отобразите по форме:

Область  стека

Адрес

Содержимое

Значение  SP

SP=     (Конечное значение)   

SP=

SP=

SP=      (Исходное значение)

Укажите на рисунке, как разместились в стеке содержимое регистров  A, B, DPTR.

3.1.2. Запишите в память симулятора программу  восстановления содержимого регистров (извлечения из стека):

POP  DPH   ; Извлечь из стека содержимое старшего байта регистра DPTR

POP  DPL    ; Извлечь из стека содержимое младшего байта регистра DPTR

POP  B         ; Извлечь из стека содержимое регистра B

POP  ACC   ; Извлечь из стека содержимое аккумулятора

NOP

Перед выполнением этой программы очистите регистры  A, B и DPTR, записав в них нули.

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