Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab4___.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
182.78 Кб
Скачать

6.3.Цикли

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

Цикли - це основний засіб, що використовується для виконання повторюваних дій. Тому використаються вони досить часто, настільки часто, що в наборі інструкцій про-цессора 8086 передбачено фактично кілька інструкцій циклів: LOOP, LOOPNE, LOOPE та JCXZ.

Давайте розглянемо спочатку інструкцію LOOP. Припустимо, ми хочемо вивести 17 символів текстового рядка TestString. Це можна зробити в такий спосіб:

.DATA

TestString DB 'Це перевірка! ...'

.

.

.CODE

.

mov cx,17

mov bx,OFFSET TestString

PrintStringLoop:

mov dl,[bx] ; одержати наступний символ

inc bx ; посилання на наступний символ

mov ah,2 ; функція DOS виводу на екран

int 21h ; викликати DOS для виводу символу

dec cx ; зменшити лічильник довжини рядка

jnz PrintStringLoop ; обробити наступний символ, якщо він є

Є, однак, кращий спосіб. loop PrintStringLoop робить те ж, що й інструкції:

dec cx

jnz PrintStringLoop

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

Інструкція LOOPE працює також, як інструкція LOOP, тільки цикл при її виконанні буде завершуватися (тобто перестануть виконуватися переходи), якщо регістр CX прийме значення 0 або прапор нуля буде встановлений у значення 1 (потрібно пам'ятати про те, що прапор нуля встановлюєтья в значення 1, якщо результат останньої арифметичної операції був нульовим або два операнда в останній операції порівняння не збігалися). Аналогічно, інструкція LOOPNE завершує виконання циклу, якщо регістр CX прийняв значення 0 або прапор нуля скинутий (має нульове значення). Інструкція LOOPE відома також, як інструкція LOOPZ, інструкція LOOPNE - як інструкція LOOPNZ, також як інструкції JE еквівалентна інструкція JZ (це інструкції-синоніми).

Є ще одна інструкція циклу. Це інструкція JCXZ. Інструкція JCXZ здійснює перехід тільки в тому випадку, якщо значення регістра CX дорівнює 0. Це дає зручний спосіб перевіряти регістр CX перед початком циклу.

Щодо інструкцій циклів можна зробити пари цікавих зауважень. По-перше, потрібно пам'ятати про те, що інструкції циклів, як й інструкції умовних переходів, можуть виконати перехід тільки на мітку, що відстоїть від інструкції циклу не більше ніж на 128 байт у ту або іншу сторону. Цикли, що перевищують 128 байт, вимагають використання умовних переходів за допомогою безумовних переходів (цей метод описаний у попередньому розділі "Умовні переходи"). По-друге, важливо розуміти, що жодна з інструкцій циклів не впливає на стан прапорів. Це означає, що інструкція: loop LoopTop не еквівалентна в точності інструкціям:

dec cx

jnz LoopTop

оскільки інструкція DEC змінює прапори переповнення, знака, нуля, додаткового переносу та парності, а інструкція LOOP на прапори не впливає. Крім того, використання інструкції DEC не еквівалентно варіанту:

sub cx,1

jnz LoopTop

оскільки інструкція SUB впливає на прапор переносу, а інструкція DEC - ні. Розходження невеликі, але при програмуванні мовою асемблера важливо розуміти, які саме прапори встановлюють ті або інші інструкції.

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