Роздрукувати сторінку
Главная \ Методичні вказівки \ Методичні вказівки \ 2342 Лабораторная работа №4 на тему Подпрограммы и стек

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

« Назад

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

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

Теоретические сведения

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

Для вызова подпрограммы необходимо указать ее начальный адрес в памяти и передать (если необходимо) параметры – те исходные данные, с которыми будут выполняться предусмотренные в подпрограмме действия. Адрес подпрограммы указывается в команде вызова CALL, а параметры могут передаваться через определенные ячейки памяти, регистры или стек.

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

Для реализации механизма вложенных подпрограмм (возможность вызова подпрограммы из другой подпрограммы и т. д.) адреса возврата целесообразно сохранять в стеке. Стек ("магазин") – особым образом организованная безадресная память, доступ к которой осуществляется через единственную ячейку, называемую верхушкой стека. При записи слово помещается в верхушку стека, предварительно все находящиеся в нем слова смещаются вниз на одну позицию; при чтении извлекается содержимое верхушки стека (оно при этом из стека исчезает), а все оставшиеся слова смещаются вверх на одну позицию. Такой механизм напоминает действие магазина стрелкового оружия (отсюда и второе название). В программировании называют такую дисциплину обслуживания LIFO (Last In First Out, последним пришел – первым вышел) в отличие от дисциплины типа очередь ‑ FIFO (First In First Out, первым пришел – первым вышел).

В обычных ОЗУ нет возможности перемещать слова между ячейками, поэтому при организации стека перемещается не массив слов относительно неподвижной верхушки, а верхушка относительно неподвижного массива. Под стек отводится некоторая область ОЗУ, причем адрес верхушки хранится в специальном регистре процессора – указателе стека SP.

В стек можно поместить содержимое регистра общего назначения по команде PUSH или извлечь содержимое верхушки в регистр общего назначения по команде POP. Кроме того, по команде вызова подпрограммы CALL значение программного счетчика PC (адрес следующей команды) помещается в верхушку стека, а по команде RET содержимое верхушки стека извлекается в PC. При каждом обращении в стек указатель SP автоматически модифицируется.

В большинстве ЭВМ стек "растет" в сторону меньших адресов, поэтому перед каждой записью содержимое SP уменьшается на 1, а после каждого извлечения содержимое SP увеличивается на 1. Таким образом, SP всегда указывает на верхушку стека.

Цель настоящей лабораторной работы – изучение организации программ с использованием подпрограмм. Кроме того, в процессе организации циклов мы будем использовать новые возможности системы команд модели ЭВМ, которые позволяют работать с новым классом памяти ‑ сверхоперативной (регистры общего назначения – РОН). В реальных ЭВМ доступ в РОН занимает значительно меньшее время, чем в ОЗУ; кроме того, команды обращения с регистрами короче команд обращения к памяти. Поэтому в РОН размещаются наиболее часто используемые в программе данные, промежуточные результаты, счетчики циклов, косвенные адреса и т. п.

В системе команд учебной ЭВМ для работы с РОН используются специальные команды, мнемоники которых совпадают с мнемониками соответствующих команд для работы с ОЗУ, но в адресной части содержат символы регистров R0-R9.

Кроме обычных способов адресации (прямой и косвенной) в регистровых командах используются два новых – постинкрементная и преддекрементная (таблица 8.5). Кроме того, к регистровым относится команда организации цикла JRNZ R,M. По этой команде содержимое указанного в команде регистра уменьшается на 1, и если в результате вычитания содержимого регистра не равно 0, то управление передается на метку M. Эту команду следует ставить в конце тела цикла, метку M – в первой команде тела цикла, а в регистр R помещать число повторений цикла.

Пример 4

Даны три массива чисел. Требуется вычислить среднее арифметическое их максимальных элементов. Каждый массив задается двумя параметрами: адресом первого элемента и длиной.

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

Параметры в подпрограмму будем передавать через регистры: R1 – начальный адрес массива, R2 – длина массива.

Рассмотрим конкретную реализацию этой задачи. Пусть первый массив начинается с адреса 085 и имеет длину 14 элементов, второй – 100 и 4, третий – 110 и 9. Программа будет состоять из основной части и подпрограммы. Основная программа задает параметры подпрограмме, вызывает ее и сохраняет результаты работы подпрограммы в рабочих ячейках. Затем осуществляет вычисление среднего арифметического и выводит результат на устройство вывода. В качестве рабочих ячеек используются регистры общего назначения R6 и R7 – для хранения максимальных элементов массивов. Подпрограмма получает параметры через регистры R1 (начальный адрес массива) и R2 (длина массива). Эти регистры используются подпрограммой в качестве регистра текущего адреса и счетчика цикла соответственно. Кроме того, R3 используется для хранения текущего максимума, a R4 – для временного хранения текущего элемента. Подпрограмма возвращает результат через аккумулятор. В таблице 4.1 приведен текст основной программы и подпрограммы. Обратите внимание, цикл в подпрограмме организован с помощью команды JRNZ, а модификация текущего адреса – средствами постинкрементной адресации.

Таблица 4.1 Программа примера 4

Адрес

Команда

Примечание

Основнаяпрограмма

000

RD #85

Загрузка

001

WR R1

параметров

002

RD #14

первого

003

WR R2

массива

004

CALL М

Вызов подпрограммы

005

WR R6

Сохранение результата

006

RD #100

Загрузка

007

WR R1

параметров

008

RD #4

второго

009

WR R2

массива.

010

Команда

Примечания

011

CALL М

Вызов подпрограммы

012

WR R7

Сохранение результата

013

RD #110

Загрузка

014

WR Rl

параметров

015

RD #9

третьего

016

WR R2

массива

017

CALL M

Вызов подпрограммы

018

ADD R7

Вычисление

019

ADD R6

среднего

020

DIV #3

арифметического

021

OUT

Вывод результата

022

HLT

Стоп

Подпрограмма MAX

023

M:        RD @R1

Загрузка

024

WR R3

первого элемента в R3

025

L2:     RD @R1+

Чтение элемента и модификация адреса

026

WR R4

Сравнение

027

SUB R3

и замена,

028

JS L1

если R3<R4

029

MOV R3,R4

 

030

Ll:     JRNZ R2,L2

Цикл

031

RD R3

Чтение результата в Асc

032

RET

Возврат

Задание

Составить и отладить программу учебной ЭВМ для решения следующей задачи. Три массива в памяти заданы начальными адресами и длинами. Вычислить и вывести на устройство вывода среднее арифметическое параметров этих массивов. Параметры определяются заданием к предыдущей лабораторной работе (таблица 3.2), причем соответствие между номерами вариантов заданий 3 и 4 устанавливается по таблице 4.2.

Таблица 4.2 Соответствие между номерами заданий

Номер варианта задания 4

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Номер строки в таблице 3.2

5

7

13

11

9

12

1

10

14

3

6

8

2

4

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

  1. Титульная страница;

  2. Цель;

  3. Формулировка варианта задания;

  4. Краткие теоретические сведения;

  5. Граф-схема алгоритма основной программы;

  6. Граф-схема алгоритма подпрограммы;

  7. Распределение памяти (размещение в ОЗУ переменных, программы и необходимых констант);

  8. Тексты программы и подпрограммы;

  9. Значения исходных данных и результата выполнения программы;

  10. Вывод.

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

  1. Как работает команда MOV R3, R7?

  2. Какие действия выполняет процессор при реализации команды CALL?

  3. Как поведет себя программа примера 4, если в ней вместо команд CALL M использовать команды JMP M?

  4. После начальной установки процессора (сигнал Сброс) указатель стека SP устанавливается в 000. По какому адресу будет производиться запись в стек первый раз, если не загружать SP командой WRSP?

  5. Как, используя механизмы постинкрементной и преддекрементной адресации, организовать дополнительный стек в произвольной области памяти, не связанный с SP?

З повагою ІЦ "KURSOVIKS"!