Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторні роботи 1-5.doc
Скачиваний:
3
Добавлен:
28.08.2019
Размер:
188 Кб
Скачать
☆

Інструкційна картка до проведення лабораторного заняття № 2

  1. Тема заняття : Програмування циклічних процесів та робота з масивами на асемблері.

  2. Мета проведення заняття: Вивчити команди циклу та навчитись працювати з масивами і циклами.

    1. Після виконання роботи студент повинен:

Знати: команди циклу та масивів.

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

  1. Матеріально-технічне оснащення робочого місця: персональний ЕОМ, інструкція до лабораторної роботи.

  2. Інструктаж з техніки безпеки (згідно з інструкцією до виконання конкретної лабораторної роботи)

  3. Короткі відомості з теоретичної частини роботи

Серед циклів на практиці найчастіше зустрічаються цикли з попередньо відомою кількістю повторень, до них відносяться:

1. LOOP - перехід по лічильнику

Ознаки не змінюються.

LOOP short-label.

Логіка: CX = CX - 1; if (CX <> 0)

JMP short-label.

Команда LOOP зменшує CX на 1, потім передає керування на мітку short-label, якщо CX не дорівнює 0. Операнд short-label повинен знаходитись у межах від -128 до +127 байт від наступної команди.

2. LOOPE - перехід доки рівно

Ознаки не змінюються.

Команда: LOOPE short-label.

Логіка: CX = CX - 1; if (CX <> 0) and (ZF = 1)

JMP short-label.

Команда LOOPE використовується після команд CMP чи SUB. Вона зменшує CX на 1, потім передає керування на мітку short-label, якщо CX не дорівнює нулю та якщо перший операнд команд CMP або SUB дорівнював іншому операнду. Операнд short-label повинен знаходитись у межах від -128 до +127 байт від наступної команди.

Примітка: Команда LOOPZ, перехід доку нуль, - це та ж команда, що й LOOPE.

3. LOOPNE - перехід доку не рівно

Ознаки не змінюються.

Команда: LOOPNE short-label.

Логіка: CX = CX - 1 if (CX <> 0) and (ZF = 0)

JMP short-label.

Команда LOOPNE використовується після команд CMP або SUB. Вона зменшує CX на 1, потім передає керування на мітку short-label, якщо CX не дорівнює нулю, та якщо перший операнд команд CMP або SUB не дорівнює іншому операнду. Операнд short-label мусить знаходитися в межах від -128 до +127 байт від наступної команди.

Примітка: Команда LOOPNZ, перехід доку не нуль, - це та ж команда, що й LOOPNE.

4. LOOPNZ - перехід доки не нуль

Ознаки не змінюються.

Команда: LOOPNZ short-label.

LOOPNZ - синонім LOOPNE. Дів. пояснення LOOPNE.

5. LOOPZ - перехід доки нуль

Ознаки не змінюються.

Команда: LOOPZ short-label.

LOOPZ - синонім LOOPE. Дів. пояснення LOOPE.

При описі масиву вказується кількість елементів у ньому та їх тип:

x dw 30 dup(?),

проте не вказується як нумеруються (індексуються) його елементи.

Описанню може відповідати масив:

x [0..29]

x [1..30]

x [k..29+k]

Автор програми може накладати на масив різноманітні діапазони зміни індекса. Іноді діапазон індексів суворо визначено в умові задачі. Якщо нумерація строго не визначена, тоді краще почати нумерацію з нуля.

Як залежить адреса елемента від індексу цього елемента:

x dw 30 dup(?); x [k..29+k] =>

адреси (x[i])=x+2*(i-k)

адреси (x[i])=x+(type x)*(i-k)

при k =0

адреси (x[i])=x+(type x)*i

Тому зазвичай вважають , що елементи в асемблері нумеруються з 0:

x dw 30 dup(?); x [0..29]

Для багатомірних масивів ситуація аналогічна:

А [ N * M ]

N,M - const

N - кількість рядків

M - кількість стовбців

Припустимо, що елементи матриці розміщені в пам'яті по рядках (можна розміщувати й по стовбцям):

адреси (A [i,j])=A+M*(type A)*(i-k*M)+(type A)*(i-k*N)

Найбільш доступний вигляд ця залежність приймає при нумерації з 0.

Як здійснюється доступ до елементів масиву?

До цього моменту ми працювали з командами, у яких для операндів вказувалися їх точні адреси.

Приклад 1. Розрахунок суми елементів масиву.

prog segment

assume cs:prog, ds:prog

data_array dw 10 dup(?)

sum dw ?

start:

mov ax,cs

mov ds,ax

xor ax,ax

mov bx,ax

mov cx,10

next:

add ax,data_array [bx]

add bx,2

loop next

mov sum,ax

ret

prog ends

end start

Проте команда може працювати й з виконавчою(ефективною) адресою:

А вик = (А+[рег]) mod 2^16, де

[рег] - зміст регістра

Спершу ніж виконати команду, ЦП додасть до адреси А (вказаній у команді) поточний зміст регістра - отримає нову адресу й буде працювати з операндом за цією адресою.