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

1.3 Команда циклу loop

Наведений у попередньому розділі фрагмент програми не може бути робочім прикладом, оскільки він реалізує «вічний цикл». Але у робочих програмах часто-густо треба реалізовувати цикли, які повторюються певне число раз. Для реалізації таких циклів може бути ефективно використана команда LOOP, яка використовує значення регістра CX, автоматично зменшуючи його на 1 після кожного проходу всіх команд циклу. Формат команди циклу ідентичний формату команди JMP:

{позначка} LOOP [позначка-операнд]

Керування передається за адресою, яка вказана в операнді, доки значення регістра CX не дорівнює нулю, а при виконанні цієї умови здійснюється перехід на команду, що стоїть безпосередньо після оператора LOOP. При реалізації циклів часто-густо використовуються двобайтні команди збільшення та зменшення на 1, які є більш ефективними, ніж добре знайомі вам команди ADD та SUB. Формат команд збільшення на 1 INC та зменшення DEC такий:

{позначка} [код команди] [операнд]

Операндом в командах INC та DEC може бути регістр або комірка пам’яті.

Приклад використання команди LOOP:

MOV AX,1; ініциалізація регістрів процесора

MOV BX,1

MOV DX,1

MOV CX,10

M1: INC AX

ADD BX,AX

SHL DX,1

LOOP M1; Зменшити СХ на 1. Якщо в регістрі СХ число 0 - ; перейти до виконання наступної команди, якщо ні ; перейти до позначки М1.

RET; Завершити програму.

Завдання для перевірки №4: Порівняйте цей приклад з наведеним у попередньому розділі. Яку принципову різницю ви помітили? Скільки разів буде виконуватись цикл у наведеному прикладі? Проаналізуйте без допомоги комп’ютера, які числа будуть в кожному з регістрів процесора після виконання команд циклу один, два, три, десять разів.

Аналогічно команді JMP команда LOOP визначає відстань до кінця циклу. Але при реалізації циклів є два принципових правила, які повинні завжди виконуватись:

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

2. В циклах передбачена тільки найкоротша адресація. Тому якщо зміщення буде перевищувати 127 байт, то такий цикл буде розглянутий як помилка програмування. Транслятор в такому випадку видасть повідомлення «Relative jump out of rang» (Перевищення відносної межі переходу, яка допускається).

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

Завдання для перевірки №5: Замініть у наведеному прикладі команду LOOP командою LOOPNE та перевірте, чи впливає ця зміна на кількість виконань команд циклу.

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