Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦП_ч.2_Лаб.W07.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.27 Mб
Скачать

3.4. Алгоритм

Послідовність дій, яку має виконати МК для досягнення потрібного результату, можна описати словами, але зручніше зобразити графічно у вигляді алгоритму. Тут з навчаль­ною метою наведемо коротко опис його бло­ків, позначених цифрами на блок-схемі алго­ритму (рис. 3). Після ініціалізації (1) в основ­ній програмі обчислюється значення функції в точці і (2), перевіряється знак результату (3) і, якщо він від'ємний, попередньо перетво­рюється до прямого коду (4) і записується знак числа мінус (5), а якщо додатний, запи­сується безпосередньо до ОЗП (6) без зміни знаку числа, який за умовчанням є плюс.

У лічильнику циклів проходження програми обчислень код зменшується на одиницю і, якщо не всі точки обчислено (7), відбувається перехід до початку основної програми (2), а по закінченні всіх обчислень здійснюється перехід до циклу завантаження даних в РЗП (8) з перевіркою, чи всі 8 чисел завантажено (9), після чого програма зупиняється (10).

3.5. Програма обчислення в одній точці

Програма обчислення результату містить команди (пронумеровано в дужках), серед яких є множення (1, 2, 4), добуток якого приміщується до регістрової пари R1:R0, і в прикладі для спрощення не виходить за межі регістра R0, тобто R1 = 0. Результат (6) виявляється записаним до регістра tmp і залежно від його знаку відбувається галуження програми. У разі від'ємного числа попередньо перетворюємо його з доповняльного до прямого коду, тобто обчислюємо його модуль (8) а в розряд регістра знаку sgn записуємо одиницю (9), наприклад, sgn <= sgn v msk = 0b0000 0000 v 0b1000 0000 = 0b1000 0000.

MAIN: ;******** ОСНОВНА (MAIN) ПРОГРАМА******************

(1) mul xi,xi ; Multiply unsigned - Множення беззнакове: R1:R0 <= xі*xі

(2) mul R0,A ; R1:R0 <= A*xі*xі (тут A*xі*xі вміщується в R0, тобто R1 = 0)

(3) mov tmp,R0 ; Copy register - Скопіювати регістр: tmp <= R0

(4) mul xi,B ; R1:R0 <= B*xі (R1 = 0)

(5) add tmp,R0 ; Add without carry - Додати без перенесення: tmp <= tmp + R0

(6) sub tmp,C ; Subtract without carry - Відняти без перенесення: tmp <= tmp - С

(7) brpl MEM ; Branch if plus - Перейти, якщо плюс (якщо прапор N=0), інакше

(8) neg tmp ; Two's complement - Виконати доповнення: tmp <= $00 - tmp

(9) or sgn,msk ; Logical OR - Логічне АБО: sgn <= sgn v msk, тобто приписати

; мінус цьому результату

3.6. Застосування зсувів і масок

Розглянемо запис знаків чисел до розрядів регістра R8 за допомогою регіс­тра маски R22. Після включення або скидання МК ці регістри, як і всі РЗП, скинуто до нульового стану (рис. 4,а) і програма починається з ініціалізації (п. 3.3), під час якої за допомогою команди АБО безпосередньо з константою записується одиниця до старшого розряду регістра маски R22 (рис. 4,б). Цю команду застосовано тут задля одноманітності операцій з маскою, але записати одиницю до старшого розряду можна також іншим чином. Виконайте цю опе­рацію одною командою: а) арифметичною, б) іншою логічною, в) передачі (завантаження) даних – див. таблиці команд у додатку.

По обчисленню функції в одній точці результат перебуватиме в регістрі tmp (п. 3.5, команда 6) і знак числа відображатиметься в прапорі N. Наприклад, у нашій програмі обчислення починаються з аргументу хі = 7, тому матимемо tmp = 127 = $7F = 0b0111 1111 (див. рис. 1,а) і нуль у знаковому розряді дублюється прапором N = 0. Командою brpl MEM (п. 3.5, команда 7) операції (8, 9) пропускаються, тому в старшому розряді регістра знаку R8 залишається нуль (плюс числа 127). Отже, у подальшій частині програми після позначки MEM потрібно це число записати до ОЗП, а маску підготувати для наступного числа. У нас це здійснюється шляхом циклічного зсуву праворуч через прапор перенесення С (рис. 4,в). По виконанні цієї команди всі розряди зсуваються по колу на один крок праворуч, тому в регістрі маски R22 одиниця пересунеться в розряд 6 (показано під рискою). Аби не зіпсувати маску, попередньо перед цією операцією команда clc очищує прапор С до нуля на випадок, якщо за деяких даних він буде встановлений.

Так само обчислюються інші точки функції і після кожної з них у регістрі маски R22 одиниця пересувається на один розряд праворуч. Якщо результат буде від'ємний, наприклад, у нашій програмі при аргументі хі = 4 матимемо tmp = $E6 = 0b1110 0110 (див. рис. 1,а), то виникає одиниця в знаковому розряді, яка дублюється прапором N = 1. Через це ігнорується перехід в команді brpl MEM (п. 3.5, команда 7) і виконуються наступні команди. Операцією доповнення (команда 8) переходимо до прямого коду з метою обчислити модуль числа: tmp = $00 - $E6 = $00 - 0b1110 0110 = 0b0001 1010 = $1А = 26, а логічною операцією АБО (команда 9) записуємо одиницю в розряд 4 регістра знаку R8 (рис. 4,г), тобто мінус числа 26. Аналогічно записується одиниця до наступного розряду (рис. 4,д) і до всіх інших розрядів від'ємних чисел. Використання операції АБО для накладання маски є універсальним у тому сенсі, що за попередньої наявності одиниць в деяких розрядах їх дублювання маскою не змінює ці розряди. Проте легко переконатися, що в нашому конкретному прикладі можна застосувати арифметичне додавання двох регістрів.