Головна

Команди управління циклом

  1. FDDI. Кадр. Процедури управління доступом до кільця і ??ініціалізації роботи кільця.
  2. I. Основні поняття УПРАВЛІННЯ ТА АВТОМАТИЗОВАНИХ СИСТЕМ ОБРОБКИ ІНФОРМАЦІЇ ТА УПРАВЛІННЯ
  3. I. форми державного управління
  4. I. форми державного управління
  5. II. Метод ДЕРЖАВНОГО УПРАВЛІННЯ.
  6. III рівень. Клініко-експертна комісія органу управління охороною здоров'я території, що входить, до складу суб'єкта Федерації
  7. III. Функціональні можливості АВТОМАТИЗОВАНИХ СИСТЕМ ОБРОБКИ ІНФОРМАЦІЇ ТА УПРАВЛІННЯ

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

а) if X> 0 then S1 else S2

б) while X> 0 do S

в) repeat S until X> 0

де S, S1 і S2 - якісь оператори, а X - знакова змінна, реалізуються за такими схемами (відповідно):

CMP X, 0 BEG: CMP X, 0 BEG: --- JLE L2 JLE FIN | S | --- --- --- | S1 | | S | CMP X, 0 --- --- JG BEG JMP FIN JMP BEGL2: --- FIN: | S2 | --- FIN: a) б) в)

Серед циклів на практиці найбільш часто зустрічаються цикли із заздалегідь відомим числом повторень (for-цикли мови Паскаль), тому в систему команд багатьох ЕОМ зазвичай включають додаткові команди, що спрощують реалізацію подібних циклів і звану команду управління циклом. Є такі команди і в ПК, їх ми зараз і розглянемо.

команда LOOP

Нехай деяку групу команд (тіло циклу) треба повторити N разів (N> 0). Тоді на ЯА цей цикл можна реалізувати за такою схемою:

MOV CX, N; CX - лічильник циклу (число повторень)

L: ...;

...; тіло циклу

...;

DEC CX; СХ: = СХ-1

СМР СХ, 0; СХ = 0?

JNE L; СХ <> 0 а goto L

Як видно, в кінці таких циклів завжди застосовується одна і та ж трійка команд. З огляду на це, в систему команд ПК була введена спеціальна команда, яка об'єднує в собі дії цих трьох команд:

Управління циклом по лічильнику: LOOP <мітка>

Дія цієї команди можна описати так:

CX: = CX-1; if CX <> 0 then goto <мітка>

За допомогою команди LOOP наш цикл запишеться наступним чином:

MOV CX, N; N> 0

L: ...;

...; тіло циклу

...;

LOOP L

Як видно, вийшло коротше, та й працює команда LOOP швидше цих трьох команд. Тому, якщо можна, слід користуватися командою LOOP.

Однак необхідно враховувати ряд особливостей цієї команди.

По-перше, команда LOOP вимагає, щоб в якості лічильника циклу обов'язково використовувався регістр СХ, при іншому регістрі команду застосовувати не можна.

По-друге, початкове значення для СХ має бути присвоєно до циклу, причому цього регістру треба привласнювати рівно стільки, скільки разів повинен повторюватися цикл - без всяких "плюс-мінус одиниця". Наприклад, якщо цикл повинен виконуватися 100 раз, то в регістр СХ треба записувати саме 100, а не 99 або 101.

По-третє, оскільки команда LOOP ставиться в кінці циклу, тіло циклу хоча б раз обов'язково виконається. Тому для випадку СХ = 0 наша схема циклу не підходить. Так ось, якщо можливий варіант, що число повторень може бути і нульовим, то при СХ = 0 треба зробити обхід циклу:

MOV CX, N; N> = 0

JCXZ L1; CX = 0 а L1

L: ...;

...; тіло циклу

...;

LOOP L

L1: ...

Саме заради здійснення таких обходів в ПК і була введена команда умовного переходу JCXZ. В інших ситуаціях вона використовується рідко.

По-четверте, як і команди умовного переходу, команда LOOP реалізує тільки короткий перехід, тому відстань від неї до початку циклу (мітки L) не повинно перевищувати 127-128 байтів (приблизно 30-40 команд). Якщо цикл містить більше команд, тоді команду LOOP може використовуватися, тому треба реалізовувати цикл по-іншому.

Розглянемо конкретний приклад на використання команди LOOP. Нехай N -байтовая змінна зі значенням від 0 до 8 і треба в регістр АХ записати факторіал цього числа: AX: = N! (Відзначимо, що 8! = 40320 <2 16).

Для вирішення цього завдання треба спочатку покласти АХ: = 1, а потім N раз виконати множення AX: = AX * i, змінюючи i від 1 до 8. При цьому слід враховувати, що при N = 0 цикл не повинен виконуватися.

MOV AX, 1; AX: = 0!

MOV CL, N

MOV СН, 0; CX: = N як слово (лічильник циклу)

JCXZ Fl; при N = 0 обійти цикл

MOV SI, 1; i: = l

F: MUL SI; (DX, AX): = AX * i (DX = 0)

INC SI

LOOP F

F1:

Відзначимо, що в даному прикладі параметр циклу (i) можна було б міняти і в "зворотному" напрямку - від N до 1, а оскільки саме так змінюється і регістр СХ, то цей регістр можна використовувати не тільки як лічильник циклу, але і як параметр циклу (CX = i):

MOV AX, 1

MOV CL, N

MOV CH, 0; CX - і лічильник циклу, і параметр циклу

JCXZ Fl

F: MUL СХ

LOOP F

F1:

Однак таке поєднання ролей вдається вкрай рідко, тому при реалізації циклів регістр СХ зазвичай використовується тільки як лічильник циклу (який вказує, скільки ще раз треба повторити цикл), а для параметра циклу доводиться використовувати інший регістр.

Команди LOOPE / LOOPZ н LOOPNE / LOOPNZ

Ці команди схожі на команду LOOP, т. Е. Змушують цикл повторитися стільки раз, скільки вказано в регістрі СХ, однак вони допускають і достроковий вихід з циклу.

Цикл за лічильником і поки одно (поки нуль): LOOPE <мітка> або LOOPZ <мітка>

(Назви LOOPE і LOOPZ є синонімами.) Дія цієї команди можна описати так:

CX: = CX-1; If (CX <> 0) and (ZF = 1) then goto <мітка>

Таким чином, ця команда поєднує в собі зміна лічильника циклу (регістра СХ) і умовний перехід, коли лічильник ще не нульовий і коли попередня команда виробила прапор нуля, рівний 1. Причому цей перехід - короткий.

Команда LOOPE використовується для організації циклу з відомим числом повторень, з якого можливий достроковий вихід. До початку циклу в регістр СХ записується число повторень. Сама команда LOOPE ставиться в кінець циклу (її операнд - мітка першої команди циклу), а перед нею поміщається команда, яка змінює прапор ZF (зазвичай це команда порівняння СМР). Команда LOOPE змушує цикл повторюватиметься СХ раз, але тільки якщо попередня команда фіксує рівність порівнюваних величин (виробляє нульовий результат).

З якої саме причини стався вихід з циклу (по ZF = 0) або СХ = 0), треба перевіряти після циклу. Причому треба перевіряти прапор ZF (по команді JE / JZ або JNE / JNZ), а не регістр СХ, т. К. Умова ZF = 0 ( "не дорівнює") може з'явитися якраз на останньому кроці циклу, коли і регістр СХ став нульовим.

Найчастіше команда LOOPE використовується для пошуку першого елемента деякої послідовності, відмінного від заданої величини. Нехай, наприклад, треба записати в регістр BL найменше число з відрізка [2, К], на яке не ділиться число N (К і N - байтові змінні, 2 <= K

MOV DL, N

MOV DH, 0; DX: = N як слово

MOV CL, K

MOV CH, 0

DEC CX; CX: = K-1 (лічильник циклу)

MOV BL, 1
 DV: INC BL; чергове число з [2, к]

MOV AX, DX

DIV BL; AH: = N mod BL

CMP AH, 0; mod = 0?

LOOPE DV; цикл СХ раз і поки mod = 0

JNE DV1; mod <> 0 а DV1

MOV BL, 0; немає шуканого числа

DVl:

Ще одна команда ПК для організації циклів:

Цикл за лічильником і поки не дорівнює (поки не нуль): LOOPNE <мітка> або LOOPNZ <мітка>

(Назви LOOPNE і LOOPNZ є синонімами.)

ця команда аначогічна команді LOOPE / LOOPZ, але вихід з циклу здійснює при СХ = 0 або ZF = 1 (якщо попередня команда зафіксована рівність, дача нульовий результат). Її дія:

CX: = CX-1; if (CX <> 0) and (ZF = 0) then goto <мітка>

Команда LOOPNE зазвичай використовується для пошуку в деякій послідовності першого елементу, що задану величину.

завдання:

Дано три послідовності чисел а1, а2, ..., A9, b1, b2 ..., B9, з1, з2, ..., З9. Складіть нову послідовність d1, d2, ..., D9, кожен елемент якої визначається за правилом di = Max (аi, bi, зi), Де i = 1,2, ..., 9.

Порядок виконання роботи:

1. Скласти алгоритм програми

2. Написати програму на мові Асемблера

3. Налагодити програму в Turbo Debbuger

4. Заповнити таблицю з помилками:

 допущена помилка  Повідомлення про помилку
     
     

Контрольні питання:

1. На чому заснований принцип роботи команд умовного переходу?

2. Який регістр використовується для програмування циклів з лічильником?

3. Поясніть принцип роботи команди cmp.

4. Що може бути джерелом умови, на підставі якого має прийматися рішення про те, куди буде передано управління командою умовного переходу?

Практична робота №9

Архітектура ЕОМ і обчислювальних систем

Тема: Програмування вводу-виводу

Мета роботи: Вивчити функції введення з клавіатури і виведення на екран

Засоби: Turbo Assembler, Turbo Debuger

література:

1. Фролов А. в., Фролов Г. в. Апаратне забезпечення IBM PC. - М. «Діалог МІФІ», 1992р.

2. Юров В. і. Assembler. Практикум. - СПб .: Пітер, 2001 р

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

Функції BIOS і DOS введення з клавіатури

Функція DOS 0Ah - Вважати рядок символів з STDIN в буфер

 введення:  АН = 0Ah DS: DX = адреса буфера
 висновок:  Буфер містить введений рядок

Для виклику цієї функції треба підготувати буфер, перший байт якого містить максимальну кількість символів для введення (1 - 254), а вміст, якщо воно задано, може використовуватися як підказка для введення. При наборі рядка обробляються клавіші Esc, F3, F5, BS, Ctrl-C / Ctrl-Break і т. Д., Як під час написання команд DOS (тобто Esc починає введення спочатку, F3 відновлює підказку для введення, F5 запам'ятовує поточний рядок як підказку, Backspace стирає попередній символ). Після натискання клавіші Enter рядок (включаючи останній символ CR (0Dh)) записується в буфер, починаючи з третього байта. У другій байт записується довжина реально введеного рядка без урахування останнього CR.

Функція DOS 07h - Вважати символ з STDIN без луни, з очікуванням і без перевірки на Ctrl-Break

 введення:  АН = 07h
 висновок:  AL = код символу

Функція DOS 06h - Вважати символ з STDIN без луни, без очікування і без перевірки на Ctrl-Break

 введення:  АН = 07h DL = 0FFh
 висновок:  ZF = 1, якщо не була натиснута кнопка, і AL = 00 ZF = 0, якщо клавіша була натиснута. В цьому випадку AL = код символу

Функція DOS 0Ch - Очистити буфер і вважати символ

 введення:  АН = 0Ch AL = Номер функції DOS (01, 06, 07, 08, 0Ah)
 висновок:  Залежить від викликаної функції

Функція 0Ch очищає буфер клавіатури, так що наступна функція читання символу чекатиме введення з клавіатури, а не використовувати натиснутий раніше і ще не оброблений символ. Наприклад, саме ця функція використовується для зчитування відповіді на питання «Чи впевнений користувач в тому, що він хоче відформатувати диск?».

Функції BIOS і DOS виводу на екран

Функція DOS 02h - Записати символ в STDOUT з перевіркою на Ctrl-Break

 введення:  АН = 02h DL = ASCII-код символу
 висновок:  Ніякого, згідно з документацією, але насправді: AL = код останнього записаного символу (дорівнює DL, крім випадку, коли DL = 09h (табуляція), тоді в AL повертається 20h).

Функція DOS 06h - Записати символ в STDOUT без перевірки на Ctrl-Break

 введення:  АН = 06h DL ??= ASCII-код символу (крім FFh)
 висновок:  Ніякого, згідно з документацією, але насправді: AL = код записаного символу (копія DL)

Ця функція не виконує жодних керуючі символи (CR, LF, HT і BS виконують свої функції при виведенні на екран, але зберігаються при перенаправлення виведення в файл) і не перевіряє натиснення Ctrl-Break.

Функція DOS 09h - Записати рядок в STDOUT з перевіркою на Ctrl-Break

 введення:  АН = 09h DS: DX = адреса рядка, що закінчується символом $ (24h)
 висновок:  Ніякого, згідно з документацією, але насправді: AL = 24h (код останнього символу)

Дія цієї функції повністю аналогічно дії функції 02h, але виводиться не один символ, а цілий рядок.

Функція DOS 40h - Записати в файл або пристрій

 введення:  АН = 40h ВХ = 1 для STDOUT або 2 для STDERR DS: DX = адреса початку рядка СХ = довжина рядка
 висновок:  CF = 0, АХ = число записаних байт

Ця функція призначена для запису в файл, але, якщо в регістр ВХ помістити число 1, функція 40h буде виводити дані на STDOUT, а якщо ВХ = 2 - на пристрій STDERR. STDERR завжди виводить дані на екран і не перенаправляється в файли. INT 29h: Швидке виведення символу на екран

 введення:  AL = ASCII-код символу

У більшості випадків INT 29h просто негайно викликає функцію BIOS «висновок символу на екран в режимі телетайпа», так що ніяких переваг, крім економії байт при написанні якомога коротших програм, вона не має.

Функція BIOS INТ 10h, АН = 03 - Вважати стан і розмір курсору

 введення:  АН = 03 ВН = номер сторінки
 висновок:  DH, DL = рядок і стовпець поточної позиції курсора СН, CL = перша і остання рядки курсора

Повертає поточний стан курсору на обраній сторінці (кожна сторінка використовує власний незалежний курсор).

Функція BIOS INT 10h, АН = 0Eh - Вивести символ в режимі телетайпа

 введення:  АН = 0Eh ВН = номер сторінки AL = ASCII-код символу

Символи CR (0Dh), LF (0Ah), BEL (7) інтерпретуються як керуючі символи. Якщо текст при записі виходить за межі нижнього рядка, екран прокручується вгору. Як уособлення використовується атрибут символу, який перебував в цій позиції.

Функція BIOS INT 10h, AH = 13h - Вивести рядок символів з заданими атрибутами

 введення:  АН = 13h AL = режим виводу: біт 0 - перемістити курсор в кінець рядка після виведення біт 1 - рядок містить не тільки символи, але також і атрибути, так що кожен символ описується двома байтами: ASCII-код і атрибут біти 2 - 7 зарезервірованиСХ = довжина рядка (тільки число символів) BL = атрибут, якщо рядок містить лише символи DH, DL = рядок і стовпець, починаючи з яких буде виводитися рядка ES: BP = адреса початку рядка в пам'яті

Функція 13h виводить на екран рядок символів, інтерпретуючи керуючі символи CR (0Dh), LF (0Ah), BS (08) і BEL (07). Якщо рядок підготовлена ??у форматі символ, атрибут - набагато швидше просто скопіювати її в відеопам'ять, про що розказано в наступному розділі.

завдання: Вивести на середину екрана слово, введене з клавіатури.

Порядок виконання роботи:

  1. Написати PASCAL-програму і програму на асемблері (їх зобразити так, щоб всі конструкції програм відповідали один одному).
  2. Написати команди для ассемблирования, компонування і запуску відладчика з отлаживаемой програмою.
  3. Заповнити таблицю з помилками:
 допущена помилка  Повідомлення про помилку
     
     

Контрольні питання:

  1. Які шістнадцяткові значення рядка і стовпчика відповідають нижньому правому кутку екрану 25х40?
  2. Напишіть команди для установки курсору за координатами: рядок 12, стовпець 8.

 



Команди порівняння та умовного переходу | Тема: Пластична деформація і механічні властивості металів.

Особливості складання чисел в зворотному і додатковому кодах. | Числа з фіксованою точкою. | Числа з плаваючою точкою. | Арифметичні операції над числами з фіксованою точкою | Арифметичні операції над двійковими числами з плаваючою точкою | Множення двійкових чисел | Склад обладнання | Визначення обсягу оперативної пам'яті | Команди додавання і віднімання | команди множення |

© um.co.ua - учбові матеріали та реферати