- •Описание лабораторного макета
- •Устройство умк
- •2. Подготовка умк к работе
- •3. Порядок работы
- •3.1. Описание клавиатуры.
- •Индикация и изменение содержимого памяти.
- •3.3. Индикация и изменение содержимого регистров.
- •3.4. Передача управления программе пользователя.
- •3.6. Заполнение массива памяти константой.
- •3.8. Прерывание выполнения программы пользователя.
- •3.9. Пошаговое выполнение программ.
- •Лабораторная работа № 1 запись и выполнение простых программ
- •Теоретическая часть
- •Задание для домашней подготовки
- •Задание для выполнения в лаборатории
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 2 виды адресации и команды пересылок
- •Теоретическая часть
- •Задание для домашней подготовки
- •Задание для выполнения в лаборатории
- •Указания по оформлению отчета
- •Контрольные вопросы
- •Организация циклов
- •Задание для домашней подготовки
- •Задание для выполнения в лаборатории
- •Задание для домашней подготовки
- •Задание для выполнения в лаборатории
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 5 выполнение арифметических операций
- •Теоретическая часть
- •Задание для домашней подготовки
- •Задание для домашней подготовки
- •Задание для выполнения в лаборатории
- •Методические указания
- •Способы адресации процессора к1801
- •Форматы команд микропроцессора кр 1801:
- •Коды способов адресации процессора к1801
- •Задание для домашней подготовки
- •Команды переходов
- •Пример 9.2.
- •Пример 9.3
- •Задание для выполнения в лаборатории
- •Контрольные вопросы
- •Лабораторная работа № 10 выполнение арифметических операций в машинных кодах микропроцессора к1801вм1
- •Теоретическая часть
- •Умножение
- •Деление
- •Задание для домашней подготовки
- •Задание для выполнения в лаборатории
- •Указания по оформлению отчета
- •Контрольные вопросы
- •Приложения
- •Система команд микропроцессора кр580вм80а
- •Система команд мп к1801вм1 Одноадресные команды
- •Двухадресные команды
- •Регистровые команды
- •Команды управления
- •Команды прерываний и специальные команды
- •Изменение кодов условий
- •Условные обозначения
- •Время выполнения команд мп к1801вм1
- •1. Устройство умк 3
Задание для домашней подготовки
1.Ознакомтесь с командами вызова и возврата из подпрограммы по условию.
2. Составьте подпрограммы 1,2,3 в машинных кодах согласно вашему варианту с учетом табл.4.1. Данные варианта сведены в табл.4.2.
Таблица 4.2
Варианты заданий
Номер варианта |
Адрес вершины стека |
Номер варианта |
Адрес вершины стека |
1 2 3 4 5 6 |
08С0 08В0 0910 0950 09А0 0А00 |
7 8 9 10 11 12 |
0А40 0АВ0 0В00 0В20 0В60 0ВА0 |
Задание для выполнения в лаборатории
1. Ввести в микроЭВМ разработанную. подпрограмму.
2. Осуществить пуск подпрограммы в автоматизированном режиме. Проверить правильность программы по результату.
3. Исследовать процесс выполнения программы по машинным циклам.
Содержание отчета
1) привести разработанную программу;
2) дать анализ выполнения программы.
Контрольные вопросы
Организация и назначение стека.
Как изменяется вершина стека при операциях с данными в стеке?
Каков порядок записи в стек данных при выполнении команды PUSH H, если (SP) = 9000, (H) = 12, (L) = 34 ?
Каков порядок извлечения из стека данных при выполнении команды POP H, если (SP) = 9000, (8FFE) = 12, (8FFF) = 34, (9000) = 56, (9001) = 78, (9002) = 9A ?
Каков порядок записи в стек данных при выполнении команды 0800 CALL 0850, если (SP) = 9000 ?
Лабораторная работа № 5 выполнение арифметических операций
Цель работы: изучение способов организации и исследование программы выполнения арифметических операций.
Теоретическая часть
Из двух способов определения чисел с фиксированной и плавающей точкой (запятой) первый получил наибольшее распространение при программировании МП КР580. Это связано с отсутствием специальных команд, позволяющих МП работать с числами с плавающей запятой. Число с фиксированной точкой можно представлять двоичным числом без знака, имеющим значения от 0 до 255 или как двоичное число со знаком от –127 до +127 . Отрицательное число представляется в дополнительном коде.
Выполнение арифметических операций сложения, вычитания, умножения, деления рассмотрим на примере соответствующих подпрограмм.
Рассмотрим подпрограмму сложения массива однобайтных чисел с получением двухбайтного результата - подпрограмма 5.1.
Слагаемые должны быть в последовательных адресах памяти. Входными параметрами подпрограммы АDD В являются адрес первого слагаемого, записанный в НL,и число слагаемых, записанное в регистре В. Выходным параметром программ MAIN является сумма, старший байт которой записан в регистре С, а младший - в аккумуляторе А.
МП КР 580ВМ80А имеет 8-ми разрядное АЛУ, поэтому операция сложения чисел с длиной машинного слова большей 8 должна проводиться по байтам, начиная с последних байтов. При этом сложение последних байтов можно проводить командой АDD, а старших байтов - командой АDС, которая учитывает состояние разряда С регистра признаков F - разряда переноса.
Сложение двухбайтовых данных можно легко осуществить с помощью команд DAD, LHLD, SHLD.Рассмотрим подпрограмму сложения двух двухбайтовых переменных XI и Х2. (подпрограмма 5.2).
Для выполнения вычитания 8-ми разрядных двоичных кодов МП имеет команды SUB, SUI, SBB, SBI.
В процессе формирования разности старших разрядов может возникнуть сигнал заема. Этот сигнал устанавливает в состояние 1 разряд С регистра признаков F.
Подпрограмма 5.1
Адрес |
Машин-ный код |
Метки |
Мнемокод |
Комментарий |
0800
0803
0605
0808 0809 080А 080В
080С
080D
0810
0811
0812
0813
0816 |
21 000В
06 05
СD 0908
76 AF 4F 86
FF
D2 1108
0С
23
05
С2 0В08
09 |
MAIN
АDDB
CNT
TRM
|
LXI H.0B00
MVI B, 05
CALL АDDB
HLT XRAA MOV C,A АDD M
RST 7
JNC TRM
INR С
INX Н
DCR B
JNZ CNT
RET |
Запись в регистровую пару адрес первого слагаемого Загрузка в регистр В количества слагаемых Вызов подпрограммы сложения АDDB Останов Очистить аккумулятор Очистить счетчик переносов Прибавить к содержимому аккумулятора число из массива Прервать выполнение программы Если переноса нет, то перейти к TRM Увеличить счетчик переносов нa 1 Указать адрес следующего слагаемого Уменьшить счетчик слагаемых Если не все слагаемые, то перейти к CNT
|
Подпрограмма 5.2
Метка |
Код |
Операнды |
Комментарий |
M1 |
LHLD
XGHG LHDL
DAD SHLD HLT |
XI
Х2
D Z1
|
Загрузить в пару HL первую переменную с адреса XI Обмен пар HL и DЕ Загрузить в пару HL вторую переменную с адреса Х2 XI + Х2 Записать результат по адресу Z1 Останов |
В подпрограмме 5.3 младшие байты чисел размещены в ячейках памяти, адресуемых содержимым регистровых пар D (уменьшаемое) и Н (вычитаемое). На место вычитаемого помещается результат. В регистр С предварительно заносится количество байтов в операндах.
Подпрограмма 5.3
Метка |
Код |
Операнды |
Комментарий |
М1 |
XRA LDАХ SВВ MOV INX
INX
DCR JNZ RET |
А S М М, А H
D
С Ml |
Очистка разряда С байт уменьшаемого в - А (А) = (А) – М(HL) - С байт результата - в память (HL) = (HL) + 1 (переход к новой ячейке) (DE) = (DЕ) + 1 (переход к новой ячейке) Уменьшить счетчик байтов на 1 Переход к Ml, если не 0 в счетчике Возврат к основной программе |
МП К580 выполняет только простейшие арифметические операции - сложение и вычитание. Для выполнения умножения и деления нужны специальные подпрограммы.
Существует несколько алгоритмов умножения. Простейший из них - последовательность сложений. Например: 25х3 = 25+25+25. Существенный недостаток этого алгоритма - значительная длительность процесса-вычисления. Второй алгоритм - умножение в столбец, основанное на последовательных сдвигах и суммировании. Отметим, что сдвиг возможен как влево, так и вправо. Например:
43 х 53 = 2279
x
x
+
+
00101011 00101011
00101011 00101011
+
+
+
+
001110000111 01000101111
00101011 00101011
0100011100111 0100011100111
Приведем алгоритм умножения при сдвиге влево.
1. Загружаем в счетчик числа циклов число N, соответствующее размерности операндов.
2. Обнуляем регистр-накопитель. Его разрядность 2N.
3. Анализируем младший (текущий) бит множителя. Если он равен нулю, то переходим к пункту 5.
4. Прибавляем множимое к регистру-накопителю.
5. Сдвигаем множимое влево на 1 разряд.
6. Сдвигаем множитель вправо на один разряд (младший бит теряется).
7.Уменьшаем счетчик числа циклов на единицу.
8. Переходим к пункту 3, если счетчик не равен нулю.
Алгоритм умножения при сдвиге вправо отличается от вышеприведенного тем, что в пункте 3 анализируется старший (текущий) бит множителя, в пункте 5 - множимое сдвигается вправо ( или результат влево), в пункте 6 множитель сдвигается влево (старший бит теряется).
Рассмотрим подпрограмму 5.4, реализующую умножение двух 8-ми разрядных чисел по первому алгоритму.
Подпрограмма 5.4
Адрес |
Машинный код |
Метка |
Мнемокод |
Комментарий |
0800
0803 0805 0806
0807 0808
080В 080С
080D 080Е 080 0810 0811
0812 0813 0814 0815
0816 |
01 00 00
2E 08 7А 1F
57 D2 0Е 08
78 83
47 78 1F 47 79
1F 4F 2D С2 05 08
С9 |
M1
M2
|
LXI B,0000
MVI L, 08 MOV A,D RAR
MOV D,A JNC М2
MOV A,B ADD E
MOV B,A MOV A,B RAR МОV В,А МOV А, С
RAR МОV С, А DСR L JNZ M1
RET |
Очистить содержание регистра-накопителя Счетчик циклов в регистре L Множитель - в А Сдвиг множителя вправо (младший бит в С) Возврат множителя из А в D Переход к М2, если младший бит равен 0 Старший байт накопителя в А Сложение множимого с накопителем Старший байт результата в В Старший байт накопителя в А Сдвиг (А) вправо Сдвинутый старший байт в В Младший байт накопителя – в А Сдвиг (А) вправо Сдвинутый младший байт в С Уменьшить счетчик на 1 Переход на MI, если в счетчике не нуль Возврат к основной программе |
В этой подпрограмме в регистр D предварительно загружается множитель, в регистр Е - множимое. Результат формируется в регистровой паре ВC. В регистре L организуется счетчик числа циклов. Команды MOV А,D ; RAR; МОV D,А сдвигают вправо множитель, тем самым его младший (текущий) бит попадает в разряд С. Если он равен 1, то к регистру-накопителю прибавляется множимое - команды: МOV А,В; АDD Е; МОV В,А. В противном случае эти три команды пропускаются. В подпрограмме 5.4 содержимое регистра-накопителя сдвигается на один разряд вправо в каждом цикле, поэтому множимое прибавляется к старшему регистру в паре ВС. Возникающий при этом сигнал переполнения запоминается в С и при сдвиге пары ВС вправо занимает свое место - старший бит. Для сдвига вправо регистра ВС необходимы шесть команд – MOV A,B; RAR; MOV В,А; МОV А.С; RAR; MOV С,А. Команда DCR L уменьшает счетчик циклов на 1 и, если он не равен 0, команда JNZ M1 передает управление в начало цикла.
В подпрограмме 5.5 реализуется алгоритм умножения при сдвиге вправо. Здесь анализ разрядов множителя начинается со старшего бита.
Подпрограмма 5.5
Метка |
Код |
Операнд |
Комментарий |
M1
M2 |
MVI MVI
LXI XCHG DAD Н XCHG JNC
DAD
DCR RZ DAD JMP |
A, 08 B, 00
H, 0000
M2
B
A
H M1 |
Счетчик циклов в регистре А Очистка В (старший байт множимого) Очистка регистра-накопителя Восстановление НL, множитель в DЕ
Переход на М2, если Старший бит равен нулю Прибавление множимого к накопителю (Счетчик)=(счетчик) – I Возврат, если счетчик "0 Сдвиг накопителя влево Переход на MI |
Предварительно множимое загружается в регистр С, множитель - в регистр D. Результат будет подучен в регистровой паре НL. Первая команда организует счетчик числа циклов в регистре А. Затем обнуляются регистры B,H,L . Очистив регистр В, мы как бы получаем 8-ми разрядное множимое в регистровой паре ВC. В этом случае для прибавления множимого к регистру-накопителю НL можно использовать команду DAD В. Команда XCHG меняет местами содержимое регистровых пар НL и DE. Теперь в старшем байте пары НL находится множитель. Что находится в младшем байте - неважно. Команда DAD Н эквивалентна сдвигу влево на один разряд содержимого регистровой пары НL, т.е. множителя. Тем самым старший (текущий) разряд множителя попадает в разряд С регистр признаков. Если он равен единице, то множимое прибавляется к регистру-накопителю. Вторая команда – XCHG - восстанавливает исходное назначение регистровых пар НL и DE. Команда JNC M2 обеспечивает пропуск операции прибавления множимого к накопителю, если старший (текущий) разряд множителя равен нулю. Команда DCR A уменьшает счетчик числа циклов на единицу и, если он станет равным нулю, то выполняется возврат на подпрограммы (команда RZ). В противном случае, прежде чем перейти к новому циклу (команда JMR M1 ), нужно сдвинуть множимое вправо, либо результат - влево. Здесь выбрано второе (команда DAD Н).
Результатом операции деления является частное и остаток, существует несколько алгоритмов деления. Простейший из них -последовательность операций вычитания. Вычитание производится до тех пор, пока остаток не станет меньше делителя. В этом случае при вычитании сигнал заема для старшего разряда установит регистр признака С в единицу. Алгоритм деления следующий:
1) обнулить регистр для частного;
2) загрузить в регистр для остатка делимое;
3) вычитаем из остатка делитель;
4) если полученный остаток меньше делителя (признак С = 1), то переход к пункту 7;
5) увеличиваем частное на единицу;
6) перейти к пункту 3;
7) восстанавливаем остаток - прибавляем к остатку делитель.
Программа, реализующая данный алгоритм, приведена в подпрограмме 5.6.
Подпрограмма 5.6
Метка |
Код |
Операнд |
Комментарий |
М1
М2 |
MVI MOV SUB JC INR JMP ADD RET |
D , 00 A, B C M2 D M1 C |
Очистка регистра для частного Делимое в А Вычитание делителя из делимого Переход на М2. если признак С = 1 (частное) = (частное)+ 1 Переход на M1 Восстановление остатка Возврат к основной программе |
В подпрограмме 6 делимое находится в регистре В, делитель в С, частное - в D, остаток - в А.
Рассмотренный алгоритм .отличается простотой, но и невысоким быстродействием. Кроме того, время выполнения операции деления зависит от величины операндов. Поэтому на практике чаще применяются алгоритмы, основанные на операциях сдвига и вычитания. Один из таких алгоритмов поясним на следующем примере.
Рассматриваемый алгоритм осуществляет деление N - разрядного числа за N циклов. В каждом цикле выполняется одна операция вычитания. При этом, если вычитаемое больше уменьшаемого, то С = 1.
Алгоритм расчета следующий.
1. Загружаем в счетчик числа циклов число N , соответствующее разрядности операндов.
2. Вычитаем делитель из старшего бита (нескольких старших бит на последующих циклах) делимого (остатка).
3. Если С = 0, то старший (текущий) бит частного равен 1. Перейти к пункту 5.
4. Если С = 1, то старший (текущий) бит частного равен 0. Восстанавливаем делимое (остаток), прибавляя к остатку делитель.
5. Сдвигаем вправо на один разряд делитель (результат будет тот же, если сдвигать влево остаток).
6. Уменьшаем счетчик числа циклов на единицу.
7. Переходим к пункту 2, если счетчик не равен нулю.
В подпрограмме 5.7 приведена программа деления 8-ми разрядных двоичных кодов. Предварительно в регистр С загружается делимое, а в регистр D - делитель. Частное формируется в регистре Н, а остаток - в Е. Первая команда загружает в регистр Н число 00, а в регистр L - число 08. В регистре L организуем счетчик числа циклов. Вторая команда очищает регистр Е, в котором будет находиться остаток после каждой операции вычитания и окончательный остаток.
Подпрограмма 5.7
Метка |
Код |
Операнд |
Комментарий |
М1
М2
|
LXI MVI MOV RAL MOV MOV RAL SUB JNZ
ADD MOV CMC
MOV RAL MOV DCR JNZ RET |
H, 0008 E, 00 A, C
C, A A,E
D M2
D E, A
A, H
H, A
M1 |
Очистка Н, счетчик циклов в регистре L Очистка регистра для остатка Сдвиг делимого влево, старший бит делимого - в разряд С регистра признаков Сдвиг остатка влево В младший бит остатка (С) (остаток) = (остаток) -- (делитель) Переход на М2, если разряд признака С = 0 Восстановление остатка Остаток - в регистр Е Инверсия признака (С) – формирование бита частного Бит частного в регистр Н (счетчик)=(счетчик) – 1 Переход на Ml,если в счетчике на нуль Возврат к основной пpoгpaмме |
Теперь нужно из старшего бита (нескольких бит) делимого вычесть делитель. Для этого из регистра С (делимое) старший бит перемещаем в разряд признака С. Это делают команды MOV А,С; RAL; MOV С,А. На последующих циклах в разряд признака С будут попадать следующие по старшинству биты делимого. Далее посылаем в аккумулятор остаток из регистра Е (команда MOV A,E). Командой RAL сдвигаем остаток влево и помещаем на место младшего разряда содержимое разряда С. Команда SUB D вычитает из аккумулятора делитель. Новый остаток пока в аккумуляторе. Теперь проверяем новое значение разряда С. Если содержимое разряда С = 1, то прежде всего необходимо восстановить остаток - команда ADD D . Если С = 0, то команда АDD D пропускается. Команда MOV Е,А возвращает остаток в регистр Е. Следует обратить внимание, что после выполнения команды SUB D значение разряда признака С есть инверсия текущего бита результата (команда ADD в данном случае не меняет С = 1). Команда СMC инвертирует содержимое разряда признака С - получаем бит результата. Он "вдвигается" в регистр Н со стороны младшего разряда (команды МОV А,Н; RAL, MOV H,A). Команда DCR L и JNZ M1 завершают цикл.