- •Інструкційна картка до проведення лабораторного заняття № 1
- •Короткі відомості з теоретичної частини роботи
- •Інструкційна картка до проведення лабораторного заняття № 2
- •Команда lea. При використанні регістрів-модифікаторів часто доводиться записувати в них ті чи інші адреси. Нехай, наприклад, нам необхідно занести в регістр вх адресі змінної X:
- •Інструкційна картка до проведення лабораторного заняття № 3
- •Короткі відомості з теоретичної частини роботи
- •Інструкційна картка до проведення лабораторного заняття № 4
- •Короткі відомості з теоретичної частини роботи
- •Зміст і послідовність виконання
- •Методичні рекомендації з виконання та оформлення роботи
- •Рекомендована література:
- •Зміст і послідовність виконання
- •Методичні рекомендації з виконання та оформлення роботи
- •9 Рекомендована література:
- •Інструкційна картка до проведення лабораторного заняття № 5
- •Короткі відомості з теоретичної частини роботи
- •Зміст і послідовність виконання
- •Методичні рекомендації з виконання та оформлення роботи
- •Рекомендована література:
Інструкційна картка до проведення лабораторного заняття № 2
Тема заняття : Програмування циклічних процесів та робота з масивами на асемблері.
Мета проведення заняття: Вивчити команди циклу та навчитись працювати з масивами і циклами.
Після виконання роботи студент повинен:
Знати: команди циклу та масивів.
Вміти: розроблювати та реалізувати алгоритм на мові Асемблер, використовувати умовні переходи для реалізації циклічних переходів.
Матеріально-технічне оснащення робочого місця: персональний ЕОМ, інструкція до лабораторної роботи.
Інструктаж з техніки безпеки (згідно з інструкцією до виконання конкретної лабораторної роботи)
Короткі відомості з теоретичної частини роботи
Серед циклів на практиці найчастіше зустрічаються цикли з попередньо відомою кількістю повторень, до них відносяться:
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, де
[рег] - зміст регістра
Спершу ніж виконати команду, ЦП додасть до адреси А (вказаній у команді) поточний зміст регістра - отримає нову адресу й буде працювати з операндом за цією адресою.
