Выполнение лабораторной работы
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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

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

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

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

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

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

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

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

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

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

Пример 1

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

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

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

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

Таблица 1.Программа примера 1

 

Команда Примечания  
Основная программа  
RD #85 Загрузка  
WR R1 параметров  
RD #14 первого  
WR R2 массива  
CFLL M Вызов подпрограммы  
WR R6 Сохранение результата  
RD #100 Загрузка  
WR R1 параметров  
RD #4 второго  
WR R2 массива  
CFLL М Вызов подпрограммы
WR R7 Сохранение результата
RD #110 Загрузка
WR R1 параметров
RD #9 третьего
WR R2 массива
CALL М Вызов подпрограммы
ADD R7 Вычисление
ADD R6 среднего
DIV #3 арифметического
ОUТ Вывод результата
Подпрограмма МАХ
HLT Стоп
М: RD @R1 Загрузка
WR RЗ первого элемента в RЗ
L2: RD @R1+ Чтение элемента и модификация адреса
WR R4 Сравнение
SUB R3 и замена,
JS L1 если RЗ < R4
MOV R3,R4  
LI: JRNZ R2, L2 Цикл
RD RЗ Чтение результата в Асc
RЕТ Возврат

Задание 1

Составить и отладить программу учебной ЭВМ для решения следующей за­дачи. Три массива в памяти заданы начальными адресами и длинами. Вычис­лить и вывести на устройство вывода среднее арифметическое параметров этих массивов.

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

 

Номер варианта задания
Номер строки в табл. 1

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

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

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

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

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

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

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

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

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

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

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

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

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

Лабораторная работа № 6.

Дата: 2016-10-02, просмотров: 320.