лабораторные работы / РАБОТА С ПОДПРОГРАММАМИ И СО СТЕКОМ / 5-Подпрограмма и стек
.DOCЦель работы: исследование особенностей записи и обращения к подпрограммам; изучение методов использования стека при создании программ.
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. Вывод: наиболее важным при написании подпрограмм является следить за содержанием стека, а именно - за судьбой обратного адреса, который должен быть сохранен для благополучного возврата управления программе; также стек является удобным средством хранения значений регистров вызывающей программы (в случае когда необходимо использовать тот или иной регистр как внутреннюю переменную подпрограммы).