
- •Робота з компілятором ср/м
- •Інструментальні засоби динамічного відлагодження програм
- •Програмні засоби організації програми
- •Текст програми
- •Результати виконання програми
- •Міністерство освіти та науки України Національний університет “Львівська політехніка” Інститут комп’ютерних наук та інформаційних технологій
- •Способи адресації операндів і команди пересилання даних однокристального мп кр580
- •Теоретичні відомості Способи адресації в мп кр580
- •2.2. Команди пересилання даних мп кр580
- •Наприклад :
- •2.3. Стек і команди роботи зі стеком в однокристальному мп кр580
- •Карта пам'яті
- •Текст програми
- •Результати виконання програми
- •Теоретичні відомості
- •2. Короткі теоретичні відомості
- •Карта пам'яті
- •Текст програми
- •Результати виконання програми
- •Теоретичні відомості
- •2. 6. С умова адреси - умовний виклик підпрограми.
- •2. 8. R умова - умовне повернення з підпрограми.
- •2. 10. Організація підпрограм.
- •Карта пам’яті Текст програми
- •Результати виконання програми:
- •Теоретичні відомості
- •Арифметична операція множення
- •Арифметична операція ділення
- •Словесний опис алгоритму
- •Приклад множення чисел
- •Запис початкових даних
- •Додання
- •Другого множника
- •Зсув першого множника
- •Результати виконання програми
- •Міністерство освіти та науки України Національний університет “Львівська політехніка” Інститут комп’ютерних наук та інформаційних технологій
- •Теоретичні відомості
- •Арифметична операція додавання чисел в bcd кодах
- •2.2 Арифметична операція віднімання чисел в bcd кодах
- •2.3 Арифметична операція додавання/віднімання знакових чисел в bcd кодах
- •Перетворення чисел двійково-десяткового формату в двійковий формат і з двійкового формату в bcd-коди.
- •Карта пам'яті
- •Код програми
- •Зміст файлу lr6.Prn
- •Результати виконання програми
- •Теоретичні відомості
- •Додавання та віднімання багаторозрядних чисел цілого типу
- •Множення та ділення багаторозрядних чисел цілого типу
- •Арифметичні операції над дійсними числами
- •3.1 Арифметичні операції над числами в форматі з фіксованою комою
- •Арифметичні операції над числами в форматі з плаваючою комою
- •Код програми
- •Зміст файлу lr7.Prn
- •Результати виконання програми
Теоретичні відомості
Набір команд арифметичних операцій чисел для однокристального мікропроцесора Intel 8080 (КР580ВМ80А) не має команди множення або ділення над двома операндами. Тому для реалізації прикладних задач, де необхідно виконати дані арифметичні дії, застосовуються алгоритми що використовують закладений набір команд у МП КР580ВМ80А.
Арифметична операція множення
Найпростіший алгоритм множення цілих двійкових чисел без знака полягає у накопиченні множеного, яке виконується 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, то при зсуві вправо в старший розряд записується відповідно аналогічний біт.