ВМ отчёт №1
.docx16-разрядные двоичные числа записываются самой программой в регистровые пары B и D. Результат записывается в ячейки памяти по адресам L=200 и L=201.
В данном случае реализуется сложение чисел 174 371 и 202 073. После выполнения программы в ячейке по адресу L=200 записано число 064 (младший байт результата), а по адресу L=201 – число 377 (старший байт результата).
Команда ADC RS складывает содержимое аккумулятора с содержимым RS с учётом флага переноса.
Программа 4 реализует «обнуления» заданной области памяти.
Перед выполнением программы запишем в некоторые ячейки памяти с адресами от L=011 до L=040 ненулевые значения. После выполнения программы в автоматическом режиме содержимое всех ячеек по адресам от L=011 до L=040 обнулилось. При повторном выполнении программы в пошаговом режиме оказалось, что часть программы, записанная в ячейках от L=000 до L=004, стёрта. Это произошло, потому что в программе не предусмотрены средства останова, и программа стирала все ячейки, начиная с L=011, до тех пор, пока не перебрала все адреса памяти до конца, а затем продолжила стирать, начиная с самой первой ячейки. Когда была стерта ячейка с адресом L=004, в которой был записан код команды, осуществляющей обнуление, в программе не осталось команд, изменяющих содержимое памяти. Поэтому данные в ячейках по адресам от L=005 до L=010 сохранились.
Для корректного завершения программы её необходимо изменить:
Адрес |
Код команды |
Мнемоника команд |
Комментарии |
L=000 001 002 |
041 015 000 |
LXI H B2 B3 |
Загрузка начального адреса памяти Мл. байт адреса Ст. байт адреса |
003 |
227 |
SUB A |
Обнуление A |
004 |
167 |
MOV M,A |
(A) → (M) |
005 |
043 |
INX H |
Инкремент адреса памяти |
006 |
175 |
MOV A,L |
(L) → (A) |
007 010 |
326 041 |
SUI B2 |
(A) – B2 → (A) |
011 012 013 |
302 003 000 |
JNZ B2 B3 |
|
014 |
166 |
HLT |
|
Данная программа обнуляет содержимое ячеек по адресам от L=015 до L=040.
Программа 5 иллюстрирует формирование Слова Состояния Программы PSW при выполнении различных групп команд микропроцессора.
Слово Состояния Программы PSW состоит из содержимого аккумулятора и регистра флагов РФ. Содержимое регистра флагов РФ:
S – это знак (старший бит аккумулятора), Z – флаг нуля, AC – флаг вспомогательного (межтетрадного) переноса, P – флаг чётности и C – флаг переноса.
Проанализируем значение Слова Состояния Программы PSW, формируемое при выполнении команд программы:
Мнемоника команды |
Значение PSW |
Комментарии |
|
(A) |
РФ |
||
MVI B data |
xxxxxxxx |
xx0x0x1x |
при сбросе состояние PSW не определено |
MVI A data |
00000001 |
xx0x0x1x |
Запись 001 в (А) |
XRA B |
10000001 |
10000110 |
Сложение по модулю 2 чисел 001 и 200, устанавливает биты S, P и сбрасывает биты Z, C |
RAL |
00000010 |
10000111 |
Циклический сдвиг влево через перенос, устанавливает бит C |
LXI SP data |
00000010 |
10000111 |
Не меняет значение PSW |
PUSH PSW |
00000010 |
10000111 |
|
HLT |
00000010 |
10000111 |
После выполнения программы 5 проверим содержимое ячеек памяти. По адресу L=200: 10 000 111 (содержимое регистра флагов). По адресу L=201: 00 000 010 (содержимое аккумулятора).
Программа 6, состоящая всего из одной команды HLT, расположенной по адресу H=100 L=200, иллюстрирует способ обращения к фрагменту программы, расположенному не с нулевого адреса, с использованием «клавиатурного» режима выполнения команд.
Для выполнения данной программы предварительно необходимо загрузить счетчик команд адресом первой команды программы.
Выполним команду JMP 200 100 в клавиатурном режиме. Переключим стенд в режим выполнения программы, записанной в памяти. Выполним программу 6.
Программа 7 позволяет проверить действие команд условного перехода.
Перед выполнением программы запишем в память по адресу L=200 код 002, соответствующий нулевому значению всех флагов в регистре признаков, а по адресу L=004 — код 302, идентифицирующий команду условного перехода по ненулевому результату JNZ. Выполним программу в пошаговом режиме. Осуществляется циклическое выполнение программы, потому что флаг Z сброшен в ноль, и выполняется команда перехода по нулевому значению флага Z.
Если изменить данные в ячейке по адресу L=200 на число 102, то программа остановится, потому что в данном случае флаг Z установлен в 1, и команда перехода по нулевому значению флага Z не выполняется.
Если теперь изменить содержимое ячейки с адресом L=004 на число 312, то программа будет выполняться циклически, потому что 312 – это команда перехода по единичному значению флага Z.
Если записать 002 по адресу L=200 и 322 по адресу L=004, то программа будет выполняться циклически, потому что 322 – это команда перехода по нулевому значению флага C, и флаг C сброшен в ноль.
Если теперь изменить содержимое ячейки с адресом L=004 на число 332, то программа остановиться, потому что 332 – это команда перехода по единичному значению флага C.
Программа 8 демонстрирует действие команд вызова подпрограммы и возврата в основную программу.
Адрес |
Код команды |
Мнемоника команд |
Комментарии |
L=000 001 002 |
061 067 000 |
LXI SP B2 B3 |
Инициализация указателя стека Мл. байт адреса Ст. байт адреса |
003 004 005 |
315 015 000 |
CALL addr B2 B3 |
Безусловный вызов подпрограммы |
006 |
166 |
HLT |
Останов |
015 |
311 |
RET |
Безусловный возврат из подпрограммы |
Команды CALL addr и JMP addr отличаются тем, что JMP addr просто изменяет содержимое счётчика команд, а CALL addr перед тем, как его изменить, сохраняет его в стеке для возможности возврата.
Программа 9 поясняет действие команд RST N и RET при работе с прерывающими программами.
Описание работы программы по машинным циклам:
Адрес (состояние ША) |
Содержимое памяти (состояние ШД) |
Комментарий |
000 |
061 |
Инициализация указателя стека |
001 |
067 |
|
002 |
000 |
|
003 |
317 |
Вызов подпрограммы по адресу L=010 |
066 |
000 |
Загрузка в стек содержимого счётчика команд |
065 |
004 |
|
010 |
311 |
Возврат из подпрограммы |
065 |
004 |
Загрузка адреса из стека в счётчик команд |
066 |
000 |
|
004 |
166 |
Останов |
Команды CALL addr и RST N отличаются тем, что CALL addr может вызвать подпрограмму по любому адресу, а RST N только по одному из восьми адресов (0N0, где N=0..7). Но RST N – это однобайтная команда, а CALL addr – трёхбайтная.
Программа 10 демонстрирует работу нескольких прерывающих друг друга вложенных программ.
Алгоритм работы программы 10:
пуск
000 067 → (SP)
Подпрограмма 1
Останов
Подпрограмма 2
Подпрограмма 3
Подпрограмма 4
Подпрограмма 5
Если в вызываемой (прерывающей) программе будет отсутствовать команда RET, то программа не дойдёт до команды останова, и либо зациклиться, либо будет выполнять содержимое следующих ячеек памяти как команды.
Индивидуальное задание:
Вывести на семисегментные индикаторы сообщение «ВАГОН № 23» бегущей строкой с использованием динамической индикации.
В общем случае в качестве буферного устройства сопряжения между МП и устройствами ввода/вывода используют БИС программируемого параллельного интерфейса КР580ВВ55 (ППИ), входящую в состав микропроцессорного комплекта К580. БИС КР580ВВ55 представляет собой набор из трех 8-разрядных двунаправленных портов (каналов) А, В и С, предназначенных для подключения периферийных устройств к системным шинам.
Структурная схема ППИ БИС КР580ВВ55:
Режим работы каналов программируется с помощью записываемого в регистр управления управляющего слова. Формат управляющего слова БИС КР580ВВ55:
ППИ реализует три режима обмена:
– режим 0 — основной режим ввода-вывода, позволяющий организовать синхронный обмен информацией между МП и внешним устройством по трем каналам, т. е. через регистры А, В и С. Вывод информации осуществляется по команде OUT port с фиксацией выводимой информации в регистрах канала. Ввод информации осуществляется по команде IN port без запоминания информации;
– режим 1 — режим асинхронного обмена информацией или обмена по готовности данных между МП и ВУ по двум каналам А и В;
– режим 2 — режим стробируемого двунаправленного обмена, в котором можно осуществлять двунаправленную передачу информации только по одному каналу А.
Мы будем работать в режиме 0.
Обмен данными при использовании ППИ выполняется командами ввода IN port и вывода ОUT port, в которых значение port является адресом соответствующего регистра ППИ.
Структурная схема блока динамической индикации:
Код индицируемого символа, формируемый на выходе канала А при выполнении команды OUT port, параллельно поступает на входы сегментов всех шести индикаторов. Выбор адресуемого индикатора осуществляется с помощью дешифратора, включенного на выходе регистра канала В. Для адресации индикатора в порт В необходимо занести соответствующую информацию (реализуется командой OUT port). Адреса индикаторов указаны на схеме блока динамической индикации. ППИ блока динамической индикации предварительно должен быть проинициализирован.
Адрес |
Код команды |
Мнемоника команд |
Комментарии |
L=000 001 |
076 200 |
MVI A B2 |
200 → (A) |
002 003 |
323 003 |
OUT port B2 |
(A) → Рг. Упр. (инициализация) |
004 005 |
036 000 |
MVI E B2 |
Обнуление регистра E |
006 007 010 |
041 177 000 |
LXI H B2 B3 |
Загрузка начального адреса памяти Мл. байт адреса Ст. байт адреса |
011 012 |
006 021 |
MVI B B2 |
Установка счётчика символов в сообщении |
013 014 |
026 040 |
MVI D B2 |
Изменяя начальное значение, загружаемое в регистр D, можно менять скорость бегущей строки |
015 016 |
016 040 |
MVI C B2 |
Загрузка адреса индикатора в регистр C |
017 |
043 |
INX H |
|
020 |
227 |
SUB A |
Обнуление аккумулятора |
021 022 |
323 000 |
OUT port B2 |
(A) → Рг. A |
023 |
171 |
MOV A,C |
(C) → (A) |
024 025 |
323 001 |
OUT port B2 |
(A) → Рг. B |
026 |
176 |
MOV A,M |
(M) → (A) |
027 030 |
323 000 |
OUT port B2 |
(A) → Рг. A |
031 |
035 |
DCR E |
|
032 033 034 |
302 031 000 |
JNZ B2 B3 |
|
035 |
171 |
MOV A,C |
|
036 |
037 |
RAR |
Циклический сдвиг вправо через перенос |
037 |
117 |
MOV C,A |
|
040 041 042 |
322 017 000 |
JNC B2 B3 |
|
043 |
175 |
MOV A,L |
|
044 045 |
326 006 |
SUI B2 |
(A) – 6 → (A) |
046 |
157 |
MOV L,A |
|
047 |
025 |
DCR D |
|
050 051 052 |
302 015 000 |
JNZ B2 B3 |
|
053 |
043 |
INX H |
|
054 |
005 |
DCR B |
|
055 056 057 |
302 013 000 |
JNZ B2 B3 |
|
060 061 062 |
303 006 000 |
JMP B2 B3 |
|
Описание работы программы:
-
Инициализация ППИ блока динамической индикации (ДИ). Для этого в регистр управления записывается число 200.
-
Обнуление регистра E. // Он используется для формирования временной задержки каждый раз после вывода значения на один из индикаторов. Если не делать задержку, то индикатор в итоге будет светиться очень слабо.
-
Загрузка начального адреса памяти, после которого начинается сообщение.
-
Загрузка числа 021 в регистр B. // Это количество символов сообщения, которые ещё не выведены на данной итерации цикла (после окончания сообщения оно выводится с начала).
-
Загрузка числа 040 в регистр D. // Начальное значение, загружаемое в этот регистр, определяет, сколько раз будет повторяться перебор индикаторов до появления следующего символа сообщения, т.е. определяет скорость бегущей строки.
-
Загрузка числа 040 в регистр C. // В этом регистре хранится текущий адрес индикатора, и отсюда он загружается в регистр B блока ДИ.
-
Инкрементация адреса памяти. // На эту строчку мы будем возвращаться каждый раз перед тем, как вывести символ на очередной индикатор.
-
Обнуление регистра A блока ДИ. // Это делается перед тем, как изменить адрес индикатора в регистре B блока ДИ.
-
Передача адреса индикатора из регистра C в регистр B блока ДИ.
-
Передача кода символа из текущей ячейки памяти в регистр A блока ДИ.
-
Формирование временной задержки с помощью многократной декрементации регистра E.
-
Циклический сдвиг содержимого регистра C вправо через перенос. // Формирование адреса следующего индикатора.
-
Если бит переноса в РФ равен нулю, т.е. если получился корректный адрес индикатора, т.е. если перебрали ещё не все индикаторы, то идём на строчку 7.
-
Иначе, т.е. если все индикаторы уже перебрали, уменьшаем текущий адрес памяти на 6, чтобы далее можно было начать перебор заново.
-
Декрементируем содержимое регистра D, и, если там ещё не ноль, повторяем перебор индикаторов, выводя на них те же значения, т.е. идём на строчку 6.
-
Иначе, т.е. если перебор индикаторов уже повторился достаточное количество раз, инкрементируем текущий адрес памяти, чтобы далее выводить на индикаторы следующий набор символов (те же 5 + 1 новый).
-
Декрементируем содержимое регистра B, и, если там ещё не ноль, т.е. если есть ещё не выведенные символы, то идём на строчку 5.
-
Иначе, т.е. если все символы уже были выведены, начинаем всё заново, т.е. идем на строчку 3.
Перед запуском программы необходимо записать в память само сообщение:
Адрес |
Данные |
200..205 |
0 |
206 |
01111111 |
207 |
01110111 |
210 |
00110001 |
211 |
00111111 |
212 |
01110110 |
213 |
0 |
214 |
01110110 |
215 |
01011100 |
216 |
0 |
217 |
01011011 |
220 |
01001111 |
221..225 |
0 |
Выводы:
В ходе выполнения лабораторной работы мною были изучены режимы работы МП КР580ВМ80 и приобретены начальные навыки программирования устройств на его основе посредством выполнения и анализа десяти тестовых программ, описанных в учебном пособии. После этого было выполнено индивидуальное задание по выводу бегущей строки на динамическую индикацию. Программа, написанная по индивидуальному заданию, составлена таким образом, что для изменения длины выводимого сообщения или скорости бегущей строки достаточно перезаписать содержимое только одной ячейки памяти. Само сообщение предварительно должно быть записано в память.