11
ЛАБОРАТОРНАЯ РАБОТА № 3 Тема: «Программирование цикла с переадресацией»
Цель работы: изучение системы команд модели ЭВМ, реализация алгоритмов обработки массивов данных.
При решении задач, связанных с обработкой массивов, возникает необходимость изменения исполнительного адреса при повторном выполнении некоторых команд. Эта задача может быть решена путем использования косвенной адресации.
Пример
Разработать программу вычисления суммы элементов массива чисел С1, С2, .., Сn. Исходными данными в этой задаче являются: n – количество суммируемых чисел и С1, С2,…, Сn – массив суммируемых чисел. Заметим, что должно выполняться условие n > 1, т. к. алгоритм предусматривает, по крайней мере, одно суммирование. Кроме того, предполагается, что суммируемые числа записаны в ОЗУ подряд, т. е. в ячейки памяти с последовательными адресами. Результатом является сумма S. Граф-схема алгоритма представлен на рис. 2.
Составим программу для вычисления суммы со следующими конкретными параметрами: число элементов массива – 10, элементы массива расположены в ячейках ОЗУ по адресам 040, 041, 042,..., 049. Используемые для решения задачи промежуточные переменные имеют следующий смысл: Ai
– адрес числа Сi; ОЗУ(Ai) – число по адресу Ai, S – текущая сумма; к – счетчик цикла, определяющий число повторений тела цикла.
Распределение памяти таково. Программу разместим в ячейках ОЗУ, начиная с адреса 000, примерная оценка объема программы – 20 команд; промежуточные переменные: Ai – в ячейке ОЗУ с адресом 030, к — по адресу 031, S – по адресу 032. Граф-схема алгоритма программы показан на рис. 2, текст программы с комментариями приведен в табл. 6.
12
|
|
|
|
|
|
|
Начало |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k:=10 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S:=0 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ai:=40 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
S:=S+M(Ai) |
|
|
|||
|
|
|
|
НЕТ |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ai:=Ai+1 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k:=k+1 |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k=0 |
|||||
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ДА |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вывод S |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
Конец |
|||||
|
|
Рис. 2. Граф-схема алгоритма |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
Таблица 6 |
|
|
|
|
Текст программы примера |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Адрес |
Команда |
|
|
|
|
|
|
|
|
Примечание |
|
|
|
|
|
|
|
||||||||
000 |
RD #40 |
|
Загрузка начального адреса массива 040 |
|
||||||||
001 |
WR 30 |
|
в ячейку 030 |
|
||||||||
002 |
RD #10 |
|
Загрузка параметра цикла к = 10 в ячейку 031 |
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
003 |
WR 31 |
|
|
|
|
|
|
|
|
|
|
|
004 |
RD #0 |
|
Загрузка начального значения суммы S = 0 |
|
||||||||
005 |
WR 32 |
|
в ячейку 032 |
|
||||||||
006 |
M1: RD 32 |
|
Добавление |
|
||||||||
007 |
ADD @30 |
|
к текущей сумме |
|
||||||||
008 |
WR 32 |
|
очередного элемента массива |
|
||||||||
|
|
13 |
|
|
|
Окончание табл. 6 |
|
1 |
2 |
3 |
|
009 |
RD 30 |
Модификация текущего |
|
010 |
ADD #1 |
адреса массива |
|
011 |
WR 30 |
(переход к следующему адресу) |
|
012 |
RD 31 |
Уменьшение счетчика |
|
013 |
SUB #1 |
(параметра цикла) |
|
014 |
WR 31 |
на 1 |
|
015 |
JNZ M1 |
Проверка параметра цикла и переход при к <> 0 |
|
016 |
RD 32 |
Вывод |
|
017 |
OUT |
результата |
|
018 |
HLT |
Стоп |
|
|
|
|
|
Задание на лабораторную работу
1. Написать программу определения заданной характеристики последовательности чисел С1, С2, ..., Сn. Варианты заданий приведены в табл.
7.
2. Записать программу в мнемокодах, введя ее в поле окна Текст ог аммы.
3.Сохранить набранную программу в виде текстового файла и произвести ассемблирование мнемокодов.
4.Загрузить в ОЗУ необходимые константы и исходные данные.
5.Отладить программу.
Таблица 7
|
Варианты самостоятельных заданий |
|
|
Вариант |
Характеристика последовательности Ci |
|
|
1 |
2 |
|
|
1 |
Количество отрицательных чисел |
|
|
2 |
Минимальное положительное число |
|
|
3 |
Произведение всех чисел больше заданного |
|
|
4 |
Номер максимального числа |
|
|
5 |
Количество чисел равных заданному |
|
|
6 |
Количество положительных чисел |
|
|
7 |
Номер первого отрицательного числа |
|
|
8 |
Сумма модулей чисел |
|
|
9 |
Номер последнего отрицательно числа |
|
|
|
14 |
|
|
Окончание табл. 7 |
|
1 |
2 |
|
|
|
|
10 |
Номер последнего положительного числа |
|
|
|
|
11 |
Минимальное отрицательное число |
|
|
|
|
12 |
Сумма всех положительных чисел |
|
|
|
|
13 |
Произведение всех чисел меньше заданного |
|
|
|
|
14 |
Номер минимального числа |
|
|
|
|
Требования к содержанию отчета
Отчет по лабораторной работе должен содержать следующие разделы:
1.Формулировка варианта задания.
2.Граф-схема алгоритма решения задачи.
3.Распределение памяти (размещение в ОЗУ переменных, программы и необходимых констант).
4.Программа.
5.Значения исходных данных и результата выполнения программы.
Контрольные вопросы
1.Как организовать цикл в программе?
2.Что такое параметр цикла?
3.Как поведет себя программа, приведенная в примере, если в ней будет отсутствовать команда WR 31 по адресу 014?
4.Как поведет себя программа, приведенная в примере, если метка M1 будет поставлена по адресу 005? 007?
15
ЛАБОРАТОРНАЯ РАБОТА № 4 Тема: «Подпрограммы и стек»
Цель работы: изучить команды вызова подпрограмм и работы со стеком, изучить организацию программ с использованием подпрограмм.
В программировании часто встречаются ситуации, когда одинаковые действия необходимо выполнять многократно в разных частях программы (например, вычисление функции sin х). При этом с целью экономии памяти не следует многократно повторять одну и ту же последовательность команд – достаточно один раз написать так называемую подпрограмму (в терминах языков высокого уровня – процедуру) и обеспечить правильный вызов этой подпрограммы и возврат в точку вызова по завершению подпрограммы. Для вызова подпрограммы необходимо указать ее начальный адрес в памяти и передать (если необходимо) параметры – те исходные данные, с которыми будут выполняться предусмотренные в подпрограмме действия. Адрес подпрограммы указывается в команде вызова CALL, а параметры могут передаваться через определенные ячейки памяти, регистры или стек.
Возврат в точку вызова обеспечивается сохранением адреса текущей команды (содержимого регистра PC) при вызове и использованием в конце подпрограммы команды возврата RET, которая возвращает сохраненное значение адреса возврата в PC.
Для реализации механизма вложенных подпрограмм (возможность вызова подпрограммы из другой подпрограммы и т. д.) адреса возврата целесообразно сохранять в стеке. Стек – особым образом организованная безадресная память, доступ к которой осуществляется через единственную ячейку, называемую верхушкой стека. При записи слово помещается в верхушку стека, предварительно все находящиеся в нем слова смещаются вниз на одну позицию; при чтении извлекается содержимое верхушки стека (оно при этом из стека исчезает), а все оставшиеся слова смещаются вверх на одну позицию. В программировании называют такую дисциплину обслуживания LIFO (Last In First Out, последним пришел – первым вышел) в отличие от дисциплины типа очередь – FIFO (First In First Out, первым пришел – первым вышел).