лабораторные работы / Подпрограмма и стек
.DOCСаратовский Государственный Технический Университет
Балаковский Институт Техники Технологии и Управления
Кафедра УИТ
Лабораторная работа
“Подпрограмма и стек”
Выполнил: ст. гр. УИТ - 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. Выводы по работе:
Наиболее важным при написании подпрограмм является следить за содержанием стека, а именно - за судьбой обратного адреса, который должен быть сохранен для благополучного возврата управления программе.
Также стек является удобным средством хранения значений регистров вызывающей программы (в случае когда необходимо использовать тот или иной регистр как внутреннюю переменную подпрограммы).