Отчёт по четырём лабораторным работам (1084882), страница 2
Текст из файла (страница 2)
Задание 1. Составить программу вычисления выражения
где - число натурального ряда, начиная с “1”,
– количество чисел.
Функциональная схема алгоритма программы.
Инициализация
Aрг:= 00;
Bрг:=03
Aрг:=Aрг+Bрг;
Bрг:=Bрг-1
Zфл=0
Zфл=1
Программа
Адрес | Код | Команда | Комментарий |
0000 | 3E | MVI A,d8 | Обнуляем аккумулятор |
0001 | 00 | ||
0002 | 06 | MVI B,d8 | Инициализируем регистр B значением n = 3 |
0003 | 03 | ||
0004 | 80 | ADD B | Прибавляем содержимое регистра B к содержимому аккумулятора |
0005 | 05 | DCR B | Декрементируем содержимое регистра B |
0006 | C2 | JNZ adr | Если B <> 0 то переходим по адресу 0004 (в начало цикла) |
0007 | 04 | ||
0008 | 00 | ||
0009 | 76 | HLT | Конец |
Задание 2. Составить программу вычисления выражения, приведенного в задании 1. Числа (произвольные значения) разместить в ячейках в ОЗУ.
Функциональная схема алгоритма программы.
Инициализация
Bрг:= 00; Aрг:= 00;
Hрг:=05; Dрг:=01;
Eрг:=18;
Aрг:=M [DE];
Aрг:=Aрг+Bрг;
Bрг:=Aрг;
Hрг:=Hрг-1;
Арг:=0;
Арг CMP Hрг
Cфл=0
Cфл=1
Eрг:=Eрг+1
Программа
Адрес | Код | Команда | Комментарий |
0100 | 06 | MVI B,d8 | Инициализируем регистр B нулевым значением |
0101 | 00 | ||
0102 | 78 | MOV A,B | Инициализируем регистр A нулевым значением |
0103 | 26 | MVI H,d8 | Инициализируем регистр H значением n = 5 |
0104 | 05 | ||
0105 | 16 | MVI D,d8 | Инициализируем регистр D значением 01 |
0106 | 01 | 01 – старшие разряды адреса операнда | |
0107 | 1E | MVI E,d8 | Инициализируем регистр E значением 18 |
0108 | 18 | 18 – младшие разряды адреса операнда | |
0109 | 1A | LDAX D | Загружаем в регистр A содержимое ячейки указанной в регистрах D и E |
010A | 80 | ADD B | Прибавляем к содержимому регистра A содержимое регистра B |
010B | 47 | MOV B,A | Записываем сумму в регистр B |
010C | 25 | DCR H | Уменьшаем на единицу счётчик оставшихся слагаемых |
010D | 3E | MVI A,d8 | Записываем в регистр A нулевое значение |
010E | 00 | ||
010F | BC | CMP H | Сравниваем содержимое регистра H с нулём: если оно больше нуля то флаг C:=1 |
0110 | D2 | JNC adr | Если флаг C = 0 то идём по адресу 0117 (конец программы) |
0111 | 17 | ||
0112 | 01 | ||
0113 | 1C | INR E | Увеличиваем на единицу значение младшего разряда операнда |
0114 | C3 | JMP adr | Переход по адресу 0109 (начало цикла) |
0115 | 01 | ||
0116 | 09 | ||
0117 | 76 | HLT | Конец |
Суммируемые числа размещаются в области памяти, начиная с адреса 0118, и занимают 1 байт каждое.
Задание 3. Составить программу для пересылки массива данных размерностью из одной области ОЗУ в другую.
Функциональная схема алгоритма программы.
Hрг:=03;
Aрг:=M [HL];
Hрг:=04;
M [HL]= Aрг;
Lрг:= Lрг+1;
Aрг= Lрг;
Aрг cmp Dрг
Zфл=0
Zфл=1
Инициализация
Dрг:= 03;
Lрг:=00;


Программа
Адрес | Код | Команда | Комментарий |
0200 | 16 | MVI D,d8 | Инициализируем регистр D значением n = 3 |
0201 | 03 | ||
0202 | 2E | MVI L,d8 | Инициализируем регистр L значением 00 |
0203 | 00 | ||
0204 | 26 | MVI H,d8 | Инициализируем регистр H значением 03 |
0205 | 03 | ||
0206 | 7E | MOV A,M | Считываем в аккумулятор элемент массива из памяти |
0207 | 26 | MVI H,d8 | Записываем в регистр H значение 04, изменяя старший байт адреса ячейки ОЗУ |
0208 | 04 | ||
0209 | 77 | MOV M,A | Записываем содержимое аккумулятора в память |
020A | 2C | INR L | Увеличиваем содержимое регистра L на 1 (младший байт адреса ОЗУ) |
020B | 7D | MOV A,L | Передаем значение регистра L (Регистр L считаем счетчиком элементов массива) в регистр A |
020C | BA | CMP D | Сравниваем L и D ( если значение L < значения D то Z=0 ) |
020D | C2 | JNZ adr | Если Z=0, идём по адресу 0204 (продолжаем цикл) |
020E | 04 | ||
020F | 02 | ||
0210 | 76 | HLT | Конец |
Пересылаемые элементы находятся в ячейках памяти, начиная с 0300, и пересылаются в ячейки, начиная с адреса 0400, причём каждый элемент занимает 1 байт.
Задание 4. Составить программу для пересылки массива данных размерностью из одной области ОЗУ в другую. После пересылки массив должен расположиться в обратном порядке.
Функциональная схема алгоритма программы.
Lрг:= Cрг;
Eрг:=M [HL];
Hрг:=08;
Aрг:= Dрг;
Aрг:= Aрг-1;
Aрг:= Aрг- Cрг;
Lрг:= Aрг;
M [HL]:= Eрг;
Cрг:=Cрг+1;
Aрг cpi 00




Zфл=0
Zфл=1
Инициализация
Dрг:= 05; Aрг:=00;
Cрг:= Aрг; Hрг:=07;



Программа
Адрес | Код | Команда | Комментарий |
0600 | 16 | MVI D, d8 | Инициализируем регистр D значением n=10 |
0601 | 05 | ||
0602 | AF | XRA A | Инициализируем регистр A значением 0 |
0603 | 4F | MOV C,A | Инициализируем регистр C значением 0 |
0604 | 26 | MVI H, d8 | Передаем регистру старшего байта адреса значение старшего байта адреса ОЗУ с массивом |
0605 | 07 | ||
0606 | 69 | MOV L,C | Регистр C – счетчик передаваемых элементов, считающий с 0, поэтому его значение можно использовать в качестве младшего байта адреса памяти. Передаем значение регистра C в регистр L |
0607 | 5E | MOV E,M | Записываем пересылаемый элемент в регистр E |
0608 | 26 | MVI H, d8 | Меняем значение старшего байта адреса ОЗУ в регистре H |
0609 | 08 | ||
060A | 7A | MOV A,D | Вычисляем младший адрес памяти другой области ОЗУ. |
060B | 3D | DCR A | Уменьшаем значение регистра A на 1 (так как счет адресов идет с 0) |
060C | 91 | SUB C | Вычитаем из значения регистра A значение регистра C |
060D | 6F | MOV L,A | Записываем получившийся результат в регистр L |
060E | 73 | MOV M,E | Передаем ячейке памяти элемент массива из регистра E |
060F | 0C | INR C | Увеличиваем значение регистра C на 1 |
0610 | FE | CPI d8 | Сравниваем значение регистра A с 00. Если значение регистра A = 00, значит элемент был записан в новой области в адрес с значением младшего байта адреса, равным 00, что согласно алгоритму характерно последнему элементу |
0611 | 00 | ||
0612 | C2 | JNZ adr | В случае, если пересылка элементов не закончена, продолжаем цикл, переходя по адресу 0604 |
0613 | 04 | ||
0614 | 06 | ||
0615 | 76 | HLT | Конец |
Пересылаемые элементы находятся в ячейках памяти по адресам, начиная с 0700, и пересылаются по адресам, начиная с 0800, причём каждый элемент занимает 1 байт.