Скачиваний:
54
Добавлен:
23.02.2015
Размер:
666.62 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА 4

Подпрограмма и стек

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

КРАТКИЕ СВЕДЕНИЯ ИЗ ТЕОРИИ

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

Для вызова подпрограмм и возврата из них используются коман­ды CALL<A2><A1> и RЕТ (см. приложение).

Команда САLL<A2><A1> загружает в программный счетчик МП содержимое байтов <A2><A1>, записанных в последующих двух ячейках памяти после ячейки, в которой записан код команды CALLD). Содержимое байта <A2> записывается в младший байт РСL программного счетчика, а третий байт <A1> команды - в старший байт РСН программного счетчика, при этом МП автоматиче­ски сохраняет в стеке адрес основной программы, к которому она бу­дет обращаться после выполнения программы.

Стек - специально организованная область ОЗУ, задействованная в микроЭВМ для временного сохранения данных или адресов. Число, записанное в стек последним, извлекается из него первым.

Команда RЕT (C9) помещает в программный счетчик число, за­писанное в стек последним. После этого выполнение программы будет осуществляться с адреса ячейки памяти, который определяется содер­жимым программного счетчика. Любая подпрограмма должна кончаться командой RET, чтобы обеспечить возврат в основную программу. Ав­томатическое сохранение и восстановление адреса основной програм­мы при выполнении программ позволяет сделать подпрограммы вложен­ными, т.е. осуществить вызов одной подпрограммы из другой. Уровень вложенности для данной микроЭВМ определяется лишь размером стека.

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

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

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

При записи из стека данных в пару регистров, или программный счетчик в младший регистр пары, или РСL записывается число из адреса, указанного в указателе стека SP, а в старший регистр пары или в РСН - число, записанное по адресу SP+1. В резуль­тате выполнения команды содержимое указателя стека SP увеличи­вается на 2. Данные в памяти (в стеке) не изменяются, а лишь про­исходит их чтение и увеличение содержимого SP. Таким образом, при записи данных адреса стека изменяются от больших к меньшим, а указатель стека SΡ всегда содержит последний адрес стека, в котором записано число.

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

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

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

Рассмотрим простую программу 11 временной задержки, алгоритм которой приведен на рис. 1. Этой программе дано имя BPI .

Рис. 1. Алгоритм временной задержки

ПОДПРОГРАММА 11

ΒΡΙ : MOV В,С Загрузка числа в регистр В из регистра С

MI : NOP Нет операции

DCR В Уменьшить на 1 содержимое регистра В

JNZ MI Цикл, если (В) ≠ 0

RET Возврат в основную программу, если В = 0

В качестве счетчика выбран регистр В, в который записывает­ся число X из регистра С. Команда NОР нужна для увеличения задержки.

Для обеспечения требуемой временной задержки необходимо оп­ределить значение числа X, загружаемого в регистр В. Определение числа X можно выполнить на основе расчета времени выполнения ко­манд, образующих данную подпрограмму. При этом необходимо учи­тывать, что команды МОV В,С и RET выполняются однократно, а число повторений команд NОР, DCR и JNZ. MI равно числу X, загруженному в регистр В. Кроме того, обращение к подпрограмме BPI осуществляется по команде CALL BPI, время выполнения кото­рой также необходимо учитывать при определении временной задерж­ки.

Длительность такта УОУ составляет 0,5 мкс. В описании системы команд МП K580BM80 указывается, за сколько тактов основной частоты синхронизации выполняются команды (см. приложение).

На основе этих данных можно записать:

CALL BPI - 17 тактов, T1 = 8,5 мкс;

MOV B,C - 5 тактов, Т2 = 2,5 мкс;

NOP - 4 такта, Т3= 2,0 мкс;

DCR В - 5 тактов, Т4 = 2,5 мкс;

JNZ MI - 10 тактов, Т5 = 5,0 мкс ;

RET - 10 тактов, Т6 = 5,0 мкс.

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

Т = Т1 + Т2 + X · (Т3 + Т4 + Т5) + Т6.

Максимальная задержка имеет место при X = 00 (после пер­вого декремента регистра В в нем устанавливается число 255) и будет равна:

Тмах = 8,5 +2,5 + 256 (2,0 + 2,5 + 5,0) +5,0 = 2448 мкс.

Минимальное время задержки будет при X = 01 и равно Тmin = 25,5 мкс.

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

Ниже приведена подпрограмма 12 формирования задержки, равной 1секунде.

ПОДПРОГРАММА 12 ( BP 2)

Адрес

Код

Мнемокод

Комментарий

8500

06 FF

MVI B

FF

Загрузить в рег .В число

8502

FC

MVI С

FC

Загрузить в рег. С число

8504

0D

DСR С

Декремент регистра С

8505

00

nop

Нет операций

8506

8507

00

00

nop

nop

8508

00

nop

8509

С2 0485

JNZ

8504

Цикл, если (С) ≠ 0

850С

05

DCR B

Декремент регистра В

850D

С2 0285

JNZ

8502

Цикл, если (В) ≠ 0

8510

С9

RET

Возврат в основную программу

Рассмотрим программу 13 "Счетчик секунд на УОУ". В этой программе используются две подпрограммы. Подпрограмма DВ У ТΕ (CALL 0295), входящая в системную программу монитор и служащая для отображения содержимого аккумулятора в двух крайних правых разрядах дисплея. И используется подпрограмма ВР 2 ( CALL 8500) формирования секундной задержки.

Рис. 2. Блок-схема алгоритма задержки на 1 c

(подпрограмма 12 )

ΠΡΟΓΡΑΜΜΑ 13

Адрес ·

Код

Мнемокод

Комментарий

8400

00

MVI А

00

Обнулить аккумул.

8402

CD

95 02

CALL

0295

Вызвать подпрограмму индикации

8405

CD

00 85

CALL

8500

Вызвать подпрограмму ВР2

8408

С6

01

ADI

01

Сложить содерж. акк. с числом 01

340Α

C3

02 84

JMP

8402

Безусловный переход по адресу 8402, зациклива­ние программы

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

Ниже приведена подпрограмма ВР2, в которую введены команды PUSH и POP (подпрограмма ВР2А).

ПОДПРОГРАММА ВР2А

Адрес

Код

Мнемокод

Комментарий

8500

С5

PUSH В

Запись в стек содерж. регистр. пары ВС

8501

06 FF

MVI В FF

Загрузить рег. В

8503

ОЕ FC

MVI С FC

Загрузить рег. С

8505

00

NΟΡ

Нет операции

8506

00

NOP

8507

00

NOP

8508

00

NOP

8509

од

DCR C

Декремент рег. С

850А

С2 0585

JNZ 8505

Цикл, если (С) ≠ 0

850D

05

DCR В

Декремент рег. В

850Е

02 0385

JNZ 8503

Цикл, если (В) ≠ 0

8511

CI

POP В

Восстановить содержимое регистров В и С

8512

С9

RET

Возврат в основную программу

При разработке программ необходимо первоначально назначить область стека. В УОУ при нажатии клавиши RST или при получе­нии команд RST0 программа монитор загружает в указатель стека SP начальный адрес стека 83Е0. Ниже приведена программа 14 с применением команды LХI SP, с помощью которой в начале программы загружается начальный адрес стека 8600 в указатель стека SP.

ПРОГРАММА 14

Адрес

Код

Мнемокод

Комментарий

8400

31

00 86

LXI SP 8500

Загрузить указатель стека SP

8403

ЗЕ

00

MVI A

00

Обнулить аккум.

8405

CD

95 02

CALL

0295

Вызвать подпрограмму индикации

8408

CD

00 85

CALL

8500

Вызвать подпрограмму ВР2А

840В

С6

01

АDI

01

Сложить содержимое акк. с числом 01

840D

C3

0584

JMP

8405

Безусловный переход по адресу 8405, за­цикливание программы

ЗАДАНИЕ ДЛЯ ДОМАШНЕЙ ПОДГОТОВКИ

1. Изучите временные диаграммы выполнения микроЭВМ команд CALL<A2>< Aj> и REΤ.

2. Ознакомьтесь с командами вызова и возврата команд по условию для МП Κ580[1,2,4,7,9].

3. Изучите организаций стека, запись и считывание данных в стеке.

4. Изучите подпрограммы 11, 12, 13, ВР2А и 14.

5. Составьте программу задержки,равной 20 с, используя подпрограмму ВР2А.

6. Изучите программу 15 и заполните таблицу.

ПРОГРАММА 15

Адрес

Код

Мнемокод

Комментарий

8450

31 00 86

LXI SP 8600

Загрузить в указатель стека SP адрес 8600

8453

СD 57 84

CALL 8457

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

8456

76

HLT

Останов

8457

F5

PUSH PSW

Записать слово-состояние в стек

8458

С5

PUSH В

Записать содержимое регист­ров В, С в стек

8459

D5

PUSH D

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

845А

Е5

PUSH H

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

845В

3Е 05

MVI A 05

Записать в рег. А число 05

845D

47

МOV В,А

Переслать из рег. А в рег. В

845Е

87

АDD А

Удвоить содержимое рег. А

845f.

5F

MOV E,A

Переслать из рег. А в рег.Е

8460

67

MOV Н,А

Переслать из рег. А в рег.H

8461

E1

POP Н

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

8462

D1

POP D

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

8463

C1

POP В

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

8464

F1

POP PSW

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

8465

С9

RET .

Возврат в основную программу

Результаты изучения и выполнения программы 15

Имя регистра,

адреса, стека

Содержимое регистров МП и ячеек стека в точках останова программы

8450

8453

845A

845В

8465

8466

Теор.

Практ.

Теор.

Практ.

Теор.

Практ.

Теор.

Практ.

Теор.

Практ.

Теор.

Практ.

A

01

B

02

C

03

D

04

E

05

Η

06

L

07

F

SPH

SPL

Стек

8600

85 FF

85 FE

85 PO

Соседние файлы в папке Лаб. 1-5,6,7,7а,8,9,10