Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л.р.1-12.СПРГ-1(40, укр).doc
Скачиваний:
5
Добавлен:
27.08.2019
Размер:
2.33 Mб
Скачать

3.1. Реалізація основних операцій по обробці масивів мовою асемблера.

3.1.1. Оголошення масиву. Для оголошення масиву в секції визначення даних досить оголосити змінну і тип даних:

- масив з десяти 32-бітних даних: array dd 10 dup (?)

3.1.2. Ініціалізація масиву:

  • масив з десяти 32-бітних даних: array1 dd 1,2,5,4,5,6,7,8,9,10:

  • масив з десяти 16-бітних даних: array2 dw 5 dup (4095) - створюється масив з 10 елементів, значенням яких є число 4095(0FFFh):

З погляду програмування на асемблері не існує принципових відмінностей в оголошенні одномірних і двовимірних масивів, так приведений вище приклад оголошення масиву array1, можна розглядати як двовимірний масив (2x5) або (5x2):

а) array

[1

2

б) array

[1

2

3

4

5

3

4

6

7

8

9

10]

5

6

7

8

9

10]

Розходження будуть виявлятися тільки при організації доступу до елемента масиву.

3.1.3. Організація доступу до елементів масиву. Для одержання доступу до елемента масиву при програмуванні на асемблері використовується непряма адресація операндів, при цьому в якості перемінної - лічильника зручно використовувати один з вільних регістрів загального призначення.

- доступ до елементів одномірного масиву:

Рис.1.- Алгоритм доступу до елемента одномірного масиву

Приклад коду, що реалізує алгоритм, наведений на рисунку 1.

mov есх,10

; в <есх> кількість елементів

mov ebx, array

; в <ebx> адреса вектору (масиву)

mov edi, 0

; лічильник елементів вектора

@@1:

mov еах, [ebx+edi]

; доступ до елементу вектора

add edi, 4

; наступний елемент вектора

loopnz @@1

; цикл

- для доступу до елементів двовимірного масиву необхідно в якості індексних використовувати 2 регістри, наприклад ebx і esi, алгоритм приведений на рисунку 2, приклад коду - нижче:

xor ebx, ebx

; зсув <ebx>=0 - по рядках

mov ecx,[m]

; число рядків в <есх>

jcxz @@3

; перевірка коректності даних (m=0?)

push есх

; зберегти лічильник зовніш. циклу

@@1:

; цикл по рядках (зовнішній)

xor esi, esi

; зсув <esi>=0 - по стовпцях

mov ecx,[n]

; число стовпчиків в <есх>

jcxz @@3

; n=0?, якщо – „так”, то вихід.

@@2:

; цикл по стовпцях (внутрішній)

mov eax, [array+ebx+esi]

; обробка даних

add esi, 2

; +2(dw), +1(db) – наступний елемент

loop @@2

; внутрішній цикл

add ebx,[NN]

; перехід на наступний рядок

; NN=2(dw)*n - число елем. рядка

pop есх

; відновити лічильник зовніш. циклу

loop @@1

; зовнішній цикл

@@3:

; вихід

Рис.2. – Організація доступу до елементів двовимірного масиву

3.1.4. Обробка масиву.

- без використання ланцюжкових команд. У даному випадку використовуються всі команди (пересилання, арифметичної, бітові, передачі управління).

Приклад 1: знайти індекси максимального і мінімального елементів масиву, що складається з елементів розміром байт. Нумерація елементів масиву з одиниці.

Вирішимо цю задачу без використання циклічних команд. Змінні IndMax і IndMin, будемо використовувати для збереження чергового локального елемента.

З огляду на, що для елементів розміром у байт діапазон значень дорівнює -128...+127, максимальне значення приймемо рівним -128, а мінімальне +127. Відповідна програма на асемблері приведена нижче.

format pe

jmp start

N dw10

; розмірність масиву.

A db -3, 5, 2, 6, 11, 5, -4, 127, -9, 10

IndMax dw?

; індекс максимального елемента

IndMin dw?

; індекс мінімального елемента

start:

xor esi, esi

; лічильник циклу.

mov ch, -128

; макс, значення масиву.

mov cl, 127

; мінім. значення масиву.

Ml:

mov al, byte [A+esi]

; flat model - 32 розрядна адреса!!!

cmp al, ch

; пошук максимуму

jle M2

mov ch, al

; поточний елемент більше максимуму.

mov [IndMax], si

; запам'ятовуємо його номер

inc [IndMax]

; корегування номера, тому що esi=i-l.

M2:

cmp al, cl

; пошук мінімуму.

jge МЗ

mov cl, al

; поточний елемент менше мінімуму.

mov [IndMin], si

; запам'ятовуємо його номер

inc [IndMin]

; корегування номера, тому що esi=i-l.

МЗ:

inc esi

; команди завершення тіла циклу.

cmp esi, 10

jb Ml

ret

Приклад 2: знайти входження елементу у двомірний масив.

...

- із використанням ланцюжкових команд. Відомо, що ланцюжкові команди дозволяють досить легко бути пристосовані для обробки масивів. При використанні ланцюжкових команд завжди варто пам'ятати про регістри, використовуваних за замовчуванням - edi і esi, - саме з їхньою допомогою й організується програма обчислень.

Приклад 2. Знайти елементи масиву менші визначеного числа n замінити їх заданим значенням

format pe

start:

mov ecx, [len]

; розмір масиву -> есх

mov edi, array

; адреса першого елемента -> edi

mov eax, 5

; значення для порівняння

cld

; установити прапор напрямку убік

; збільшення адрес

next:

scasd

; порівнюємо елемент з вмістом <еах>

jg change

; число в еах більше поточного елемента?

loop next

; якщо ні, наступна ітерація

jmp exit

change:

; елемент масиву менше числа в еах

mov ebx, [edi-4]

mov dword [edi-4], 0

; замінити вміст комірки пам'яті на 0

dec ecx

; декремент лічильника

jmp next

exit:

ret

len dd 10

array dd 1,2,5,4,5,6,7,8,9,10

_ar dw 10 dup (3)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]