МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет "Львівська політехніка"
ВИКОНАННЯ АРИФМЕТИЧНИХ ОПЕРАЦІЙ І
ФУНКЦІОНАЛЬНИХ ПЕРЕТВОРЕНЬ
ІНСТРУКЦІЯ
ДО ЛАБОРАТОРНОЇ РОБОТИ № 4 З КУРСУ
"МІКРОПРОЦЕСОРНІ ПРИСТРОЇ"
для студентів базового напряму 6.160100
“Інформаційна безпека”
Затверджено
на засіданні кафедри
"Автоматика та телемеханіка"
Протокол №6 від 30.11.1999р.
ЛЬВІВ 2006
Виконання арифметичних операцій і функціональних перетворень. Інструкція до лабораторної роботи № 4 з курсу "Мікропроцесорні пристрої" для студентів базового напряму 6.160100 “Інформаційна безпека”. /Укл. І. М. Бучма, А. Й. Наконечний.- Львів: НУЛП, 2006.- 13 с.
Укладачі: І. М. Бучма, канд. техн. наук, доц.,
А. Й. Наконечний, канд. техн. наук, доц.
Відповідальний за випуск І. М. Ковела, канд. техн. наук, доц.
Рецензенти: З. Р. Мичуда, канд. техн. наук, доц.
М. В. Наконечний, канд. техн. наук, доц.
Мета роботи – вивчення способів організації підпрограм виконання арифметичних операцій; дослідити програми виконання арифметичних операцій і функціональних перетворень.
І. ТЕОРЕТИЧНІ ПОЛОЖЕННЯ
1.1. Виконання арифметичних операцій
Під час програмування мікроЕОМ на МП КР580ІК80А розповсюджений спосіб представлення чисел з фіксованою комою. Це пов’язано з відсутністю спеціальних команд, які б дозволяли працювати на МП КР580ІК80А з числами з плаваючою комою.
Двійкове 8-розрядне число з фіксованою комою можна інтерпретувати наступним чином:
а) як число зі знаком в доповняльному коді. Старший біт числа при цьому вважається знаковим і кодується 0 для додатних чисел і 1 – для від’ємних. Решта сім розрядів вказують величину числа. Діапазон зміни чисел становить +127…-128:
+12710 = 0111 11112 = 7F16
010 = 0000 00002 = 0016
-12710 = 1111 11112 = FF16
-12810 = 1000 00002 = 8016
б) як ціле додатне число без знаку в прямому коді. В цьому випадку числа змінюються в діапазоні від 0 до 255:
010 = 0000 00002 = 0016
+25510 = 1111 11112 = FF16
в) як дворозрядне число в двійково-десятковому – BINARY-CODED-DECIMAL (BCD). При цьому кожен байт розглядається як два пів байти – дві тетради, кожна з яких кодує десяткову цифру. Старші розряди D7…D4 визначають старший двійково-десятковий розряд, а молодші D3…D0 – молодший. Діапазон зміни числа від 0 до 99:
010 = 0000 00002 = 0016
+9910 = 1001 10012 = 9916
Виконання арифметичних операцій додавання, віднімання, множення, ділення, обчислення спеціальних функцій розглянемо на прикладах відповідних програм.
1.2.1. Додавання і віднімання чисел
Розглянемо програму 1 додавання масиву однобайтних чисел з отриманням двобайтового результату (програма 1 – MAIN). Доданки повинні бути розташовані в послідовних адресах пам’яті. Програма використовує підпрограму ADDB, вхідними параметрами якої є адреса першого доданку 8300, записана в парі HL, і число доданків 05, записане в регістрі В. Вихідний параметр програми MAIN – сума, старший байт якої записаний в регістрі D, а молодший – в регістрі Е.
Алгоритм програми додавання полягає в тому, що після додавання кожного елементу масиву визначається переповнення акумулятора (розряд С=1), і якщо це має місце, то вміст регістра D збільшується на 1. Таким чином, за рахунок сумування одиниць переносу одержується старший байт. Схема алгоритму підпрограми додавання масиву однобайтних чисел зображена на рис. 1.
Рис. 1. Схема алгоритму додавання масиву однобайтових чисел
Програма 1
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8200
210083
MAIN
LXI H, 8300
Записати в пару HL адресу першого доданку 8300.
8203
0605
MVI B, 05
Записати в регістр В кількість доданків.
8205
CD0982
CALL ADDB
Виклик підпрограми додавання.
8208
76
HLT
Зупинити виконання програми.
8209
AF
ADDB
XRA A
Очистити акумулятор.
820А
57
MOV D, A
Очистити лічильник переносів.
820В
86
CNT
ADD M
Додати до вмісту акумулятора число з масиву доданків.
820С
D21082
JNC TRM
Якщо переносу немає, то перейти на TRM.
820F
14
INR D
Збільшити вміст регістра D на 1.
8210
23
TRM
INX H
Вказати на наступну адресу доданку.
8211
05
DCR B
Зменшити вміст лічильника доданків.
8212
C20B82
JNZ CNT
Якщо не всі доданки, то перейти на CNT.
8215
5F
MOV E, A
Переслати молодший байт суми в регістр Е.
8216
C9
RET
Повернення з підпрограми.
МП може виконувати арифметичні операції з числами з подвійною і більше довжиною машинного слова. Так як МП КР580ІК80А має 8-розрядний АЛП, операції з такими числами повинні здійснюватись по байтам, починаючи з молодших байтів. Так, операція додавання чисел 17F5 + 3411 буде здійснюватися в наступному вигляді:
Старший байт Прапорець С Молодший байт Числа
00010111 11110101 175F
00110100 00010001 3411
1 1
01001100 00000110 4C06
Операція віднімання чисел 6F5C – 13C5 буде виконуватись в такому вигляді:
Старший байт Прапорець С Молодший байт Числа
01101111 01011100 6F5C
00010011 11000101 13C5
1 1
01011011 00000110 5B97
З приведених вище прикладів видно, що при додаванні (відніманні) молодших байтів чисел необхідно застосовувати команду ADD (SUB), а для додавання (віднімання) решти – команду ADC (SBB), яка буде враховувати стан прапорця С регістра ознак результату.
Розглянемо підпрограму 1, яка реалізує віднімання чисел, які мають однакову довжину. Вхідні параметри підпрограми: регістр С – довжина чисел в байтах; пара HL – адреса молодшого байту від’ємника; пара DE – адреса молодшого байту зменшуваного. Кожне число записується в послідовних адресах пам’яті, починаючи з молодших байтів. Результат заноситься в область пам’яті, відведеної під від’ємник.
Підпрограма 1
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8400
AF
SBN
XRA A
Очистити акумулятор і прапорець С.
8401
1A
CNT
LDAX D
Записати в акумулятор зменшуване.
8402
9E
SBB M
Відняти з вмісту акумулятора від’ємник.
8403
77
MOV M, A
Записати різницю на місце від’ємника.
8404
23
INX H
Вказати на наступний байт від’ємника.
8405
13
INX D
Вказати на наступний байт зменшуваного.
8406
0D
DCR C
Зменшити вміст лічильника довжини.
8407
C20184
JNC CNT
Якщо не останній (старший) байт, то перейти на CNT.
840А
C9
RET
Повернення.
Якщо була позика, то прапорець С регістра F встановиться в одиницю. Після виконання програми результат записаний на місці від’ємника (пара HL), а знак результату визначається по прапорцю С регістра F.
1.2.2. Множення чисел
Існує декілька алгоритмів множення чисел. В першому алгоритмі множення можна замінити багатократним додаванням, наприклад 14 * 3 = 14 + 14 + 14. Недолік алгоритму – значна тривалість процесу обчислення. При другому алгоритмі множення здійснюється в стовпчик. Цей алгоритм застосовується також і для множення двійкових чисел, наприклад:
0110 = 610
0011 = 310
0110
0110
0000
0000
10010 = 1810
При обчислені результату за другим алгоритмом необхідно здійснювати багатократне сумування з зсувом вліво множеного при одночасній перевірці вмісту розрядів множника починаючи зі сторони його молодших розрядів. Якщо в черговому розряді множника записана одиниця, то множене додається до суми і зсувається вліво на один розряд, а якщо в розряді нуль, то відбудеться тільки зсув множеного. Зсув множеного можна замінити зсувом суми вправо. По цьому алгоритму (рис. 2) працює підпрограма 3 множення двох однобайтних чисел з отриманням двохбайтного результату. Початкова адреса підпрограми 8440. Вхідні параметри: D – множене; регістр Е – множник. Результат перемноження записується в регістрову пару B.
Рис. 2. Алгоритм множення однобайтних чисел
Підпрограма 2
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8440
010000
MPL
LXI B, 0000
Очистити вміст регістрів В, С.
8443
3E01
MVI A, 01
Завантажити в акумулятор вказівник розряду.
8445
A7
ANA A
Очистити прапорець С.
8446
F5
MPL1
PUSH PSW
Зберегти вказівник розряду в стеці.
8447
A3
ANA E
Перевірити вміст чергового розряду множника.
8448
78
MOV A, B
Завантажити в акумулятор старший байт суми.
8449
CA4D84
JZ MPL2
Якщо в черговому розряді нуль, то перейти на MPL2.
844C
82
ADD D
Якщо в черговому розряді 1, то додати множене до суми.
844D
1F
MPL2
RAR
Зсунути суму вправо (молодший біт С).
844E
47
MOV B, A
Зберегти вміст акумулятора в регістрі В.
844F
79
MOV A, C
Завантажити в акумулятор молодший байт суми.
8450
1F
RAR
Зсунути число в акумуляторі вправо (С старший біт).
8451
4F
MOV C, A
Зберегти вміст акумулятора в регістрі С.
8452
F1
POP PSW
Отримати зі стеку вказівник розряду.
8453
17
RAL
Вказати на наступний розряд.
8454
D24684
JNC MPL1
Якщо розряд не останній, перейти на MPL1.
8457
C9
RET
Повернення.
1.2.3. Ділення чисел
Ділення двійкових чисел, як і чисел, представлених в будь-якій іншій системі числення, базується на послідовному відніманні дільника з діленого і залишків від ділення. Проте двійкове ділення реалізується простіше, так як використання тільки двох цифр (0 і 1) виключає в кожному циклі ділення необхідність визначення числа дільників, які містяться в біжучому значені діленого або залишку (достатньо тільки порівняти їх).
Схема алгоритму програми ділення двох 8-розрядних чисел зображена на рис. 3. Програма DIVB використовує цей алгоритм (програма 2).
Вхідні параметри цієї програми – ділене (в регістрі Е) і дільник (в регістрі D), вихідні – частка (в регістрі Н) і залишок (в регістрі С).
Програма 2
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8480
210800
DIVB
LXI H, 0008
Завантажити лічильник бітів (регістр L), і очистити регістр частки H.
8483
0E00
MVI C, 00
Очистити регістр проміжного діленого.
8485
7B
MXTB
MOV A, E
Завантажити ділене в акумулятор.
8486
17
RAL
Зсунути старший біт в розряд С.
8487
5F
MOV E, A
Повернути ділене в регістр Е.
8488
79
MOV A, C
Завантажити в акумулятор проміжне ділене з регістру С.
8489
17
RAL
Зсунути розряд С в молодший біт.
848A
92
SUB D
Відняти з вмісту акумулятора дільник.
848B
D28F84
JNC NOADD
Якщо С=0, то перейти на NOADD.
848E
82
ADD D
Якщо С=1, відновити вміст акумулятора.
848F
4F
NOADD
MOV C, A
Повернути проміжне ділене в акумулятор.
8490
3F
CMC
Інвертувати розряд С.
8491
7C
MOV A, H
Завантажити в акумулятор частку з регістру Н.
8492
17
RAL
Зсунути розряд С в молодший біт регістра частки.
8493
67
MOV H, A
Переслати частку в регістр Н.
8494
2D
DCR L
Зменшити на 1 вміст лічильника бітів (регістр L).
8495
C28584
JNZ MXTB
Якщо вміст регістра L не рівний 0, продовжувати.
8498
76
HLT
Зупин.
Рис. 3. Схема алгоритму програми ділення двох 8-розрядних чисел
1.2.4. Обчислення спеціальних функцій
Для обчислення спеціальних функцій (наприклад, Х2) застосовуються спеціальні алгоритми.
Для обчислення функції Х2 можна застосувати алгоритм, оснований на тому, що квадрат числа можна найти додаванням послідовності непарних чисел.
Число Сума непарних чисел Результат
1 1 = 1
2 1+3 = 22
3 1+3+5 = 32
4 1+3+5+7 = 42
5 1+3+5+7+9 = 52
З наведеного прикладу видно наступне: яке число потрібно піднести до квадрату, таку ж кількість послідовних непарних чисел, починаючи з 1, потрібно додати.
Обчислення функції Х2 за наведеним алгоритмом займає багато часу. Тому якщо ставляться жорсткі вимоги по швидкодії і точності, застосовується обчислення функцій з допомогою таблиць. Розглянемо застосування цього методу на прикладі обчислення квадрату числа Х (програма 3). Програма 3 (SQ) визначає квадрат чисел від 0 до 10 включно. Вхідний параметр програми – число Х – записується в регістр L, вихідний параметр – значення Х2 – в регістр Н.
Програма 3
Адреса
Машинний код
Мітка
Мнемокод
Коментар
8500
2600
SQ
MVI H, 00
Очистити регістр Н.
8502
110086
LXI D, 8600
Завантажити початкову адресу таблиці.
8505
19
DAD D
Отримати адресу елементу.
8506
66
MOV H, M
Завантажити елемент в регістр Н.
8507
76
HLT
Зупин.
8600
00
SQTB
00
Таблиця квадратів чисел
8601
01
01
8602
04
04
8603
09
09
8604
19
19
8605
24
24
8606
31
31
8607
40
40
8608
51
51
8609
64
64
860А
2. Завдання
2.1. Завдання для домашньої підготовки:
2.1. Вивчити підпрограми 1-2 і програми 1-3. Розглянути результати виконання програм на конкретних числових прикладах.
2.2. Розробити програму додавання двох 8 розрядних чисел з отриманням результату в двійково-десятковому коді.
2.2. Виконати в лабораторії
2.2.1. Дослідити програму 1 додавання однобайтних чисел з отриманням двохбайтного результату.
2.2.2. Дослідити підпрограму 2 віднімання двох чисел, які мають однакову довжину.
2.2.3. Дослідити підпрограму 3 множення двох 8-розрядних чисел з отриманням 16-розрядного результату.
2.2.4. Дослідити програму 2 ділення двох 8-розрядних чисел.
2.2.5. Дослідити програму 3 обчислення квадрату числа з допомогою таблиці.
2.2.6. Дослідити розроблену при домашній підготовці програму додавання двох 8-розрядних чисел з отриманням результату в двійково-десятковому коді.
3. Зміст звіту
1) Повний перелік арифметичних команд.
2) Програма додавання двох 8-розрядних чисел з отриманням результату в двійково-десятковому коді, розробленої в п. 2.
3) Програми 1-3 і підпрограми 1-2, досліджені в п. 2.2.1-2.2.5 з результатами виконання арифметичних операцій.
4) Порівняльний аналіз отриманих результатів з очікуваними.
5) Висновки по роботі.
4. Контрольні запитання
1. Які команди арифметичних операцій може виконувати МП КР580ІК80А.
2. На чому базується алгоритм роботи підпрограми 2 множення чисел?
3. На чому базується алгоритм роботи програми 3 ділення чисел?
4. Переваги обчислення функцій заданих у вигляді таблиці ?
5. Представте числа від 0 до 20 в двійково-десятковому коді.
6. Як можна інтерпретувати 8-розрядне число з фіксованою комою?
7. Дії, які виконуються будь-якою командою програм 1-3 і підпрограм 1-2. Навіщо ці дії необхідні ?
Література
1. Горбунов В.Л., Панфилов Д. И. Микропроцессоры. Лабораторный практикум.-М.: Высшая школа.-1984.-с.103.
2. Самофалов К. Г. , Викторов О. В., Кузняк А. К. Микропроцессоры. - К.: Техніка, 1986. - 278с.
3. Циделко В. Д., Нагаец Н. В., Хохлов Ю. В. и др. Проектирование микропроцессорных измерительных приборов и систем. – К.: Техника, 1984. – 215 с.
4. Коффрон Дж. Технические средства микропроцессорных систем. - М.: Мир, 1983. - 344с.
5. Каган Б.М., Сташин В.В. Основы проектирования микропроцессорных устройств автоматики. - М.: Энергоатомиздат. - 1983. - с.304.
Навчальне видання
ВИКОНАННЯ АРИФМЕТИЧНИХ ОПЕРАЦІЙ І
ФУНКЦІОНАЛЬНИХ ПЕРЕТВОРЕНЬ
Інструкція
до лабораторної роботи № 4
з курсу
"МІКРОПРОЦЕСОРНІ ПРИСТРОЇ"
для студентів базового напряму 6.160100
“Інформаційна безпека”