
- •Лабораторна робота №6 команди пересилки даних. Ознайомлення з роботою циклів
- •Короткі теоретичні відомості
- •Організація циклу за допомогою команди loop (Перший спосіб)
- •Організація циклу за допомогою команди jmp (Другий спосіб)
- •Організація циклу за допомогою команди dec і jnz (Третій спосіб)
- •Програма для практики
- •Завдання для виконання
- •Контрольні питання
Лабораторна робота №6 команди пересилки даних. Ознайомлення з роботою циклів
Мета роботи: ознайомитися зі структурою та реалізацією циклів в програмі.
Короткі теоретичні відомості
Цикли, що дозволяють виконати деяку ділянку програми багаторазово, в будь-якій мові є однією з найбільш уживаних конструкцій. У системі команд МП 86 цикли реалізуються, головним чином, за допомогою команди loop (петля), хоча є й інші способи організації циклів. У більшості випадках число кроків в циклі визначається вмістом регістра СХ, тому максимальне число кроків складає 64 К.
Організація циклічних переходів, як на мовах високого рівня, так і мовою assembler являє собою чудовий засіб, що дозволяє значно знизити код виконуваної програми.
У загальному вигляді будь цикл записується в асемблері як умовний перехід.
Організація циклу за допомогою команди loop (Перший спосіб)
Команда loop (анг. петля) виконує декремент вмісту регістра СХ (лічильник), і якщо воно не дорівнює 0, здійснює перехід на вказану мітку вперед або назад в тому ж програмному сегменті в діапазоні - 128 ... + 127 байт. Зазвичай мітка поміщається перед першою пропозицією тіла циклу, а команда loop є останньою командою циклу. Вміст регістра СХ розглядається як ціле число без знака, тому максимальне число повторень групи включених в цикл команд складає 65536 (якщо перед входом у цикл СХ = 0). Команда не діє на прапорці процесора.
Команда |
Призначення |
Процесор |
LOOP мітка |
Організація циклів |
8086 |
Простий приклад організації циклічного переходу (з лічильником в регістрі cx) на мові Assembler:
. model tiny |
; модель пам’яті, в якій сегменти коду, даних і стека об’єднані. |
. code |
; сегмент кода, який містить дані. |
org 100h |
; початок СОМ-файла |
begin: |
; мітка початку кода програми |
mov cx,10 |
; завантажуємо в (регістр-лічильник) CX кількість повторів (відлік буде йти від 10 до 0) |
Label1: |
; створюємо мітку (Label - мітка). |
mov ah,9 |
; поміщаємо номер функції DOS "виведення рядка (9)" в регістр АН. |
mov dx, offset String |
;поміщає в регістр DX зсув мітки String щодо початку сегменту даних |
int 21h |
; функція DOS "виведення строки" |
loop Label1 |
; оператор loop зменшує на одиницю CX і, якщо він не дорівнює нулю, переходить на мітку Label1 (рядок 6) |
ret |
; функція DOS "завершити програму" |
string db 'privet $' |
; cтрока, яка містить дані для виведення |
end begin |
; мітка завершення кода програми |
У рядку (5) завантажуємо в CX кількість повторів (відлік буде йти від 10 до 0). У рядку (6) створюємо мітку (Label - мітка). Далі (рядки (7) - (9)) виводимо повідомлення. І в рядку (10) оператор loop зменшує на одиницю CX і, якщо він не дорівнює нулю, переходить на мітку Label1 (рядок (6)). Таким чином, рядок буде виведена на екран десять разів. Коли програма перейде на рядок (11), регістр CX буде дорівнює нулю.