Главная | Обратная связь
МегаЛекции

Організація циклу за допомогою команди JMP (Другий спосіб)





ЛАБОРАТОРНА РОБОТА №6

КОМАНДИ ПЕРЕСИЛКИ ДАНИХ. ОЗНАЙОМЛЕННЯ З РОБОТОЮ ЦИКЛІВ

 

Мета роботи: ознайомитися зі структурою та реалізацією циклів в програмі.

 

Короткі теоретичні відомості

Цикли, що дозволяють виконати деяку ділянку програми багаторазово, в будь-якій мові є однією з найбільш уживаних конструкцій. У системі команд МП 86 цикли реалізуються, головним чином, за допомогою команди loop (петля), хоча є й інші способи організації циклів. У більшості випадках число кроків в циклі визначається вмістом регістра СХ, тому максимальне число кроків складає 64 К.

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

У загальному вигляді будь цикл записується в асемблері як умовний перехід.

 

Організація циклу за допомогою команди LOOP (Перший спосіб)

Команда loop (анг. петля) виконує декремент вмісту регістра СХ (лічильник), і якщо воно не дорівнює 0, здійснює перехід на вказану мітку вперед або назад в тому ж програмному сегменті в діапазоні - 128 ... + 127 байт. Зазвичай мітка поміщається перед першою пропозицією тіла циклу, а команда loop є останньою командою циклу. Вміст регістра СХ розглядається як ціле число без знака, тому максимальне число повторень групи включених в цикл команд складає 65536 (якщо перед входом у цикл СХ = 0). Команда не діє на прапорці процесора.

Команда Призначення Процесор
LOOP мітка Організація циклів

Простий приклад організації циклічного переходу (з лічильником в регістрі 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 буде дорівнює нулю.

 

Організація циклу за допомогою команди JMP (Другий спосіб)

Команда jmp передає управління у вказану точку того ж або іншого програмного сегмента. Адреса повернення не зберігається. Команда не впливає на прапори процесора.

Команда jmp має п’ять різновидів:

1. перехід прямої короткий (у межах - 128 ... + 127 байтів);

2. перехід прямої ближній (в межах поточного програмного сегменту);

3. перехід прямої дальній (у інший програмний сегмент);

4. перехід непрямий ближній;

5. перехід непрямий дальній.

 

Всі різновиди переходів мають одну і ту ж мнемоніку jmp, хоча і розрізняються коди операцій. У багатьох випадках транслятор може визначити вид переходу по контексту, в тих же випадках, коли це неможливо, слід використовувати атрибутні оператори (short - прямий короткий перехід; near ptr - прямий ближній перехід; far ptr - прямий дальній перехід; word ptr - непрямий ближній перехід; dword ptr - непрямий дальній перехід).

Команда Призначення Процесор
JMP мітка Безумовний перехід

 

. 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).

 





Рекомендуемые страницы:




Читайте также:


Воспользуйтесь поиском по сайту:
©2015- 2020 megalektsii.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.