Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные работы / Подпрограмма и стек

.DOC
Скачиваний:
48
Добавлен:
21.02.2014
Размер:
28.16 Кб
Скачать

Саратовский Государственный Технический Университет

Балаковский Институт Техники Технологии и Управления

Кафедра УИТ

Лабораторная работа

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

Выполнил: ст. гр. УИТ - 52

Шилин А.А.

Дорофеев А.Г.

Верес А.В.

Храмов Д.Г.

Проверил: Грицюк С.Н.

Балаково 1998

Цель работы:

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

1. Временные диаграммы выполнения команд CALL addr, RET

2. Рассмотрим программу:

Адрес

Машинный код

Метка

Мнемокод

Комментарий

0880

31 b0 0b

main

lxi sp,0bb0

указатель стека

0883

cd 87 08

call examp_stack

вызов

0886

cf

rst 1

0887

f5

examp_stack

push psw

сохраняем

0888

c5

push b

регистры

0889

d5

push d

088a

e5

push h

088b

e3 05

mvi a,05

088d

47

mov b,a

088e

87

add a

088f

5f

mov e,a

0890

67

mov h,a

0891

e1

pop h

восстанавли-

0892

d1

pop d

ваем регистры

0893

c1

pop b

0894

f1

pop psw

0895

c9

ret

возврат

Обращение, которое производит процессор к подпрограмме, автоматически заносит в стек адрес возврата. И после перехода по CALL addr на вершине стека лежит обратный адрес. Сама подпрограмма сохраняет и восстанавливает еще четыре значения (регистры и флаги). Таким образом в момент максимальной загруженности стека на нем хранится пять значений, самое верхнее из них- это значения аккумулятора и флагов, а самое нижнее - значение адреса возврата.

Если уничтожить команду POP PSW то к концу подпрограммы на вершине стека останется аккумулятор, флаги а на дне - адрес возврата. Тогда по команде RET процессор считает значени аккмулятора и флагов, считая их обратным адресом и перейдет по этому двухбайтовому значению. То есть, неизвестно куда, так как в программе сначала сохраняется значение аккумулятора, которое нечем не было выставлено предварительно (а значит, может иметь любое значение).

3. Полный перечень команд вызова и возврата из подпрограмм для МП БИС КР580ИК80

RC; RPE; RP; RNZ; RM; RPO; RNC; RZ; RET.

RST 7; RST 6; RST 5; RST 4; RST 3; RST 2; RST 1; RST 0.

CZ addr; CNC addr; CC addr; CPE addr; CPO addr; CP addr; CM addr; CNZ addr; CALL addr.

JZ addr; JNZ addr; JMP addr; JNC addr; JC addr; JPO addr; JM addr; JPE addr; JP addr.

Расшифровка условий переходов:

NZ - не нуль

Z - нуль

NC- нет переноса

C - есть перенос

PO - нечетный паритет

PE - четный паритет

P - положительное

M - отрицательное

4. Программы 5 и 10 секундной задержки.

На входе: если загрузить в BC 5000 (1388h) то задержка 5 сек, если 10000 (2710h) то задержка 10 сек.

На выходе: в BC сохраняется число

Адрес

Машинный код

Метка

Мнемокод

Комментарий

08a0

01 88 13

main

lxi b,5000

указатель стека

08a3

cd a7 08

call exam_delay

вызов

08a6

cf

rst 1

08a7

c5

exam_delay

push b

сохраняем

08a8

f5

push psw

регистры

08a9

af

xra a

08aa

d5

push d

08ab

16 67

intrn_loop

mvi d,67h

08ad

15

intrn2

dcr d

08ae

c2 ad 08

jnz intrn2

08b1

0b

dcx b

08b2

b8

cmp b

08b3

c2 ab 08

jnz intrn_loop

восстанавли-

08b6

b9

cmp c

ваем регистры

08b7

c2 ab 08

jnz intrn_loop

08ba

d1

pop d

08bb

f1

pop psw

возврат

08bc

c1

pop b

08bd

c9

ret

5. Перечень команд для работы со стеком для МП БИС КР580ИК80

SPHL; LXI SP,addr

INX SP; DAD SP; DCX SP

POP B; PUSH B; POP D; PUSH D; POP PSW; PUSH PSW; POP H; PUSH H

6. Выводы по работе:

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

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