Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра САПР
ЗВІТ
Лабораторна робота №5
з курсу «Архітектура комп’ютерів»
Тема:« ОПЕРАЦІЇ МНОЖЕННЯ ТА ДІЛЕННЯ ЦІЛИХ БЕЗЗНАКОВИХ І ЦІЛИХ ЗНАКОВИХ ЧИСЕЛ В ОДНОКРИСТАЛЬНОМУ МП КР580»
2008
Тема:
ОПЕРАЦІЇ МНОЖЕННЯ ТА ДІЛЕННЯ ЦІЛИХ БЕЗЗНАКОВИХ І ЦІЛИХ ЗНАКОВИХ ЧИСЕЛ В ОДНОКРИСТАЛЬНОМУ МП КР580.
Мета:
Вивчити алгоритми виконання операцій множення та ділення цілих беззнакових і цілих знакових чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А), набути практичних навиків складання та налагоджування програм з використанням цих алгоритмів.
Постановка завдання
Виконати операцію ділення над цілими без знаковими числами безпосередньо 23 : 3. Результат записати в SP.
Короткі теоретичні відомості
Набір команд арифметичних операцій чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А) не має команди множення або ділення над двома операндами. Тому для реалізації прикладних задач, де необхідно виконати дані арифметичні дії, застосовуються алгоритми що використовують закладений набір команд у МП КР580ВМ80А.
Арифметична операція ділення
Операція ділення обернена по відношенню до операції множення і реалізується подібними циклічними діями. Позначимо через 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
Основний недолік способу безпосереднього діленяя, який робить його непрактичним, полягає в недостатньо високій швидкодії програми.
Блок-схема
Покрокове виконання алгоритму
1. С>0? Якщо ні, то перехід на п. №7
2. Віднімаємо дільник
3. Залишок додатній? Якщо ні то перехід на п. №6
4. h=h+1
5. Перейти до п. № 2
6. Залишок у акумулятор a=a+c,
7. Вихід
Карта пам’яті
Адреса
Дані
Коментар
HEX
BIN
HEX
DEC
BIN
0200h
00000010
00000000
17
23
00010111
Початкове дане 23
0201h
00000010
00000001
14
20
00010100
23-3=20
0202h
00000010
00000010
11
17
00010001
20-3=17
0203h
00000010
00000011
0E
14
00001110
17-3=14
0204h
00000010
00000100
0B
11
00001011
14-3=11
0205h
00000010
00000101
08
8
00001000
11-3=8
0206h
00000010
00000110
05
5
00000101
8-3=5
0207h
00000010
00000111
02
2
00000010
5-3=2
0300h
00000011
00000000
02
2
00000010
Залишок результату
0301h
00000011
00000001
07
7
00000111
Ціла частина результату
Текст програми
Файл lab5.asm
org 100h
mvi b,23
mvi c,3
lxi h,0h
mov a,c
cpi 0h
jnz div
jmp recon
div: mov a,b
lxi d,200h
cycle: stax d
inr e
sub c
jc l1
inr h
jmp cycle
l1: add c
mov l,a
shld 300h
sphl
recon: nop
hlt
Файл lab5.prn
0100 ORG 100H
0100 0617 MVI B,23; B<-23
0102 0E03 MVI C,3; C<-3
0104 210000 LXI H,0H; h=0,l=0
0107 79 MOV A,C; A<-C
0108 FE00 CPI 0H; перевірка вмістимого акумулятора на 0
010A C21001 JNZ DIV; перехід на DIV, якщо не 0
010D C32401 JMP RECON; перехід на RECON, якщо 0
0110 78 DIV: MOV A,B; A<-B
0111 110002 LXI D,200H; вказуємо на початок розміщення результатів в пам'яті
0114 12 CYCLE: STAX D; вмістиме акумулятора записуємо в пам'ять
0115 1C INR E; збільшуємо адресу комірки пам'яті
0116 91 SUB C; A<-A-C
0117 DA1E01 JC L1; перехід на L1, якщо CY=1
011A 24 INR H; підрахунок повтору циклу
011B C31401 JMP CYCLE; безумовний перехід на початок циклу
011E 81 L1: ADD C; A<-A+C
011F 6F MOV L,A; L<-A
0120 220003 SHLD 300H; результат ділення записуємо в пам'ять
0123 F9 SPHL; SP<-((H)(L))
0124 00 RECON: NOP
Протокол роботи програми
C:[cpm] m lab5.asm
CP/M MACRO ASSEM 2.0
0126
000H USE FACTOR
END OF ASSEMBLY
C:[cpm] l lab5.asm
FIRST ADDRESS 0100
LAST ADDRESS 0125
BYTES READ 0026
RECORDS WRITTEN 01
C:[cpm] d lab5.com
DDT VERS 1.0
NEXT PC
0180 0100
-t23
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0000 S=0100 P=0100 MVI B,17
C0Z0M0E0I0 A=00 B=1700 D=0000 H=0000 S=0100 P=0102 MVI C,03
C0Z0M0E0I0 A=00 B=1703 D=0000 H=0000 S=0100 P=0104 LXI H,0000
C0Z0M0E0I0 A=00 B=1703 D=0000 H=0000 S=0100 P=0107 MOV A,C
C0Z0M0E0I0 A=03 B=1703 D=0000 H=0000 S=0100 P=0108 CPI 00
C0Z0M0E1I0 A=03 B=1703 D=0000 H=0000 S=0100 P=010A JNZ 0110
C0Z0M0E1I0 A=03 B=1703 D=0000 H=0000 S=0100 P=0110 MOV A,B
C0Z0M0E1I0 A=17 B=1703 D=0000 H=0000 S=0100 P=0111 LXI D,0200
C0Z0M0E1I0 A=17 B=1703 D=0200 H=0000 S=0100 P=0114 STAX D
C0Z0M0E1I0 A=17 B=1703 D=0200 H=0000 S=0100 P=0115 INR E
C0Z0M0E0I0 A=17 B=1703 D=0201 H=0000 S=0100 P=0116 SUB C
C0Z0M0E1I0 A=14 B=1703 D=0201 H=0000 S=0100 P=0117 JC 011E
C0Z0M0E1I0 A=14 B=1703 D=0201 H=0000 S=0100 P=011A INR H
C0Z0M0E0I0 A=14 B=1703 D=0201 H=0100 S=0100 P=011B JMP 0114
C0Z0M0E0I0 A=14 B=1703 D=0201 H=0100 S=0100 P=0114 STAX D
C0Z0M0E0I0 A=14 B=1703 D=0201 H=0100 S=0100 P=0115 INR E
C0Z0M0E0I0 A=14 B=1703 D=0202 H=0100 S=0100 P=0116 SUB C
C0Z0M0E1I0 A=11 B=1703 D=0202 H=0100 S=0100 P=0117 JC 011E
C0Z0M0E1I0 A=11 B=1703 D=0202 H=0100 S=0100 P=011A INR H
C0Z0M0E0I0 A=11 B=1703 D=0202 H=0200 S=0100 P=011B JMP 0114
C0Z0M0E0I0 A=11 B=1703 D=0202 H=0200 S=0100 P=0114 STAX D
C0Z0M0E0I0 A=11 B=1703 D=0202 H=0200 S=0100 P=0115 INR E
C0Z0M0E1I0 A=11 B=1703 D=0203 H=0200 S=0100 P=0116 SUB C
C0Z0M0E0I1 A=0E B=1703 D=0203 H=0200 S=0100 P=0117 JC 011E
C0Z0M0E0I1 A=0E B=1703 D=0203 H=0200 S=0100 P=011A INR H
C0Z0M0E1I0 A=0E B=1703 D=0203 H=0300 S=0100 P=011B JMP 0114
C0Z0M0E1I0 A=0E B=1703 D=0203 H=0300 S=0100 P=0114 STAX D
C0Z0M0E1I0 A=0E B=1703 D=0203 H=0300 S=0100 P=0115 INR E
C0Z0M0E0I0 A=0E B=1703 D=0204 H=0300 S=0100 P=0116 SUB C
C0Z0M0E0I0 A=0B B=1703 D=0204 H=0300 S=0100 P=0117 JC 011E
C0Z0M0E0I0 A=0B B=1703 D=0204 H=0300 S=0100 P=011A INR H
C0Z0M0E0I0 A=0B B=1703 D=0204 H=0400 S=0100 P=011B JMP 0114
C0Z0M0E0I0 A=0B B=1703 D=0204 H=0400 S=0100 P=0114 STAX D
C0Z0M0E0I0 A=0B B=1703 D=0204 H=0400 S=0100 P=0115 INR E
C0Z0M0E1I0 A=0B B=1703 D=0205 H=0400 S=0100 P=0116 SUB C*0117
-ta
C0Z0M0E0I0 A=08 B=1703 D=0205 H=0400 S=0100 P=0117 JC 011E
C0Z0M0E0I0 A=08 B=1703 D=0205 H=0400 S=0100 P=011A INR H
C0Z0M0E1I0 A=08 B=1703 D=0205 H=0500 S=0100 P=011B JMP 0114
C0Z0M0E1I0 A=08 B=1703 D=0205 H=0500 S=0100 P=0114 STAX D
C0Z0M0E1I0 A=08 B=1703 D=0205 H=0500 S=0100 P=0115 INR E
C0Z0M0E1I0 A=08 B=1703 D=0206 H=0500 S=0100 P=0116 SUB C
C0Z0M0E1I0 A=05 B=1703 D=0206 H=0500 S=0100 P=0117 JC 011E
C0Z0M0E1I0 A=05 B=1703 D=0206 H=0500 S=0100 P=011A INR H
C0Z0M0E1I0 A=05 B=1703 D=0206 H=0600 S=0100 P=011B JMP 0114
C0Z0M0E1I0 A=05 B=1703 D=0206 H=0600 S=0100 P=0114 STAX D*0115
-ta
C0Z0M0E1I0 A=05 B=1703 D=0206 H=0600 S=0100 P=0115 INR E
C0Z0M0E0I0 A=05 B=1703 D=0207 H=0600 S=0100 P=0116 SUB C
C0Z0M0E0I0 A=02 B=1703 D=0207 H=0600 S=0100 P=0117 JC 011E
C0Z0M0E0I0 A=02 B=1703 D=0207 H=0600 S=0100 P=011A INR H
C0Z0M0E0I0 A=02 B=1703 D=0207 H=0700 S=0100 P=011B JMP 0114
C0Z0M0E0I0 A=02 B=1703 D=0207 H=0700 S=0100 P=0114 STAX D
C0Z0M0E0I0 A=02 B=1703 D=0207 H=0700 S=0100 P=0115 INR E
C0Z0M0E0I0 A=02 B=1703 D=0208 H=0700 S=0100 P=0116 SUB C
C1Z0M1E1I1 A=FF B=1703 D=0208 H=0700 S=0100 P=0117 JC 011E
C1Z0M1E1I1 A=FF B=1703 D=0208 H=0700 S=0100 P=011E ADD C*011F
-t3
C1Z0M0E0I1 A=02 B=1703 D=0208 H=0700 S=0100 P=011F MOV L,A
C1Z0M0E0I1 A=02 B=1703 D=0208 H=0702 S=0100 P=0120 SHLD 0300
C1Z0M0E0I1 A=02 B=1703 D=0208 H=0702 S=0100 P=0123 SPHL *0124
-t
C1Z0M0E0I1 A=02 B=1703 D=0208 H=0702 S=0702 P=0124 NOP *0125
-d200,207
0200 17 14 11 0E 0B 08 05 02 ........
-d300,301
0300 02 07 ..
-t
C1Z0M0E0I1 A=02 B=1703 D=0208 H=0702 S=0702 P=0125 HLT
*Execution halted
Висновок:
На цій лабораторній роботі я вивчив алгоритми виконання операцій множення та ділення цілих беззнакових і цілих знакових чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А), набути практичних навиків складання та налагоджування програми з використанням алгоритму безпосереднього ділення без знакових цілих чисел.