Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Лабораторная работа МП-3 - файл МП-3.doc


Лабораторная работа МП-3
скачать (66.1 kb.)

Доступные файлы (1):

МП-3.doc337kb.30.10.1999 01:07скачать

содержание

МП-3.doc

Лабораторная работа МП-3

Программирование арифметических операций

в системе команд микропроцессора КР580ВМ80
1. Цель работы: Изучение приёмов программирования арифметических

операций.


2. Основные теоретические сведения.
Из арифметических операций микропроцессор (МП) выполняет только сложение и вычитание над байтами в двоичном и двоично-десятичном формате.

Операции умножения и деления, а также операции с другими форматами данных реализуются с помощью подпрограмм. Операнды представляются в формате с фиксированной запятой. В арифметических операциях адресуются только один операнд, второй операнд находится в аккумуляторе, а результат арифметической операции загружается в аккумулятор , а в соответствии с полученным результатом устанавливаются признаки S,Z,C,P в регистре признаков. При этом надо помнить, что при выполнении арифметических операций данные находятся в аккумуляторе, “разрушаются”, за исключением операций сравнения, при которых оба операнда не изменяются, а лишь происходит установка битов регистра признаков.

Арифметические операции выполняются с помощью команд сложения ADD и вычитания SUB над однобайтными числами. При сложении (вычитании) чисел формата более одного байта вначале складываются (вычитаются) их младшие байты с помощью команд сложения с переносом, вычитанием с заёмом ADD (SBB) . Затем та же операция проводится над старшими байтами, в которых автоматически учитывается перенос (заём) из младшего байта , если он имел место.

Также в системе команд МП имеются команды сложения двухбайтных слов DAD rp (HL+rp - HL),при этом суммируется содержимое регистра HL с содержимым регистровой пары rp (BC,DE,HL,SP), а результат заносится в регистр HL и устанавливается бит переноса.

При сложении чисел, представленных в двоично-десятичном коде после каждой однобайтной операции сложения необходимо выполнить операцию десятичной коррекции аккумулятора DAA. Однако неоходимо помнить , что команда DAA не может быть использована для коррекции результата над двоично-десятичными числами как над простыми двоичными числами. Вычитание двоично-десятичных чисел обычно заменяется сложением вычитаемого, представленного в коде дополнения до 10n, где n – число десятичных разрядов вычитаемого. Например, 85-33=85+(100-33)=85+((99-33)+1) =85+67=52, при этом перенос, возникающий в n+1 разряд не учитывается.
^ 3. Приёмы программирования типовых арифметических задач.


    1. Многобайтные сложение и вычитание.

В таких задачах используются команды сложения и вычитания с переносом и заёмом чисел произвольной длины без знака.
Рассмотрим сложение двух трёхбайтных чисел:

32AF8A

+

84BA90

________

B76A1A
Это сложение можно выполнить путем сложения двух младших байтов слагаемых, затем результирующий перенос прибавляют к старшим байтам и т. д.:

32=00110010 AF=10101111 8A=10001010

+ + +

84=10000100 BA=10111010 90=10010000

1 1

____________ ____________ ____________

B7=10110111 6A=01101010 1A=00011010




C=1 C=1
Приведённая далее программа MADD выполняет многобайтное сложение при следующих условиях:

- в регистре Е находится длина каждого слагаемого (единица длины - байт), в

данном примере равна 3;

- слагаемые хранятся в памяти , начиная с младших байт по адресам FIRST1 и FIRST2 соответственно;

-результат будет накапливаться от байта младшего разряда до байта старшего разряда с началом в ячейке памяти FIRST1,заменяя первоначальное содержимое этих ячеек.

8A

84



^ FIRST1: FIRST1


AF

6A


32

B7








90

90

^ FIRST2: FIRST2


BA

BA


84

1A





MADD: LXI B, FIRST1 ; адрес 1-го слагаемого

LXI H, FIRST2 ; адрес 2-го слагаемого

XRA A ; очистка бита переноса

MVI E,N ; длина слагаемого в байтах в регистре Е

LOOP: LDAX B ; байт 1-го слагаемого в (А)

ADC M ; сложение с байтом 2-го слагаемого

STAX B ; хранение результата по адресу слагаемого

INX B ; адрес

INX H ; адрес

DCRE ; если счетчик не равен нулю, то

JNZ LOOP ; переход к сложению старших байт

RET ; иначе конец.
Поскольку ни одна из команд в программном цикле, за исключением ADC, не влияет на бит переноса , то сложение с переносом будет продолжаться правильно.


^ 3.2. Десятичное сложение.

Любую четырёх битовую величину данных можно рассматривать как десятичную цифру от 0 до 9, если не содержит комбинации, соответствующие шестнадцатеричным цифрам от A до F. Десятичное сложение выполняется при допущении , что каждый байт содержит две четырехбитовые десятичные цифры.

Байты суммируются в аккумуляторе стандартным способом, а команда DAA(десятичная коррекция А) применяется затем для преобразования 8-битного результата в правильное представление двух десятичных цифр. Установка битов переноса влияет на операцию DAA, что даёт возможность складывать многоразрядные числа.

Рассмотрим подробнее процесс выполнения команды DAA. Эта команда преобразует в аккумуляторе 8-битное двоичное число в две четырёхбитные двоично-кодированные десятичные цифры (в коде BCD). Это происходит с учётом следующих правил:

  1. Если младшие 4 бита содержимого аккумулятора представляют число >9 или бит вспомогательного переноса установлен, то содержимое аккумулятора увеличивается на 6. В противном случае содержимое аккумулятора не изменяется.

  2. Если после первого действия старшие 4 бита содержимого аккумулятора представляют число > 9 или установлен, бит переноса, то старшие 4 бита инкрементируются на 6. В противном случае содержимое аккумулятора не изменяется.


Пример. Пусть необходимо сложить два десятичных числа:

2985

4936

7921

Для этого в программе необходимо выполнить следующее.

  1. Сбросить бит переноса и сложить младшие байты (это будет соответствовать сложению двух младших десятичных цифр).

85=10000101

36=00110110

перенос=0

10111011

С=0

Вспомогательный пернос =0


  1. Выполнить команду DAA.

Поскольку первые 4 бита >9, то будет прибавлено 6 к содержимому аккумулятора:

(А)=10111011

6 = 0110

21= 00100001

перенос С=1
3. Аккумулятор содержит теперь число 21. Складываем теперь две следующие цифры:

29=00101001

49=01001001

перенос=1

01110011

С=0

АС=1
4. Выполняем команду DAA.

Т.к. бит вспомогательного переноса АС установлен, то 6 будет прибавлено к аккумулятору:

(А)=01110011

6 = 0110

79= 01111001

С=0
Т.к. левые 4 бита < 9, а бит переноса сброшен, то никаких дальнейших действий не происходит. Таким образом, правильный десятичный результат равен 7921.

Для сложения десятичных чисел вполне подходит подпрограмма для сложения многобайтных чисел (MADD). Требуется только ввести команду DAA после команды ADCM. Каждая итерация программного цикла в такой подпрограмме будет складывать по 2 десятичные цифры.
3.3. Умножение.

Умножение двух 8-битных чисел без знака может быть выполнена несколькими способами. Например, путём повторного сложения либо применения операции регистрового сдвига.

Повторное сложение обеспечивает простейшую, но самую медленную форму умножения. Например, произведение 20Н*30АН может быть получена путём прибавления 20Н к аккумулятору (предварительно обнулённому) 3А раз.

Используя операцию сдвига, можно получить более быстрое умножение. Отметим ещё особенность умножения двоичных чисел:

011=3

110=6

000

011

011

10010=18

При умножении множителя на соответствующий разряд множителя будет получен либо множитель, либо нуль.

Итак, алгоритм умножения будет включать в себя следующие операции:

  1. Проверка бита множителя, начиная с младшего разряда; если 1, то прибавить множимое к старшему байту промежуточного результата (при проверке самого младшего бита множителя значение промежуточного результата равно нулю); если бит множителя равен нулю, то переход к пункту 2;

  2. Сдвиг всего 2-байтового промежуточного результата вправо на 1 бит.

Повторение пунктов 1 и 2, необходимо производить до тех пор, пока не будут проверены все восемь бит множителя.

Далее приведена подпрограмма умножения MULT, обеспечивающая выполнение рассмотренного алгоритма, с учётом следующих начальных условий:

 регистр В содержит старший байт результата умножения (промежуточного и окончательного);

 регистр С перед началом подпрограммы содержит множитель, а по завершению  младший байт результата умножения;

  • регистр D содержит множимое.



Сдвиг 16-битного промежуточного результата выполняется двумя командами RAR по следующей схеме:
В начале сдвиг регистра С
7 0 7 0


B

C

C




Затем сдвиг регистра В
7 0 7 0


B

C

C







MULT: MVI B,0 ; обнуление старшего байта результата

MVI E,9 ; установка счётчика бит

MULT0: MOV A,C ; множитель в аккумулятор

RAR ; сдвиг множителя младшего байта результата

MOV C,A ; хранение результата

DCR E ; счётчик равен 0?

JZ DONE ; если да, то конец

MOV A,B ; иначе старший байт результатаА

JNC MULT1 ; младший бит множителя =0? Если да, то переход по MULT1

ADD D ; прибавление множимого к старшему байту результата

MULT1: RAR ; сдвиг старшего байта результата

MOV B,A ; хранение старшего байта результата

JMP MULT0 ; цикл

^ DONE: RET
Рассмотрим пример выполнения подпрограммы MULT при умножении 2 чисел 2AH*3CH=9D8H

Исходное состояние: (B)=00000000 (старший байт результата);

(С)=00111100=СН (множитель, по окончании умножения  младший байт результата);

(D)=00101010=2AH (множимое).

Изменение содержимого регистров запишем в таблицу:




цикла

Операция

Содержимое (В)

Флаг С после 2 сдвига




(С)

Флаг с после 1 сдвига

1

ADD


RAR

00000000

00000000


0


00011110


0

2

ADD

RAR


00000000

00000000


0


00001111


0

3

ADD

RAR


00101010

00010101


0


00000111


1

4

ADD

RAR


00111111

00011111


1


00000011


1

5

ADD


RAR

01001001

00100100


1


10000001


1

6

ADD


RAR

01001110

00100111


0


11000000


1

7

ADD


RAR

00100111

00010011


1


01100000


0

8

ADD


RAR

00010011

00001001


1


10110000


0

9

ADD


RAR

00001001




11011000


0



0 9 D 8
^ 4. Порядок выполнения работы.

4.1. Разработать программу:

а) сложения двух двоичных 4-х байтовых чисел;

б) сложения двух десятичных чисел 153742 и 638440;

в) вычитание двух десятичных чисел 83 и51.
4.2. Разработать программы умножения двух чисел с составлением таблицы изменения содержимого регистров, участвующих в операции умножения, для каждого цикла.

Все разработанные программы записать в ОЗУ микроЭВМ, начиная с адреса 0800, отладить, получить результат.

^ 5. Содержание отчёта.

5.1. Краткие теоретические сведения.

5.2. Тексты программ в символическом и объектном кодах.

5.3. Результаты выполнения программ.
^ 6. Контрольные вопросы.

6.1. Какие команды арифметических операций предусмотрены в системе команд МП К580?

6.2. Для какой цели служит команда DAA и как она выполняется?

6.3. Как осуществить умножение на десять, не прибегая к подпрограмме умножения?

6.4. Можно ли корректировать результат вычитания, если да, то как?

6.5. Какой алгоритм работы подпрограмм умножения?

6.6. Оцените время выполнения подпрограммы умножения двух чисел.


Скачать файл (66.1 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации