REFERATUA.ORG.UA — База українських рефератів



Головна Інформатика, комп'ютери, програмування → СТРУКТУРНЕ ПРОГРАМУВАННЯ НА МОВІ АСЕМБЕЛЕРА

складний оператор.)

За допомогою команд, що слідують за першим оператором $IF, забезпечується установка флагу (або флагів) для другого оператора $IF. Наприклад, для видачі повідомлення "Вага в нормі", якщо значення WEIGHT знаходиться між 31 і 34, треба використовувати оператори

СМР WEIGHT,31

$IF AE,AND

СМР WEIGHT,34

$IF BE

(видати повідомлення "Вага в нормі")

$ENDIF

Звичайно, ми можемо включити сюди і ELSE, щоб виконати визначені дії (наприклад, видачу повідомлення "Вага за межами норми"), якщо одна з умов не виконується.

Нижче приводиться загальний вигляд оператора $IF, в якому умови пов'язані з операцією OR:

... (Обчислити умову1)

...

$IF умова1,OR

... (Обчислити умову2)

$IF умова2

... (умова1 або умова2 виконана)

$ENDIF

Тут мікропроцесор виконає команди обчислення умови2 тільки в тому випадку, якщо умова1 виявиться невиконаною.

ДАЛЬНІ ПЕРЕДАЧІ КЕРУВАННЯ

Через те що програма SALUT заміняє оператори $IF і $ELSE на команди Jx і JMP типу SHORT (тобто команди короткої передачі керування), то розмір блоку команд не може перевищувати 127 байт, тобто біля 50-60 команд, що звичайно не є істотним обмеженням. Проте у випадку, якщо наша структура IF включає багато команд, то треба присвоїти операторам $IF або $ELSE атрибут LONG.

Наприклад, можна вказати

$IF A,LONG

Атрибут LONG змушує програму SALUT замінити оператор $IF А на команди

JA $$XL1

JMP $$IF1

$$XL1:

замість команди JNA $$IF1.

СТРУКТУРА DO

  • Структура DO змушує мікропроцесор повторювати блоки команд до тих пір, поки не виконається задана умова. Існують такі три її форми: структура DO UNTIL (виконувати ... до) повторює блок команд до тих пір, поки умова вкінці цього блока не стане істинною.

  • Структура DO WHILE (поки не ..., виконувати) повторює блок команд, поки умова на початку цього блоку не стане істинною. (Іншими словами, вона виконує блок, поки умова не виконується). Якщо початкова умова істинна, то вона пропускає блок, жодного разу не виконавши його.

  • Структура DO COMPLEX (виконувати комплексно) являє собою комбінацію структур DO UNTIL і DO WHILE, що включає в себе два блоки команд. Вона виконує перший блок, потім перевіряє умову. Якщо вона істинна, то виконується другий блок і процес повторюється ще раз; у протилежному випадку другий блок пропускається і цикл завершується.

Примітка. Слова UNTIL (до), WHILE (поки) і COMPLEX (комплексно) використані лише для того, щоб допомогти розрізнити ці три форми структури DO.

СТРУКТУРА DO UNTIL

Ця структура має загальний вигляд

$DO

A

$ENDDO умова

де умова -- це умова припинення циклу. Так як мікропроцесор перевіряє умову в кінці циклу, то команди блоку А завжди виконуються не менше одного разу. На мал. 2, а показана блок-схема, що описує дію структури DO UNTIL.

Структура DO UNTIL часто використовується для повторення команд в залежності від значення лічильника в регістрі СХ. Наприклад

MOV CX,10

$DO

... (Ці команди будуть повторюватися 10 разів)

...

$ENDDO LOOP

Тут команда LOOP зменшує вміст регістра СХ на одиницю і повертає керування оператору $DO, якщо значення регістра СХ відмінне від нуля. Еквівалентом на мові Бейсік є оператори

FOR X=10 TO 1 STEP -1

...

...

NEXT X

СТРУКТУРА DO WHILE

Ця структура має загальний вигляд

$DO

$LEAVE умова

A

$ENDDO

дСТРУКТУРНЕ ПРОГРАМУВАННЯ НА МОВІ АСЕМБЕЛЕРА
е умова -- це умова завершення циклу. На мал. 2, б показана блок-схема структури DO WHILE.

Звернемо увагу на те, що в структурі DO WHILE умова перевіряється перед командами циклу, а не після них, як це відбувається в структурі DO UNTIL. Отже, якщо початкова умова істинна, то мікропроцесор обходить цикл, не виконавши його ні разу. Структура DO WHILE ніби сигналізує мікропроцесору: "Виконуй наступні команди, поки умова не виконується".

Потрібно користуватися структурою DO WHILE для обходу циклу, організованого за допомогою лічильника в регістрі СХ, якщо регістр СХ вже містить нуль, наприклад

$DO

$LEAVE CXZ

...

...

$ENDDO LOOP

СТРУКТУРА DO COMPLEX

Структура DO COMPLEX схожа на структуру DO WHILE, але дозволяє Вам виконати деякі дії як до перевірки в операторі LEAVE, так і після її. Тим самим забезпечується вихід із середини циклу. Ця структура має такий загальний вигляд:

$DO

А

$LEAVE умова

У

$ENDDO

Як і раніше, умова являє собою умову завершення циклу. На мал.2, в показана блок-схема структури DO COMPLEX.

Тут блок команд А підготовляє умову, а блок команд В виконує те, що потрібно зробити, якщо умова не виконується. Наприклад, для зупинки програми доти, поки користувач не введе правильний пароль, можна скористатися таким прийомом:

$DO

(видати на екран "Будь ласка, введіть ваш пароль:")

(Перевірити пароль. Якщо він правильний, покласти флаг CF

рівним 1.)

$LEAVE CF

(видати на екран "Ви схибили. спробуйте ще раз" )

$ENDDO

ДОДАТКОВІ ОПЕРАНДИ

Подібно до оператора $IF, що описаний в розд. 2, оператори $ENDDO і $LEAVE допускають вказівку операції AND (И) або OR (АБО), що дозволяє комбінувати умови. Крім того, в них можна вказувати атрибут LONG, що забезпечує можливість користуватися довгими блоками команд. Нарешті, в операторі $ENDDO можна вказувати параметр LOOP, що позбуває від необхідності зменшувати значення регістра СХ. Загальна форма цих операторів

$ENDDO [умова[,AND/OR]][,LONG]

$ENDDO [LOOPx][,LONG]

$LEAVE умова[,AND/OR][,LONG]

ПАРАМЕТР LOOP

Для циклів із заданим числом повторень, лічильником яких служить регістр СХ, у програмі SALUT можна за рахунок застосування форми $ENDDO LOOP опустити команду DEC СХ. Інакше кажучи, замість форми

$DO

...

...

DEC CX

$ENDDO CXZ

Можна використовувати більш просту форму

$DO

...

...

$ENDDO LOOP

Вона змушує програму SALUT замінити оператор $DO на мітку, а оператор $ENDDO -- на команду LOOP мітка. Команда LOOP зменшує значення регістра СХ на 1 і змушує мікропроцесор передати керування мітці, якщо значення СХ не нуль.

Щоб врахувати при ухваленні рішення про закінчення циклу стан флага нуля ZF, користуємося одним із таких операторів:

  • Оператор $ENDDO -- зменшує значення регістра СХ і повертає керування на початок циклу, якщо значення регістра СХ не дорівнює 0 і прапор ZF дорівнює 1. Це дозволяє виявляти перший ненульовий результат у серії операцій.

  • Оператор $ENDDO LOOPNE зменшує значення регістра СХ і повертає керування на початок циклу, якщо значення регістра СХ не


 
Загрузка...