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

3.7. Запис масиву даних до озп і організація циклу

Для пересування масивів даних зручно користуватися непрямою адресацією з автоматичною зміною на одиницю змісту індексного регістра в кожному кроці – з переддекрементом або постінкрементом. З огляду на те, що модуль результату при аргументах xі = 7…0 ми записуватимемо до комірок ОЗП (див. рис. 2) $0067…$0060, перед записом першого числа адресу в індексному регістрі Z = SRAM_START + 8 = $0068 потрібно попередньо декрементувати. У команді (1) і виконується спочатку переддекремент індексного регістра: Z <= Z-1 = $0068 – 1 = $0067, а відтак запис в ОЗП до комірки з цим номером (зміст комірки позначається в дужках) старшого числа: (Z) <= tmp. По обчисленні наступного числа так само відбудеться автоматична зміна адреси Z і воно буде записано до комірки $0066 і т.д.

У командах (2, 3) здійснюються вже описані операції очищення прапора і зсуву маски, а в команді (4) – перехід до наступного значення аргументу. Одночасно ця команда відіграє роль лічильника кількості проходження циклів, за результатами якого здійснюються переходи (5). У загальному випадку подібний лічильник циклів організовують за допомогою окремого РЗП.

MEM: ;**** ЗАПИС МАСИВУ ДАНИХ ДО ОЗП І ОРГАНІЗАЦІЯ ЦИКЛУ

(1) st -Z,tmp ; Store indirect and predecrement - Записати в пам'ять з непрямою

; адресацією та з переддекрементом: Z <= Z-1, (Z) <= tmp

(2) clc ; Clear Carry - Очистити прапор перенесення: С <= 0

(3) ror msk ; Rotate right through carry - Циклічний зсув (маски msk) праворуч

; через перенесення

(4) dec xi ; Decrement - Декрементувати: xі <= xі - 1 (перейти до наступного

; значення аргументу)

(5) brge MAIN ; Branch if greater or equal, signed - Перехід (до позначки

; MAIN), якщо більше або дорівнює з урахуванням знаку

; (тобто поки xі >= 0), інакше вихід з циклу

3.8. Завантаження масиву даних з озп до рзп

Як вже зазначалося, під час операцій з даними хоча б одним з операндів є РЗП, тому з комірки ОЗП дані не можна переслати до її іншої комірки, а лише завантажити їх до якогось конкретного РЗП, наприклад, до регістра tmp. Враховуючи, що після запису даних в ОЗП з переддекрементом (команда 1, п. 3.6) в індексному регістрі виявляється адреса початкової комірки Z=$0060, тому в команді 1 нашого фрагменту програми потрібно вибрати операцію завантаження з постінкрементом: tmp <= (Z), Z <= Z+1, по виконанні якої дані з комірки Z=$0060 буде завантажено до регістра tmp, а індексний регістр автоматично налаштується на адресу наступної комірки Z=$0061.

Для автоматизації завантаження масиву даних до РЗП скористаємося загальним адресним простором ОЗП, в якому регістри R0 … R31 відповідають коміркам ОЗП з адресами $0000 ... $001F. Для цього потрібно вибрати операцію запису до пам'яті з постінкрементом іншого індексного регістра (команда 2): (Y) <= tmp, Y <= Y+1. Через те, що на початку всі регістри скинуто, по виконанні цієї команди дані з регістра tmp буде записано до комірки Y = $0000, тобто до регістра R0, а індексний регістр автоматично налаштується на адресу наступної комірки Y = $0001, тобто для запису даних до регістра R1. (Можна обійтися і лише одним індексним регістром у простих типах МК. Доповніть для цього наш фрагмент програми двома командами).

У нашому випадку цикл легко організувати порівнянням змісту індексного регістра з константою (команда 3): для чисел 0 … 7 цикл замикається (команда 4), після чого відбувається вихід з нашого циклу. Слід зауважити, що під час порівняння зміст регістра YL не змінюється, встановлюються лише прапори, які зручно використовувати для галуження програми.

LOOP: ;******** ЦИКЛ (ПЕТЛЯ) ЗАВАНТАЖЕННЯ РЕЗУЛЬТАТІВ У РФ

(1) ld tmp,Z+ ; Load indirect and postincrement - Завантажити з непрямою

; адресацією і з постінкрементом: tmp <= (Z), Z <= Z+1 –

; Вибираємо дані з комірки Z (Z=$60,$61...$67)

(2) st Y+,tmp ; Store indirect and postincrement - Запис до пам'яті непряма і з

; постінкрементом: (Y) <= tmp, Y <= Y+1 - запис до комірок

; ОЗП $0,$1,...,$7, тобто до регістрів R0,R1,...,R7

(3) cpi YL,8 ; Compare Register with Immediate - Порівняння безпосереднє:

; YL - 8 (активізуються прапори Z, N, V, C, H)

(4) brne LOOP ; Branch if Not Equal - Перехід, якщо не дорівнює (поки Z = 0),

; інакше вихід з циклу