Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ВМ отчёт №1

.docx
Скачиваний:
21
Добавлен:
16.04.2015
Размер:
456.59 Кб
Скачать

16-разрядные двоичные числа записываются самой программой в регистровые пары 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

Описание работы программы:

  1. Инициализация ППИ блока динамической индикации (ДИ). Для этого в регистр управления записывается число 200.

  2. Обнуление регистра E. // Он используется для формирования временной задержки каждый раз после вывода значения на один из индикаторов. Если не делать задержку, то индикатор в итоге будет светиться очень слабо.

  3. Загрузка начального адреса памяти, после которого начинается сообщение.

  4. Загрузка числа 021 в регистр B. // Это количество символов сообщения, которые ещё не выведены на данной итерации цикла (после окончания сообщения оно выводится с начала).

  5. Загрузка числа 040 в регистр D. // Начальное значение, загружаемое в этот регистр, определяет, сколько раз будет повторяться перебор индикаторов до появления следующего символа сообщения, т.е. определяет скорость бегущей строки.

  6. Загрузка числа 040 в регистр C. // В этом регистре хранится текущий адрес индикатора, и отсюда он загружается в регистр B блока ДИ.

  7. Инкрементация адреса памяти. // На эту строчку мы будем возвращаться каждый раз перед тем, как вывести символ на очередной индикатор.

  8. Обнуление регистра A блока ДИ. // Это делается перед тем, как изменить адрес индикатора в регистре B блока ДИ.

  9. Передача адреса индикатора из регистра C в регистр B блока ДИ.

  10. Передача кода символа из текущей ячейки памяти в регистр A блока ДИ.

  11. Формирование временной задержки с помощью многократной декрементации регистра E.

  12. Циклический сдвиг содержимого регистра C вправо через перенос. // Формирование адреса следующего индикатора.

  13. Если бит переноса в РФ равен нулю, т.е. если получился корректный адрес индикатора, т.е. если перебрали ещё не все индикаторы, то идём на строчку 7.

  14. Иначе, т.е. если все индикаторы уже перебрали, уменьшаем текущий адрес памяти на 6, чтобы далее можно было начать перебор заново.

  15. Декрементируем содержимое регистра D, и, если там ещё не ноль, повторяем перебор индикаторов, выводя на них те же значения, т.е. идём на строчку 6.

  16. Иначе, т.е. если перебор индикаторов уже повторился достаточное количество раз, инкрементируем текущий адрес памяти, чтобы далее выводить на индикаторы следующий набор символов (те же 5 + 1 новый).

  17. Декрементируем содержимое регистра B, и, если там ещё не ноль, т.е. если есть ещё не выведенные символы, то идём на строчку 5.

  18. Иначе, т.е. если все символы уже были выведены, начинаем всё заново, т.е. идем на строчку 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 и приобретены начальные навыки программирования устройств на его основе посредством выполнения и анализа десяти тестовых программ, описанных в учебном пособии. После этого было выполнено индивидуальное задание по выводу бегущей строки на динамическую индикацию. Программа, написанная по индивидуальному заданию, составлена таким образом, что для изменения длины выводимого сообщения или скорости бегущей строки достаточно перезаписать содержимое только одной ячейки памяти. Само сообщение предварительно должно быть записано в память.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]