Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по ТСА.doc
Скачиваний:
11
Добавлен:
01.04.2025
Размер:
915 Кб
Скачать
☆

2.4.Содержание отчета

Отчет должен содержать:

  1. Название работы, фамилию и инициалы студента, номер группы, цель работы.

  2. Информацию о способах адресации МП КР580.

  3. Информацию о группах и подгруппах системы команд МП КР580.

  4. Программы Прогр.  2 .2, Прогр.  2 .3 и программу, разработанную при выполнении п. 5 задания для самоподготовки с комментариями и в печатном виде.

  5. Таблицы Табл.  2 .2 и Табл.  2 .3 с результатами выполнения заданий – числа в 16-ричной системе счисления.

  6. Выводы по лабораторной работе.

2.5.Контрольные вопросы

  1. Способы адресации МП КР580.

  2. Что такое машинный такт и машинный цикл?

  3. Какие бывают в МП КР580 машинные циклы?

  4. Назначение общих регистров процессора (РОН), указателя стека, счетчика команд, регистра флагов.

  5. Какие бывают команды пересылки, арифметические команды, логические команды, команды передачи управления, специальные команды?

  6. Как работают команды CMP, CPI?

Лабораторная работа №3.Подпрограммы и стек

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

3.1.Краткие сведения из теории

В связи с ограниченным объемом памяти при разработке программ необходимо стараться сделать их как можно короче. С этой целью часть программы, которая неоднократно повторяется, или программа, которая часто используется, оформляется как подпрограмма.

Подпрограмма – последовательность команд, которая может быть вызвана из любого места программы любое количество раз. Процесс передачи управления подпрограмме называется ее вызовом. Данные и адреса, требуемые для работы подпрограммы, называются входными параметрами. Результат работы подпрограммы – выходные параметры. Для безусловного вызова подпрограммы и возврата из нее используются команды CALL <Адрес> и RET. Команда CALL <Адрес> загружает в программный счетчик (СК, PC) МП содержимое байтов <Адрес>, записанных в последних двух байтах после байта кода команды. Содержимое первого байта это младший байт адреса перехода, а содержимое второго байта это старший байт адреса перехода. Команда RET (C9) помещает в программный счетчик последнее записанное на данный момент в стеке число (адрес возврата из подпрограммы). После этого выполнение программы будет осуществляться с этого адреса. Любая подпрограмма должна заканчиваться командой RET.

Автоматическое сохранение и восстановление адреса основной программы при выполнении подпрограмм позволяет сделать подпрограммы вложенными, т. е. осуществить вызов одной подпрограммы из другой. Уровень вложенности для данного МП определяется размером стека.

Существуют также команды условного вызова подпрограмм и возврата из них. Они позволяют вызвать подпрограмму и возвратиться из нее по определенному состоянию заданных разрядов регистра признаков.

Помимо команд вызова подпрограмм и возврата из них, со стеком можно обмениваться информацией. С помощью команды PUSH RP осуществляется запись в стек содержимого регистра RP МП, а с помощью команды POP RP – запись данных из стека в регистр RP процессора. Эти команды однобайтные. В них содержится номер пары регистров МП. Сущность команд можно показать следующим образом:

PUSH B: (SP – 1)  B, (SP – 2)  C; SP = SP – 2

POP D: E  (SP), D  (SP + 1); SP = SP + 2

При записи в стек содержимого пары регистров или программного счетчика по адресу SP – 1 записывается содержимое старшего регистра из указанной пары (в примере B) или старшего байта PCH (программного счетчика), а по адресу SP – 2 в стек записывается содержимое младшего регистра (в примере C) из указанной пары или младшего байта PCL (программного счетчика).

При записи из стека данных в пару регистров или в программный счетчик в младший регистр регистровой пары или в PCL записывается число из адреса, указанного в указателе стека SP, а в старший регистр регистровой пары или в PCH – число, записанное по адресу SP + 1. В результате выполнения команды содержимое SP увеличивается на 2. Таким образом, при записи данных адреса стека убывают от больших к меньшим, а указатель стека SP всегда содержит последний адрес стека, в котором записано число. При разработке программ необходимо назначать область стека, записывая в SP адрес с помощью команды LXI SP, <Адрес> или команды SPHL.

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

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

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

На Рис.  3 .1 приведен алгоритм простой подпрограммы временной задержки. Здесь общее время задержки вычисляется по формуле:

( 3.0)

где – число, первоначально записанное в счетчик. В качестве счетчика использован регистр B, в котором записывается число из регистра C. Команда NOP нужна для увеличения времени выполнения цикла, а, следовательно, и общей задержки. Повтором необходимого числа команд NOP можно корректировать минимальную временную задержку. Величины и фиксированы и в цикл не входят. Минимальная задержка задается при , а максимальная при . Программа Прогр.  3 .4 реализует алгоритм программной задержки, где занимает два байта: D и E. Для увеличения времени задержки организовано два цикла (цикл в цикле), поэтому величина может варьироваться от 0000h до FFFFh (т. е. от 0 до 65535), однако, для вычисления временной задержки здесь должна использоваться гораздо более сложная формула, нежели формула ( 3 .0).

Прогр. 3.4. Программа временной задержки.

MVI B, 05h

;Загрузка числа в B.

LAB_1 :

MVI C, FFh

;Загрузка числа в C.

LAB_2 :

NOP

;Нет операции.

MOV A, C

;Занести C в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_3

;Если Акк. = 0, идти на LAB_3, иначе след. команда.

DCR C

;Уменьшение числа в регистре C на 1.

JMP LAB_2

;Безусловный переход на LAB_2.

LAB_3 :

MOV A, B

;Занести B в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_4

;Если Акк. = 0, идти на LAB_4, иначе след. команда.

DCR B

;Уменьшение числа в регистре B на 1.

JMP LAB_1

;Безусловный переход на LAB_1.

LAB_4 :

HLT

;Выход из программы.

Программа Прогр.  3 .5 реализует последовательное высвечивание сегментов (точек) индикатора дисплея разрешением 7 Х 8, показанного на Рис.  3 .2. Положение высвечиваемого сегмента индикатора определяется содержанием портов ввода/вывода процессора с адресами 01h (по горизонтали) и 02h (по вертикали). При этом для того, чтобы смена инициируемого сегмента была заметна, использована подпрограмма, которая представляет собой видоизмененную программу временной задержки Прогр.  3 .4.

Рис. 3.2. Индикатор дисплея.

Прогр. 3.5. Программа последовательного высвечивания сегментов индикатора дисплея.

MVI B, 00h

;В рег. B байт внешнего цикла задержки.

MVI C, 0Fh

;В рег. C байт внутреннего цикла задержки.

LXI H, 0100h

;В HL адрес ячейки с байтом внешнего цикла задержки.

MOV M, B

;В память байт внешнего цикла задержки.

INX H

;В HL адрес ячейки с байтом внутр. цикла задержки (инкр. HL).

MOV M, C

;В память байт внутреннего цикла задержки.

DCX H

;Декрементация HL.

MVI B, 01h

;Начальная загрузка B (для Port 02h).

MVI C, 01h

;Начальная загрузка C (для Port 01h).

MOV A, B

;В Акк. содержимое регистра B.

JMP LAB_2

;Безусловный переход на LAB_2.

LAB_1 :

RLC

;Сдвиг Акк. влево.

MOV B, A

;Сохранение Акк. в В.

LAB_2 :

OUT 02h

;Выдача байта из Акк. в порт 02h.

MOV A, C

;В Акк. содержимое регистра C.

JMP LAB_4

;Безусловный переход на LAB_4.

LAB_3 :

RLC

;Сдвиг Акк. влево.

LAB_4 :

OUT 01h

;Выдача байта из Акк. в порт 01h.

CALL PROC_1

;Обращение к подпрограмме PROC_1.

CPI 40h

;Сравнение Акк. с 40h.

JNZ LAB_3

;Переход на LAB_3, если неравенство.

MOV A, B

;Запись В в Акк.

CPI 80h

;Сравнение Акк. с 80h.

JNZ LAB_1

;Переход на LAB_1, если неравенство.

HLT

;Выход из программы.

PROC_1 :

PUSH PSW

;Начало подпрограммы. Сохранение в стеке рабочих регистров.

PUSH B

PUSH D

PUSH H

MOV B, M

;Загрузка в B из памяти байта внешнего цикла задержки.

INX H

;Инкрементация HL.

LAB_5 :

MOV C, M

;Загрузка в C из памяти байта внутреннего цикла задержки.

LAB_6 :

NOP

;Пустая операция.

MOV A, C

;Занести C в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_7

;Если Акк. = 0, идти на LAB_7, иначе след. команда.

DCR C

;Уменьшение числа в регистре C на 1.

JMP LAB_6

;Безусловный переход на LAB_6.

LAB_7 :

MOV A, B

;Занести B в Акк.

CPI 00h

;Сравнить Акк. с нулем.

JZ LAB_8

;Если Акк. = 0, идти на LAB_8, иначе след. команда.

DCR B

;Уменьшение числа в регистре B на 1.

JMP LAB_5

;Безусловный переход на LAB_5.

LAB_8 :

POP H

;Восстановление из стека рабочих регистров.

POP D

POP B

POP PSW

RET

;Возврат из подпрограммы.