Индивидуальное задание №1: Транспонирование матрицы 4x4
Задание
Составить программу для транспонирования матрицы 4 на 4, которая хранится в памяти в виде массива данных, начиная с адреса H = 001 L = 000.
Анализ задания
Для того чтобы выполнить транспонирование матрицы необходимо каждый элемент матрицы поменять местами с симметричным ему элементом. Для этого, на основании номеров строки и столбца (j и i), вычисляются линейные адреса текущего элемента матрицы и симметричного ему элемента. Затем, по вычисленным адресам, из памяти считываются эти элементы, обмениваются местами и записываются в память на новые места.
Транспонирование выполняется сначала для верхнего левого угла матрицы 1х1, затем для подматрицы 2х2, 3х3 и в конце 4х4.
Назначение РОН:
B – хранение счетчика i;
C – хранение счетчика j;
D – запоминание, считанного из памяти элемента столбца;
E – хранение адреса элемента столбца;
H – хранение номера страницы памяти, на которой лежит массив (H = 001);
L – хранение линейных адресов элементов строки и столбца;
A – вычисление адресов элементов строки и столбца, а так же временное хранение считанного из памяти элемента строки.
Схема алгоритма
см. следующую страницу
Текст программы
Адрес |
Код команды |
Мнемоника |
Комментарии |
000 |
016 |
MVI C |
Обнуление счетчика j |
001 |
000 |
B2 |
|
002 |
046 |
MVI H |
Загрузка в H старшего байта адреса исходной матрицы |
003 |
001 |
B2 |
|
004 |
006 |
MVI B |
Обнуление счетчика i |
005 |
000 |
B2 |
|
006 |
171 |
MOV A, C |
Загрузка в A счетчика j; (А) = j |
007 |
067 |
STC |
Умножение j на 4; (A) = j*4. Умножение реализовано как сдвиг содержимого аккумулятора влево на 2 разряда. Используется сдвиг через перенос и перед каждым сдвигом обнуляется флаг переноса. |
010 |
077 |
CMC |
|
011 |
027 |
RAL |
|
012 |
067 |
STC |
|
013 |
077 |
CMC |
|
014 |
027 |
RAL |
|
015 |
200 |
ADD B |
Добавление i к A; (A) = j*4 + i. Получение адреса элемента столбца. |
016 |
157 |
MOV L, A |
Запоминание адреса столбца в L и E |
017 |
137 |
MOV E, A |
|
020 |
126 |
MOV D, M |
Считывание элемента столбца из памяти |
021 |
170 |
MOV A, B |
(A) = i |
022 |
167 |
STC |
(A) = i*4. |
023 |
077 |
CMC |
|
024 |
027 |
RAL |
|
025 |
067 |
STC |
|
026 |
077 |
CMC |
|
027 |
027 |
RAL |
|
030 |
201 |
ADD C |
(A) = j + i*4. Адрес элемента строки. |
031 |
157 |
MOV L, A |
Запоминание адреса строки в L |
032 |
176 |
MOV A, M |
Считывание элемента строки из памяти |
033 |
162 |
MOV M, D |
Запись элемента столбца в память на место элемента строки |
034 |
153 |
MOV L, E |
Запись адреса столбца в L |
035 |
167 |
MOV M, A |
Запись элемента строки в память на место элемента столбца |
036 |
170 |
MOV A, B |
Запись i в A; (A) = i |
037 |
221 |
SUB C |
Вычитание j из i; (A) = i-j |
040 |
312 |
JZ |
Условный переход по нулю. |
041 |
047 |
B2 |
|
042 |
000 |
B3 |
|
043 |
004 |
INR B |
Инкрементация i; (B) = i+1 |
044 |
303 |
JMP |
Безусловный переход |
045 |
006 |
B2 |
|
046 |
000 |
B3 |
047 |
076 |
MVI A |
Запись в A числа 003; (A) = 003 |
050 |
003 |
B2 |
|
051 |
221 |
SUB C |
Вычитание j из A; (A) = 003 - j |
052 |
312 |
JZ |
Условный переход по нулю. |
053 |
061 |
B2 |
|
054 |
000 |
B3 |
|
055 |
014 |
INR C |
Инкрементация j; (C) = j+1 |
056 |
303 |
JMP |
Безусловный переход |
057 |
004 |
B2 |
|
060 |
000 |
B3 |
|
061 |
166 |
HLT |
Останов |
Умножение на 4 в этой программе реализовано как сдвиг влево на 2 разряда с записью в младшие разряды нулей. Но в процессоре Intel 8080 аппаратно реализованы только циклические сдвиги. В результате, чтобы в младшие разряды записывались нули, в программе используется циклический сдвиг через перенос с предварительным сбросом флага переноса в ноль.
Так же, из-за малого количества регистров общего назначения, во время разработки программы много времени ушло, на то чтобы придумать способ назначения регистров блока РОН, таким образом, чтобы не пришлось использовать память. В результате аккумулятор используется для временного хранения, считанного из памяти элемента строки.
Результаты
Адрес |
Исходное содержимое |
Результат |
||
H |
L |
|||
001 |
000 |
000 |
000 |
|
001 |
001 |
001 |
004 |
|
001 |
002 |
002 |
010 |
|
001 |
003 |
003 |
014 |
|
001 |
004 |
004 |
001 |
|
001 |
005 |
005 |
005 |
|
001 |
006 |
006 |
011 |
|
001 |
007 |
007 |
015 |
|
001 |
010 |
010 |
002 |
|
001 |
011 |
011 |
006 |
|
001 |
012 |
012 |
012 |
|
001 |
013 |
013 |
016 |
|
001 |
014 |
014 |
003 |
|
001 |
015 |
015 |
007 |
|
001 |
016 |
016 |
013 |
|
001 |
017 |
017 |
017 |