Пример ассемблерной программы для эмулятора УМПК-80
Следующая ассемблерная программа иллюстрирует, как с помощью 8-разрядного микропроцессора можно складывать многобайтные целые двоичные числа.
; ##### Сложение многобайтных чисел #####
SUB A; обнуление аккумулятора
LXI H,0840; инициализация указателя 1
MOV B,M; счетчик циклов в регистре B
LXI D,0850; инициализация указателя 2
madd:
INX D; инкремент указателя 1
INX H; инкремент указателя 2
LDAX D; загрузка в A очередного байта 2-го массива
ADC M; сложение с переносом
MOV M,A; сохранение промежуточного байта суммы
DCR B; декремент счетчика циклов
JNZ madd
HLT; останов
Размер массива задается в ячейке по адресу 0840Н. Многобайтные числа (складываемые массивы) находятся в памяти, начиная с адресов 0841Н и 0851Н соответственно, причем сначала хранятся младшие байты. Результат сложения записывается по адресу первого числа.
Данные для программы:
Org 0840H
DB 03 29 A4 50
Org 0851H
DB FB 37 28
Внимание. В эмуляторе УМПК-80 команда DAA коррекции результата сложения упакованных двоично-десятичных чисел работает неправильно, поэтому эмулятором нельзя пользоваться для работы с двоично-десятичными числами.
|
|
Действительно, программа
mvi A,28
mvi B,33
add B
daa
hlt
после выполнения должна возвратить в аккумуляторе значение 61, но эмулятор возвращает значение 11.
Команда DAA в эмуляторе неправильно работает и с неупакованными двоично-десятичными числами. Например, программа
mvi A,05
mvi B,03
add B
daa
hlt
после выполнения должна возвратить в аккумуляторе значение 08, но эмулятор возвращает значение 00.
Задание для выполнения
1. Откройте эмулятор УМПК-80, введите вручную приведенный ассемблерный код демонстрационной программы сложения многобайтных целых двоичных чисел. С помощью команд меню Просмотр/Средства стенда и Просмотр/Регистры и флаги откройте соответствующие окна отображения результатов выполнения. Ассемблируйте программу и, выполняя ее пошагово в режимах Командный цикл и Машинный цикл, наблюдайте за поведением регистров, флагов, текущим состоянием шин данных, адреса и управления.
2. Разработайте ассемблерную программу вычисления суммы элементов массива, состоящего из байтных двоичных чисел. Начальный адрес массива данных равен 0842Н; длину массива укажите в ячейке с адресом 0841Н. В программе используйте счетчик циклов. Результат последовательного сложения байтов сохраните по адресу 0840Н.
Данные для программы:
.org 0841H
03 35 72 0A
В отчете по лабораторной работе приведите блок-схему алгоритма разработанной программы и результаты ее тестирования.
3. Разработайте ассемблерную программу определения единицы в пятом разряде байта данных, считываемого с переключателей стенда (адрес порта ввода 05). В программе используйте маскирование битов двоичного числа (логическая операция AND) и условный переход. Программа должна опрашивать состояние порта ввода в бесконечном цикле и завершаться, как только пользователь включит пятый переключатель на стенде. Результат выполнения программы отобразите на светодиодных индикаторах (адрес порта вывода 05) следующим образом: 5-й бит данных
|
|
• сброшен - светодиоды погашены;
• установлен - все светодиоды горят.
ПРИЛОЖЕНИЕ
Мультиплексоры | |
Мультиплексор 16→1 | |
Мультиплексор 8→1 | |
Два мультиплексора 4→1 | |
Четыре мультиплексора 2→1 | |
Мультиплексор 8→1 с тремя состояниями выхода | |
Демультиплексоры | |
Два демультиплексора 1→4 | |
Дешифраторы | |
Дешифратор 3→8 | |
Дешифратор 4→16 | |
Дешифратор 4→10 | |
Два дешифратора 2→4 | |
Шифраторы | |
Приоритетный шифратор 10→4 | |
Приоритетный шифратор 8→3 | |
Счетчики | |
Синхронный 4-битный двоично-десятичный счетчик (clr) | |
Синхронный 4-битный двоично-десятичный счетчик | |
Синхронный 4-битный двоичный счетчик | |
8-битный последовательно-параллельный сдвиговый регистр (sh) | |
8-битный параллельно- последовательный сдвиговый регистр (ld) | |
8-битный сдвиговый регистр (sh/ld) | |
Схемы контроля четности/нечетности | |
9-битная схема контроля четности/нечетности | |
Сумматоры | |
4-битный полный двоичный сумматор | |
Триггеры | |
Четыре RS-триггера | |
4043, 4044 | Четыре RS-триггера с z-состоянием выходов |
Четыре D-триггера | |
Восемь D-триггеров с z-состоянием выходов | |
Восемь D-триггеров с динамическим POS-управлением | |
Шесть D-триггеров с динамическим POS-управлением | |
Четыре D-триггера с динамическим POS-управлением | |
Два D-триггера с предустановкой и сбросом | |
Два D-триггера со сбросом и динамическим POS-управлением | |
Четыре D-триггера со сбросом | |
Восемь D-триггеров со сбросом | |
Два D-триггера с предустановкой и сбросом | |
Два JK-триггера | |
Два JK-триггера с предустановкой | |
7478, 74112 | Два JK-триггера с предустановкой и динамическим NEG-управлением |
74109, 4027 | Два JK-триггера с предустановкой и динамическим POS-управлением |
Два двухступенчатых JK-триггера с предустановкой и динамическим NEG-управлением |
*) NEG – отрицательный фронт (спад)
POS – положительный фронт