Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Всі відповіді СП.docx
Скачиваний:
10
Добавлен:
28.01.2023
Размер:
217.28 Кб
Скачать
    1. Проаналізувати особливості роботи із масивами в мові асемблер.

Для початку дамо формальне визначення, МАСИВ - цк структурований тип даних, що містить у собі деяку кількість елементів одного типу.

Спеціалізованих засобів для опису масивів в програмах асемблера немає, при необхіності викорстовувати масиви в програмі необхіно їх моделювати одним із наступних варіантів:

  1. Переліченням елементів масиву в поле операндів однієї із директив опису даних. При переліку елементи розділяються комами. Наприклад:

Масив з 5 елементів, розмір кожного 4 байти

mas dd 1, 2, 3, 4, 5

  1. За допомогою оперетора повторення dup

Масив з 5 нульових елеменів

Mas dw 5 dup (0)

Даний метод використовується для резервування пам'яті з ціллю розміщення та ініціалізації елементів масиву.

  1. Використовуючи директиви label, rept. Ці директиви можуть значно облегшити описання великих масивів у пам'яті та підвищити логічність такого опису. Директива rept відноситься до макрозасобів мови асемблера і викликає повторення вказану кількість разів рядків, укладених між директивою та рядком endm. Наприклад, визначимо масив байт області пам'яті, позначеної ідентифікатором mas_b. У цьому випадку директива label визначає символічне ім'я mas_b, аналогічно до того, як це роблять директиви резервування та ініціалізації пам'яті. Перевага директиви label в тому, що вона не резервує пам'ять, а лише визначає характеристики об'єкта. В даному випадку об'єкт - це комірка пам'яті. Використовуючи кілька директив label, записаних одна за одною, можна привласнити одній і тій же області пам'яті різні імена та різний тип, що й зроблено у наступному фрагменті:

...

n=0

...

mas_b label byte

mas_w label word

rept 4

dw 0f1f0h

endm

В результаті в пам'яті буде створено послідовність чотирьох слів f1f0. Цю послідовність можна трактувати як масив байт або слів залежно від того, яке ім'я області ми будемо використовувати в програмі mas_b або mas_w.

  1. Використання циклу для ініціалізації значення пам'яті, яку можна буде згодом трактувати як масив.

Доступ до елементів масиву

Працюючи з масивами необхідно чітко уявляти, що це елементи масиву розміщуються у пам'яті комп'ютера послідовно.

Саме собою таке розташування нічого не говорить про призначення та порядок використання цих елементів. І тільки програміст за допомогою складеного ним алгоритму обробки визначає, як потрібно трактувати цю послідовність байт, що становлять масив. Так, ту саму область пам'яті можна трактувати як одномірний масив, і одночасно ті ж дані можуть трактуватися як двомірний масив. Все залежить лише від алгоритму обробки цих даних у конкретній програмі. Самі собою дані не несуть жодної інформації про свій “смисловий”, чи логічний, тип. Пам'ятайте про цей важливий момент.

Ці міркування можна поширити і на індекси елементів масиву. Асемблер не підозрює про їх існування і йому абсолютно байдуже, які їх чисельні смислові значення.

Щоб локалізувати певний елемент масиву, до його імені потрібно додати індекс. Так як ми моделюємо масив, то маємо подбати і про моделювання індексу. У мові асемблера індекси масивів це звичайні адреси, але з ними працюють особливим чином. Іншими словами, коли при програмуванні на асемблері ми говоримо про індекс, то скоріше маємо на увазі не номер елемента в масиві, а деяку адресу.

Давайте ще раз звернемося до опису масиву. Наприклад, у програмі статично визначено послідовність даних:

mas dw 0,1,2,3,4,5

Нехай ця послідовність чисел трактується як одновимірний масив. Розмірність кожного елемента визначається директивою dw, тобто вона дорівнює 2 байти. Щоб отримати доступ до третього елемента, потрібно додати до адреси масиву 6. Нумерація елементів масиву в асемблері починається з нуля.

Тобто в нашому випадку мова фактично йде про 4-й елемент масиву — 3, але про це знає тільки програміст; мікропроцесору в даному випадку все одно - йому потрібна лише адреса.

Загалом для отримання адреси елемента в масиві необхідно початкову (базову) адресу масиву скласти з добутком індексу (номер елемента мінус одиниця) цього елемента на розмір елемента масиву:

база + (індекс * розмір елемента).