LAB3
.pdfГОСУДАРСТВЕННЫЙ КОМИТЕТ РОССИЙСКОЙ ФЕДЕРАЦИИ ПО ВЫСШЕМУ ОБРАЗОВАНИЮ
УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ПОДПРОГРАММЫ И СТЕК
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
клабораторным работам по курсу
"Микропроцессоры и ЭВМ в приборостроении "
Уфа 1998
2
Составители: А.П.Торгашев М.П.Иванов
УДК 621.3.019
Подпрограммы и стек: Методические указания к лабораторным работам по курсу "Микропроцессоры и ЭВМ в приборостроении." /Уфимск. гос. авиац. техн. ун-т; Сост. А.П.Торгашев, М.П.Иванов. Уфа, 1998, 13с.
Методические указания включают в себя краткие теоретические сведения по командам вызова подпрограмм и возврата из них, как безусловных, так и условных, по принципам организации и назначению стека, по командам работы со стеком, примеры программ и подпрограмм для МП КР580ВМ80А, задание к лабораторной работе, методику выполнения работы по курсу "Микропроцессоры и ЭВМ в приборостроении". Лабораторная работа посвящена изучению организации стека, изучению способов создания подпрограмм на ассемблере МП КР580ВМ80А, а также изучению способов формирования звуковых сигналов в микропроцессорной системе.
Предназначена для студентов направления 551500 "Приборостроение" и может быть полезна студентам других специальностей.
|
3 |
|
|
СОДЕРЖАНИЕ |
|
1 |
Цель работы |
4 |
2 |
Краткие теоретические сведения |
4 |
3 |
Задание к лабораторной работе |
11 |
4 |
Порядок выполнения задания |
12 |
5 |
Контрольные вопросы |
12 |
6 |
Требования по оформлению отчета |
13 |
7 |
Список литературы |
13 |
4
ЛАБОРАТОРНАЯ РАБОТА МПТ-3
ПОДПРОГРАММЫ И СТЕК
1 Цель работы
Исследование особенностей записи и обращения к подпрограммам; изучение методов использования стека при создании программ.
2 Краткие теоретические сведения
Память микро-ЭВМ, построенной на основе МПК серии КР580, может иметь не более 65536 однобайтных ячеек. Учитывая ограниченные возможности памяти при разработке программ, нужно стараться сделать их как можно короче. С этой целью часть программы, которая неоднократно повторяется, или программа, которая часто используется, могут быть оформлены в виде подпрограмм - последовательности команд, выполнение которых может быть вызвано из любого места программы любое количество раз. Процесс передачи управления к подпрограмме называется ее вызовом. Данные и адреса, требуемые для работы подпрограммы, называются входными параметрами. Результаты работы подпрограммы, передаваемые по окончании ее работы в основную программу, называются выходными параметрами.
Для вызова подпрограммы и возврата из них используются команды CALL и RET, а также команды RST Vec, где Vec - вектор перехода (0..7).
Команда CALL загружает в программный счетчик МП БИС содержимое байтов , записанных по последующим двум адресам памяти после адреса, по которому записан код программы CALL (CD). Содержимое байта записывается в младший байт РСL программного счетчика, а третий байт команды - в старший байт РСН программного счетчика, при этом МП БИС автоматически сохраняет в стеке адрес основной программы, по которому необходимо произвести возврат после выполнения подпрограммы.
5
Стек - специально организованная область ОЗУ, задействованная в микро-ЭВМ для временного сохранения данных или адресов. Число, записанное в стек последним, извлекается из него первым. Адрес начала стека назначается программистом и задается начальной загрузкой регистра-указателя стека SP (Stack Pointer) командой SPHL (переслать содержимое регистра HL в регистр SP) или командой LXI SP . В используемых в лабораторном практикуме стендах адрес начала стека задается при включении стенда автоматически и равен 0BB0h. Стек работает на автоуменьшение, что означает, что по мере заполнения стека адрес в указателе стека смещается от больших адресов к меньшим, при этом указатель стека SР всегда содержит адрес последней ячейки стека, в которой записано число.
Команда RET (C9) помещает в программный счетчик последнее записанное на данный момент в стеке число. После этого выполнение программы будет осуществляться с этого адреса. Любая подпрограмма должна кончаться командой RET.
Автоматическое сохранение и восстановление адреса основной программы при выполнении подпрограмм позволяет сделать подпрограммы вложенными, т.е. осуществить вызов одной подпрограммы из другой. Уровень вложенности для данной микро-ЭВМ определяется лишь размером стека.
Существуют также команды условного вызова подпрограммы (CC, CNC, CZ, CNZ, CP, CM, CPE, CPO) и условного возврата из них (RC, RNC, RZ, RNZ, RP, RM, RPE, RPO). Они позволяют вызвать подпрограмму и возвратиться из нее по определенному состоянию заданных разрядов регистра признаков (аналогично командам условных переходов). Все команды условного вызова подпрограммы - трехбайтные, во втором и третьем байтах сообщается начальный адрес подпрограммы. Такие команды также используют стек и внутренний регистр МП БИС SР (Stack Рointer) для адресации к стеку.
Помимо команд вызова подпрограмм и возврата из них со стеком
6
можно обмениваться информацией с помощью команд РUSН (записать в стек содержание обозначенного регистра МП БИС) и РОР (записать данные из стека в обозначенный регистр МП БИС). Эти команды являются однобайтными, и в них содержится указание пары регистров МП БИС.
При записи в стек содержимого пары регистров или программного счетчика по адресу SР - 1 записывается содержимое старшего регистра из указанной пары или старший байт РСН программного счетчика, а по адресу SР - 2 в стек записывается содержимое младшего регистра из указанной пары младшего байта РСL программного счетчика.
При записи из стека данных в пару регистров или программный счетчик в младший регистр пары или РСL записывается число из ЯП с адресом, указанным в указателе стека SР, а в старший регистр пары или РСН - число, записанное по адресу SР + 1. В результате выполнения команды содержимое указателя стека SР увеличивается на 2. Данные в памяти не изменяются, а лишь происходит их чтение и увеличение содержимого SР.
Все операции со стеком должны быть сбалансированы, т.е. каждая подпрограмма должна содержать равное количество команд PUSH и POP и оканчиваться командой RET. В противном случае выполнение команды RET в конце подпрограммы приведет к записи в программный счетчик случайного числа из стека. Адрес возврата в основную программу будет потерян и нарушится последовательность ее выполнения.
Как правило, в начале каждой программы сохраняют в стеке содержимое всех задействованных при ее выполнении регистров с помощью команд PUSH . В конце подпрограммы восстановление содержимого регистров осуществляется с помощью команд РОР и в обратной последовательности по окончанию к их записи в стек.
Вызов подпрограммы командами типа CALL фактически реализует механизм программного прерывания (как безусловного, так и условного) с переходом на произвольный адрес, задаваемый в формате команды (механизм прямой адресации). В системе команд МП КР580ВМ80, однако,
7
имеются еще восемь команд, обеспечивающих вызов подпрограмм (RST 0 .. RST 7). Отличие этих команд от команд класса CALL в том, что переход при выполнении этих команд происходит по фиксированному адресу, неявно заданному в коде команды, то есть команды являются однобайтными. Команда RST Vec обеспечивает загрузку в счетчик команд адреса перехода, где vvv - двоичный код вектора перехода Vec. Так, при выполнении команды RST 2 происходит переход по адресу 0018h, при RST 7 - по адресу 0038h, при RST 0 - переход по адресу 0000h, то есть выполняется программный сброс системы. Так как на каждый вектор перехода в формируемом адресе отводится по три двоичных разряда, можно считать, что в адресном пространстве системы зарезервирована область таблицы векторов программных прерываний с выделением под обслуживание каждого вектора восьми адресов (байт). Очевидно, что в этом адресном пространстве могут располагаться и команды безусловных и условных переходов, что позволяет перейти через данную таблицу векторов в любую точку адресного пространства. В учебном стенде УМПК-80 команды типа RST используются для остановки программы пользователя (RST 1, RST 2) и индикации адреса останова.
Подпрограмма 1
Адрес |
Машинный |
Метка |
Мнемокод |
Комментарий |
|
код |
|
|
|
0900 |
C5 |
DLY |
PUSH B |
Сохранить в стеке со |
|
|
|
|
держимое регистра ВС |
0901 |
48 |
|
MOV С,B |
записать число из |
|
|
|
|
базового регистра B |
|
|
|
|
в регистр-счетчик C |
0902 |
00 |
LOOP |
NOP |
нет операции |
0903 |
0D |
|
DCR C |
уменьшить счетчик в |
|
|
|
|
регистре C на 1 |
0904 |
С2 02 09 |
|
JNZ LOOP |
если число, записанное в |
|
|
|
|
регистре C, равно нулю |
0907 |
C1 |
|
POP B |
Восстановить из стека |
|
|
|
|
содержимое регистра ВС |
0908 |
C9 |
|
RET |
Возврат из подпрограммы |
В виде подпрограмм обычно записываются многократно используемые
8
фрагменты программ, например подпрограмма выдачи звукового сигнала, подпрограмма обслуживания клавиатуры и дисплея, подпрограммы временных задержек, упомянутые уже подпрограммы останова программы пользователя и так далее. Так, на рис.1 представлен алгоритм простой подпрограммы временной задержки, аналогичной блоку программной задержки из лабораторной работы МПТ-2.
Сохранить в стеке содержимое регистра С
Записать число N1 из регистра B в регистр С
Нет операции
Уменьшить содержимое регистра С на 1
Нет
С=0 ?
Да
Восстановить из стека содержимое регистра С
Возврат из подпрограммы
Рисунок 1 Алгоритм простой программы временной задержки
9
Рассмотрим пример использования подпрограммы временной задержки при организации звуковых сигналов в микро-ЭВМ. В микро-ЭВМ звуковые сигналы могут формироваться простейшей схемой (рис.2), на вход которой со звуковой частотой записываются по очереди "0" и "1". Будем считать, что устройство формирования звуковых сигналов имеет адрес 80h. Схема алгоритма работы подпрограммы генерации звуковых колебаний (подпрограмма 2) приведена на рис.3. В качестве подпрограммы DLY используется подпрограмма 1.
+ 5B
R2
c D0 MД |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
___ |
|
|
|
|
|
|
|
|
|
D |
T |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
& |
|
|
|
|
|
|
|
R1 |
|
|
|
|||||||
WR |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VT1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
___ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
CS |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рисунок 2 Схема формирования звуковых сигналов |
|||
Подпрограмма 2 |
|
|
|
|
Адрес |
Машинный |
Метка |
Мнемокод |
Комментарий |
|
код |
|
|
|
0A00 |
AF |
BPP: |
XRA A |
очистить аккумулятор |
0A01 |
D3 04 |
|
|
записать 00h в выходное |
0A03 |
D3 08 |
|
OUT BP |
устройство |
0A05 |
CD 00 09 |
|
CALL DLY |
вызвать подпрограмму |
|
|
|
|
временной задержки |
0A08 |
2F |
|
CMA |
записать код FFh в |
|
|
|
|
аккумулятор |
0А09 |
D3 04 |
|
OUT BP |
записать код FFh в |
|
D3 08 |
|
|
выходное устройство |
0A0D |
CD 00 09 |
|
CALL DLY |
вызвать подпрограмму |
|
|
|
|
временной задержки |
0A10 |
C9 |
|
RET |
Возврат из подпрограммы |
10
Следующая программа MAIN (программа 3) представляет программу генерации сигналов с частотой, задаваемой числом с входного регистра.
СALL BPP
Записать в выходное устройство 0
Вызвать подпрограмму DLY
Записать в выходное устройство 1
Вызвать подпрограмму DLY
RETURN
Рисунок 3 Алгоритм подпрограммы выдачи звукового сигнала Программа 3
Адрес |
Машинный |
Метка |
Мнемокод |
Комментарий |
|
код |
|
|
|
0800 |
DB 05 |
MAIN: |
IN P_IN |
записать число извходного |
|
|
|
|
регистра в аккумулятор |
0802 |
47 |
|
MOV B,A |
сохранить число в регистре |
|
|
|
|
временного хранения B |
0803 |
CD 00 0A |
|
CALL BPP |
вызвать подпрограмму |
|
|
|
|
BPP |
0806 |
C3 00 08 |
|
JMP MAIN |
продолжить с начального |
|
|
|
|
адреса |