МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт про виконання лабораторної роботи №5
на тему: “ ОПЕРАЦІЇ МНОЖЕННЯ ТА ДІЛЕННЯ ЦІЛИХ БЕЗЗНАКОВИХ І ЦІЛИХ ЗНАКОВИХ ЧИСЕЛ В ОДНОКРИСТАЛЬНОМУ МП КР580 ”
з курсу: “ Комп’ютери та мікропроцесорні системи ”
Виконав
студент групи КН-3
Львів - 2006
1. МЕТА РОБОТИ
Вивчити алгоритми виконання операцій множення та ділення цілих беззнакових і цілих знакових чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А), набути практичних навиків складання та налагоджування програм з використанням цих алгоритмів.
2. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Набір команд арифметичних операцій чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А) не має команди множення або ділення над двома операндами. Тому для реалізації прикладних задач, де необхідно виконати дані арифметичні дії, застосовуються алгоритми що використовують закладений набір команд у МП КР580ВМ80А.
2.1 Арифметична операція множення
Найпростіший алгоритм множення цілих двійкових чисел без знака полягає у накопиченні множеного, яке виконується m раз, де m - значення множника. Якщо, наприклад, 8-бітний множник знаходиться в акумуляторі, 8-бітне множене - в регістрі С, а регістри B,Н і L-очищені, тоді подальша програма формує 16-бітний добуток в регістровій парі Н L :
MULT_1: DCR A ; Декремент множника
JZ EXIT ; Вихід на кінець програми
DAD B ; Накопичення множеного
JMP MULT_1 ; Повторювати до завершення
EXIT: HLT ; Кінець роботи програми.
Основний недолік безпосереднього накопичення множника або множеного, що робить його непрактичним, полягагє в недостатньо високій швидкодії виконання операції множення.
Більш поширений спосіб грунтується на аналізі розрядів множника представленого у двійковій формі запису з подальшим накопиченням множеного і зсувам проміжних результатів суми або множника. Даний алгоритм ефективніший в порівнянні з безпосереднім накопиченням завдяки можливому зменшенні кількості додавань. Наприклад, а) безпосереднє множення цілих знакових чисел (+3)*(+5), б) множення цілих знакових чисел (-3)*(+5) без накопичення нульових часткових добутків:
а) 0011 (+3) б) 1101 (-3)
* 0101 *(+5) * 0101 *(+5)
0011 1101
0000 1101
0011 10 0 0 0 1
0000 (-15 в доповнюючому коді)
0001111
Алгоритм множення без накопичення нульових часткових добутків реалізується циклічним процесом, на кожному кроці якого:
- аналізується черговий біт множника;
- в залежності від його значення відбувається додавання множеного до попередньої суми (біт=1) або не відбувається (біт=0) відбувається додавання множеного до попередньої суми часткових добутків.
- відбувається зміна взаємного положення множеного і суми.
Добуток n - бітних співмножників має довжину не більше 2n біт. Існують різноманітні варіанти реалізації даного способу, які визначаються тим, починаючи з яких цифр (розрядів) старших чи молодших аналізується множник, і що зсувається - множене чи сума часткових добутків. Наприклад,
а) множення (+5)*(+3) без додавання часткових добутків, починаючи з старших розрядів множника, б) множення (-5)*(+3) без додавання часткових добутків, використовуючи зсув суми часткових добутків починаючи з молодших розрядів множника:
а) 0101 (+5) б) (-5)*(+3) =(1011)*(0011)
* 0011 (+3)
0101 00000000 ; початкова сума
0101 +1011 ; (1)
0001111 10110000 ; зсув суми добутків
11011000
+ 1011 ; (1)
110001000 ; зсув суми добутків
11000100 ; зсув (0)
11100010 ; зсув (0)
Результат операції множення: (91) 11110001
Використання набору арифметико-логічних команд МП КР580ВМ80А ефективно для реалізації алгоритму множення, в якому множене або сума часткових добутків зсуваються вліво. Зсув вправо і 8-розрядне додавання виконуються тільки в акумуляторі А, а використання команди DAD RP виконує 16-розрядне додавання і її форма DAD H еквівалентна зсуву 16-бітного вмісту реістрової пари HL вліво на один біт з передачею старшого біта в прапорець перенесення.
Наведені алгоритми виконують операцію множення для цілих беззнакових чисел. Коли співмножники представлені в доповнюючому коді, тобто маєм виконати добуток над знаковими цілими числами, тоді формально виконання операції множення полягає в реалізації такого правила:
- за знаками співмножників утворити і тимчасово зберегти знак добутку;
- утворити абсолютні значення співмножників і перемножити їх ;
- з врахуванням знака добутку представити результат у доповнюючому коді.
Однак, на практиці застосовують спеціальні алгоритми множення знакових чисел. Так, спосіб знакового множення вимагає, щоб множник завжди був додатній. Тоді, в залежності від набору знаків множеного і множника: (+)*(+)=(+) ; множник додатній
(-)*(+)=(-) ; множник додатній
(+)*(-)=(-) ;множник від'ємний
(-)*(-)=(+) ; множник від'ємний
виконуєм перетворення множеного і множника у випадках в), г) у доповнюючий код для одержання додатнього множника. Виконання алгоритму знакового множення розглянемо на конкретному прикладі (-13)*(+7):
10011
* 00111 ; починаєм з молодших розрядів
0000000000 ; початкова сума
+10011
1001100000 ; зсув суми добутків після кожного додавання
1100110000
+10011
10110010000 ; зсув суми добутків після кожного додавання
1011001000
+10011
10100101000 ; зсув суми добутків після кожного додавання
1010010100 ; зсув без додавання нульовий біт множника
1101001010 ; зсув без додавання нульовий біт множника
1110100101 ; добуток в доповнюючому коді рівнний 91.
Найбільш поширеним і ефективним при реалізації множення цілих знакових чисел є алгоритм Бута (Booth's Algorithm). В ньому не враховується значення знаків множеного і множника. В основу визначення добутку покладено правила аналізу переходів від одного розряду множника до наступного, при цьому якщо біти змінюються:
- з 0 на 1 виконуєм віднімання множеного від попередньої суми (додаєм,
перетворивши множене в доповнюючий код);
- з 1 на 0 виконуєм додавання множеного (в даному коді) до попередньої
суми.
- з 0 на 0 виконуєм зсув вправо з врахуванням вмісту старшого розряду;
- з 1 на 1 виконуєм зсув вправо з врахуванням вмісту старшого розряду.
Наприклад, 11101 (-3) 1101 (-3)
* 00101 * (+5) *1011 * (-5)
(-15) (+15)
0000000000 0 0101 0 00000000 1011 0
+00011 (0,1) +0011 (0,1)
0001100000 ; зсув суми 00110000 ; зсув суми
0000110000 00011000 (1,1)
+11101 (1,0) 00001100
1111010000 ; зсув суми +1101 (1,0)
1111101000 11011100 ; зсув суми
+00011 (0,1) 11101110
0001001000 ; зсув суми +0011 (0,1)
0000100100 100011110 ; зсув суми
+11101 (1,0) 00001111 ; результат
1111000100 ; зсув суми
1111100010 ; зсув суми
1111110001 ; результат (-15)
Після кожного додавання/віднімання проводим зсув часткової суми на один розряд вправо з врахуванням її значення старшого розряду. Тобто, якщо в старшому розряді біт рівний 0 або 1, то при зсуві вправо в старший розряд записується відповідно аналогічний біт.
2.2 Арифметична операція ділення
Операція ділення обернена по відношенню до операції множення і реалізується подібними циклічними діями. Позначимо через X-ділене, Y-дільник і Z=X/Y - частка, вважаючи їх цілими беззнаковивми числами. При діленні цілих чисел прийнято як додатковий результат формувати ще й залишок R. Для операцій ділення є характерним випадок ділення на нуль (Y=0).
Найпростіший безпосередній спосіб ділення цілих двійкових чисел без знака полягає у відніманні дільника від діленого з накопиченням доки отриманий залишок буде менший дільника (Y>R). Наприклад, 8-бітне ділене знаходиться в регістрі В, 8-бітний дільник у регістрі D регістр H і C очищені, програма формує 8-бітну частку у регістрі C і залишок в регістрі А:
DIV_1: MOV A, D
CPI 0h
JNZ DIV
MVI H, EEh
JMP END
DIV: MOV A,B
CYCLE: SUB D
JC L1
INC C
JMP CYCLE
L1: ADD D
END: HLT
Основний недолік способу безпосереднього діленяя, який робить його непрактичним, полягає в недостатньо високій швидкодії програми.
Простіший варіант виконується за правилом віднімання -зсув. Оскільки частку можна отримати тільки починаючи зі старших розрядів, то можливі випадки використання - зі зсувом залишка вліво і зі зсувом дільника вправою. Другий випадок на практиці не використовується через необхідність мати регістри частки і дільника подвійної довжини.
При діленні цілих чисел отримують частку і залишок також у вигляді цілих чисел, причому знак залишку співпадає зі знаком діленого. Коли ділене і дільник представлеені в доповнюючому коді (від'ємні числа), то стандартний прийом виконання операції ділення вимагає:
- по знакових бітах діленого і дільника утворити і тимчасово зберегти знак частки Z =X Y і залишку R;
- утворити абсолютні значення діленого і дільника і виконати алгоритм ділення;
- з врахуванням знаків частки Z і залишку R представити, при необхідності, результат в доповнюючому коді.
Найбільшого застосування знайшли алгоритми ділення з відновленням і без відновлення залишку. Процес ділення за алгоритмом з відновленням залишку виконує циклічно повторювану послідовність дій. В першому повторені циклу - ділене, а в наступних повтореннях циклу - залишок зсуваються на один розряд вліво і після цього з нього віднімається дільник. У випадку, одержаного нового залишку, як додатнє число, то в черговий розряд частки (починаючи зі старшого розряду) записується одиниця (1), в протилежному випадку - в розряд частки записується нуль (0), а до залишку дадається дільник. Тобто, відновлюється попередній зсунутий залишок. Дії повторюються циклічно n раз (n - число розрядів дільника). В результаті отримуєм частку, а останній залишок буде результуючим залишком операції ділення.
Алгоритми ділення без відновлення залишку, при від'ємному залишку діленого і дільника, не додає дільник Y для відновлення одержаного залишку. Виключення в алгоритмі операції відновлення залишку зменшує час проходження циклів, однак необхідність в алгоритмі визначення типу належної виконанню операції (додавання або віднімання) нівелює цю перевагу. Крім цього, необхідно в алгоритмі виконувати віднімання при першому проходженні циклу і відновлення кінцевого залишку в останньому цикліпри формуванні частки, що потребує додаткових затрат. Тому при програмній реалізації алгоритму ділення для МПС рекомендують вибирати спосіб обчислення з відновленням залишку.
Ділення цілих знакових чисел організується складніше, ніж множення. ЦЕ пояснюється тим, що в залежності від знаків операндів і проміжнихї результатів, по-перше, окремі розряди частки необхідно формувати різними способами, а по-друге, дільник необхідно необхідно або віднімати від залишку діленого, або додавати до нього.
Тому рекомендують виконувати попереднє перетворення доповнюючих кодів операндів діленя в прямі коди і після одержання від'ємного результату формувати його прямий код.
Постановка лабораторного завдання
Занести в пам’ять послідовно числа 35, 10, 5, 12.Виконати попарно операцію множення способом зсувів (35*10, 5*12). Результат записати в пам’ять.
Текст програми
ORG 100H
LXI SP,1110H
MVI D, 35
MVI E,10
PUSH D
MVI B,5
MVI C,12
PUSH B
LDA 110FH
MOV E,A
LDA 110EH
CALL MUL
SHLD 1111H
LDA 110CH
MOV E,A
LDA 110DH
CALL MUL
SHLD 1114H
HLT
MUL: LXI H,0
MVI D,0
MVI C,8
Z1: DAD H
RLC
JNC Z2
DAD D
Z2: DCR C
JNZ Z1
RET
EMBED PBrush
EMBED PBrush
Висновки: виконавши дану лабораторну роботу, я вивчив способи множення та ділення чисел в МП КР 580.