Четверг, 16.05.2024, 04:31

Микропроцессорные системы

Меню сайта
Главная » Статьи » Методические указания к лабораторным работам

Лабораторная работа №4. "Подпрограмма и стек"

Цель работы: исследование особенностей записи и обращения к подпрограммам; изучение методов использования стека при создании программ.

Память микроЭВМ, построенной на основе МПК серии К580, может иметь не более 65536 однобайтных ячеек. Учитывая ограниченные возможности памяти при разработке программ, нужно стараться сделать их как можно короче. С этой целью часть программы, которая неоднократно повторяется, или программа, которая часто используется, могут быть оформлены в виде подпрограмм - последовательностей команд, выполнение которых может быть вызвано из любого места программы любое количество раз. Процесс передачи управления к подпрограмме называется ее вызовом. Данные и адреса, требуемые для работы подпрограммы, называются входными параметрами. Результаты работы подпрограммы, передаваемые по окончании ее работы в основную программу, называются выходными параметрами.

Для вызова подпрограмм используются команды CALL <А2><А1> и RST N, а для возврата из них - команда RET.

Команда CALL <А2><А1> загружает в программный счетчик МП содержимое байтов <А2><А1>, записанных в последующих двух адресах памяти после адреса, где записан код команды CALL (CD). Содержимое байта <А2> записывается в младший байт PCL программного счетчика, а третий байт <А1> команды - в старший байт РСН программного счетчика, при этом МП автоматически сохраняет в стеке адрес основной программы, к которому она будет обращаться после выполнения подпрограммы.

Команда RST N вызывает подпрограммы, записанные по восьми Фиксированным адресам в адресном пространстве МП.

Стек - область ОЗУ, используемая микроЭВМ для временного сохранения данных и работающая по дисциплине LIFO (число, записанное в стек последним, извлекается из него первым).

Команда RET (С9) помещает в программный счетчик последнее записанное на данный момент в стеке число. После этого выполнение программы будет осуществляться с этого адреса. Любая подпрограмма должна кончаться командой RET.

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

Существуют также команды условного вызова подпрограммы и возврата из них. Они позволяют вызвать подпрограмму и возвратиться из нее по определенному состоянию заданных разрядов регистра признаков (аналогично командам условных переходов) без использования дополнительных команд. Все команды условного вызова подпрограммы - трехбайтные, во втором и третьем байтах сообщается начальный адрес подпрограммы. Команды вызова подпрограмм и возврата из них используют стек и внутренний регистр МП SP (STACK POINTER) для адресации к стеку.

Помимо команд вызова подпрограмм и возврата из них со стеком можно обмениваться информацией с помощью команд PUSH <R> (записать в стек содержание обозначенного регистра МП) и POP <R> (записать данные из стека в обозначенный регистр МП). Эти команды являются однобайтными, и в них содержится указание пары регистров МП.

Примечание. В общем случае перед операциями со стеком необходимо загрузить в указатель стека (SP) значение начального адреса области стека. В учебной микроЭВМ УМПК-80 этого можно не делать, так как эта операция производится программой-монитором при включении микроЭВМ (см. выше).

При записи в стек содержимого пары регистров или программного счетчика по адресу SP - 1 записывается содержимое старшего регистра из указанной пары или старший байт РСН программного счетчика, а по адресу SP - 2 в стек записывается содержимое младшего регистра из указанной пары младшего байта PCL программного счетчика.

При записи из стека данных в пару регистров или программный счетчик в младший регистр пары или PCL записывается число из адреса, указанного в указателе стека SP, а старший регистр пары или PSH - число, записанное по адресу SP + 1. В результате выполнения команды содержимое указателя стека SP увеличивается на 2. Данные в памяти не изменяются, а лишь происходит их чтение и увеличение содержимого SP.

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

При разработке программ необходимо первоначально назначать область стека, записывая в SP адрес с помощью команды LXI SP, <А2><А1> или команды SPHL.

Все операции со стеком должны быть сбалансированы, т. е. каждая подпрограмма должна содержать равное количество команд PUSH <R> и POP <R> и оканчивается командой RET. В противном случае выполнение команды RET в конце подпрограммы приведет к записи в программный счетчик случайного числа из стека. Адрес возврата в основную программу будет потерян и нарушится последовательность ее выполнения.

Как правило, в начале каждой программы сохраняют в стеке содержимое всех задействованных при ее выполнении регистров с помощью команд PUSH <R>. В конце подпрограммы восстановление содержимого регистров осуществляется с помощью команд POP <R> и в обратной последовательности по отношению к их записи в стек.

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

Задания

1. Изучите команды вызова и возврата из подпрограммы по условию для МП.

2. Изучите программу 14, определяющую, какой из восьми переключателей входного устройства (адрес 05h) микроЭВМ установлен в положение "0"; а) составьте алгоритм работы программы 14; б) запишите подпрограмму, используемую в программе 14; в) установите, в каком регистре МП содержится информация о номере переключателя входного устройства, установленном в "0"; г) определите, как будет работать программа 14, если на входном устройстве будут установлены в положение "0" не один, а несколько переключателей.

Программа 14

Адрес

Код

Метка

Мнемокод

Комментарий

0800

DB 05

WAITC:

IN 05h

; Получить число из входного устройства

0802

FE FF

 

CPI FFh

; Содержит ли какой-либо разряд число 0

0804

CA 00 08

 

JZ WAITC

; Если нет, то ждать

0807

CD 0B 08

 

CALL IDSW

; Если да, то вызвать подпрограмму

; определения разряда, в котором

; записан 0

080A

CF

 

RST 1

; Окончить выполнение программы

080B

06 FF

IDSW:

MVI B, FFh

; Записать в регистр B число 0FFh

080D

04

SRCH:

INR B

; Увеличить содержимое регистра B на 1

080E

0F

 

RRC

; Сдвинуть число в аккумуляторе вправо

080F

DA 0D 08

 

JC SRCH

; Если CY = 1, то продолжать

0812

C9

 

RET

; Возврат из подпрограммы

3. Исследуйте программу 14.

3.1. Введите программу 14 в микроЭВМ.

3.2. Установите на входном устройстве переключатели соответственно числу 0FFh. Осуществить пуск программы. Убедитесь, что микроЭВМ будет находиться в режиме ожидания появления "0" в любом разряде входного устройства.

3.3. Установите "0" с помощью переключателей в любом из разрядов входного устройства. Проверьте содержимое регистров МП после окончания выполнения программы 14.

3.4. Осуществите повторный запуск программы при наличии нулей в двух разрядах входного устройства. Какое число будет записано в регистре B МП после окончания выполнения программы?

4. Исследуйте процесс выполнения команд вызова и возврата из подпрограммы, а также команд работы со стеком.

4.1. Введите в микроЭВМ подпрограмму 15.

Программа 15

Адрес

Код

Метка

Мнемокод

Комментарий

0800

CD 04 08

 

CALL STDY

;Вызвать подпрограмму STDY

0803

CF

 

RST 1

; Остановить выполнение подпрограммы

0804

F5

STDY:

PUSH PSW

; Записать слово состояние МП в стек

0805

C5

 

PUSH B

; Записать содержимое регистров B, C в стек

0806

D5

 

PUSH D

; Записать содержимое регистров D, E в стек

0807

E5

 

PUSH H

; Записать содержимое регистров H, L в стек

0808

3E 05

 

MVI A, 05h

; Записать в регистр A число 05h

080A

47

 

MOV B, A

; Записать число из регистра A в регистр B

080B

87

 

ADD A

; Удвоить содержимое аккумулятора

080C

5F

 

MOV E, A

; Записать содержимое регистра A в

; регистр E

080D

67

 

MOV H, A

; Записать содержимое регистра А в

; регистр H

080E

E1

 

POP H

; Записать числа из стека в регистры H, L

080F

D1

 

POP D

; Записать числа из стека в регистры D, E

0810

C1

 

POP B

; Записать числа из стека в регистры В, С

0811

F1

 

POP PSW

; Записать слово состояния из стека в МП

0812

C9

 

RET

; Возврат подпрограммы

4.2. Выполните программу 15 по командам. После каждой команды проверьте содержимое всех регистров МП.

4.3. Выполните команды CALL STDY, PUSH PSW, POP, RET по машинным циклам.

4.4. Замените в подпрограмме 15 команду POP PSW на команду NOP (00) и проследите, как будет выполняться подпрограмма 15. Объясните происшедшие изменения.

Содержание отчета

Отчет должен содержать: 1. Цель работы. 2. Результаты исследования выполнения программ 14-15. 3. Выводы.

Категория: Методические указания к лабораторным работам | Добавил: avk1963 (10.03.2015)
Просмотров: 3663 | Рейтинг: 4.3/15
Всего комментариев: 0