- •Лабораторна робота №6 команди пересилки даних. Ознайомлення з роботою циклів
- •Короткі теоретичні відомості
- •Організація циклу за допомогою команди loop (Перший спосіб)
- •Організація циклу за допомогою команди jmp (Другий спосіб)
- •Організація циклу за допомогою команди dec і jnz (Третій спосіб)
- •Програма для практики
- •Завдання для виконання
- •Контрольні питання
Організація циклу за допомогою команди jmp (Другий спосіб)
Команда jmp передає управління у вказану точку того ж або іншого програмного сегмента. Адреса повернення не зберігається. Команда не впливає на прапори процесора.
Команда jmp має п’ять різновидів:
1. перехід прямої короткий (у межах - 128 ... + 127 байтів);
2. перехід прямої ближній (в межах поточного програмного сегменту);
3. перехід прямої дальній (у інший програмний сегмент);
4. перехід непрямий ближній;
5. перехід непрямий дальній.
Всі різновиди переходів мають одну і ту ж мнемоніку jmp, хоча і розрізняються коди операцій. У багатьох випадках транслятор може визначити вид переходу по контексту, в тих же випадках, коли це неможливо, слід використовувати атрибутні оператори (short - прямий короткий перехід; near ptr - прямий ближній перехід; far ptr - прямий дальній перехід; word ptr - непрямий ближній перехід; dword ptr - непрямий дальній перехід).
Команда |
Призначення |
Процесор |
JMP мітка |
Безумовний перехід |
8086 |
. model tiny |
; модель пам'яті, в якій сегменти коду, даних і стека об'єднані. |
. code |
; сегмент коду, який містить дані. |
org 100h |
; початок СОМ-файла |
begin: |
; мітка початку кода програми |
label1: |
; створюємо мітку |
mov ah,9 |
; поміщаємо номер функції DOS "виведення рядка (9)" в регістр АН. |
mov dx,offset String |
; поміщає в регістр DX зсув мітки String щодо початку сегменту даних |
int 21h |
; функція DOS "виведення строки" |
jmp Label1 |
; перехід на строку з міткою Label1 |
add cx,12 |
; подати до значення регістра cx число 12 |
dec cx |
; зменшити значення регістра cx на 1 |
ret |
; функція DOS "завершити програму" |
string db "PRIVET",13,10,'$' |
; cтрока, яка містить дані для виведення |
end begin |
; мітка завершення кода програми |
В результаті роботи програми буде зациклений блок рядків (6) - (10) (Виведення рядка PRIVET численна кількість разів) Рядки (10) - (11).
Організація циклу за допомогою команди dec і jnz (Третій спосіб)
За допомогою цих операторів можна створювати цикли, які будуть працювати швидше оператора Loop. Комбінована робота команд DEC і JNZ зменшує вміст регістра CX на 1 і виконує перехід на мітку, якщо в CX не дорівнює нулю.
Команда DEC, крім того, встановлює прапорець нуля у регістрі прапорців в стан 0 або 1. Команда JNZ потім перевіряє цю установку.
Аналогічно командам JMP і LOOP операнд в команді JNZ містить значення відстані між кінцем команди JNZ і адресою переходу (Label 1), яке додається до командного покажчику. Ця відстань повинна бути в межах від - 128 до +127 байт.
. 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 "виведення строки" |
dec cx |
; оператор DEC зменшує на одиницю CX і, якщо він не дорівнює нулю, переходить на мітку Label1 |
jnz Label1 |
; умовний перехід на строку з міткою Label1 |
ret |
; функція DOS "завершити програму" |
string db 'priver ',13,10, '$' |
; cтрока, яка містить дані для виведення |
end begin |
; мітка завершення кода програми |
