Смекни!
smekni.com

Структурне програмування на асемблері (стр. 3 из 4)

...

$ENDDO LOOP

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

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

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

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

- Оператор $ENDDO LOOPZ є альтернативною формою оператора $ENDDO LOOPE.

- Оператор $ENDDO LOOPNZ є альтернативною формою оператора $ENDDO LOOPNE.

ОПЕРАЦІЇ AND І OR

Операція AND завершує цикл, якщо декілька умов виконуються одночасно, а операція OR завершує цикл, якщо виконується будь-яка з кількох умов. Наприклад, нижче показана загальна форма структури DO, що завершує цикл, якщо у відповідь на запрошення до вводу користувач відповість "Ні", набравши на клавіатурі "Н" або "н":

$DO

...

...

(Видати на екран ”Продовжити? (Д/Н)”)

(Зчитати відповідь користувача в перемінну ANSWER)

СМР ANSWER,”Н”

$ENDDO E,OR

СМР ANSWER,”н”

$ENDDO E

СТРУКТУРА SEARCH

Структура SEARCH (шукати) схожа на структуру DO, але передбачає два різних варіанти завершення циклу: успішний і неуспішний. Це зручно для тих додатків, де потрібно знати, яка з умов привела до завершення циклу. Наприклад, Вам може бути необхідно дізнатися, завершилася операція вводу-виводу успішно чи була припинена через виникнення помилки.

Як і структура DO, структура SEARCH має три форми:

- Структура SEARCH UNTIL (шукати ... до) повторює блок команд доти, поки одна з двох умов в кінці цього блока не стане істинною.

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

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

СТРУКТУРА SEARCH UNTIL

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

$SEARCH-

А (Основний блок)

$EXITIF умова1

В (Якщо умова1 істинна, то виконати і

Вийти з циклу)

$ORELSE

С (Якщо умова1 хибна, то виконати) $ENDLOOP умова2

D (Якщо умова2 істинна, то виконати і

Вийти з циклу)

$ENDSRCH

де умова1 і умова2 -- умови завершення циклу. Тут умова1 відповідає успішному завершенню (Ви знайшли те, що шукали), а умова2 -- неуспішному. На мал. 3, a показана блок-схема структури SEARCH UNTIL.

Врахуйте, що основний блок А завжди виконується принаймні один раз. Блоки В і D виконуються відповідно при успішному і неуспішному завершенні операцій (Ви можете користуватися ними для видачі повідомлень), а блок С містить команди, що встановлюють значення флагів для перевірки оператором $ENDLOOP.

Наприклад, в екзаменаційній програмі можна скористатися структурою SEARCH UNTIL і дати студенту три спроби вибрати з запропонованих йому варіантів відповіді правильний. Її застосування може мати такий загальний вид:

MOVE СХ,3 ;Встановити лічильник

(Зобразити на екрані питання)

$SEARCH

(Прочитати відповідь студента)

(Встановити ZF == 1, якщо відповідь правильна)

$EXITIF Z

(Зобразити на екрані "Поздоровляємо, Ви праві” )

$ORELSE

(Зобразити на екрані "Вибачте, Ви помилились, спробуйте знову")

$ENDLOOP LOOP

(Зобразити на екрані 'Всі три відповіді неправильні')

(Зобразити на екрані "Правильна відповідь:" і

вказати відповідь”

$ENDSRCH

СТРУКТУРА SEARCH WHILE

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

$SEARCH

$LEAVE умова1

А (Якщо умова1 хибна, то виконати)

$EXITIF умова2

В (Якщо умова2 істинна, то

Виконати і вийти з циклу)

$OREELSE

C (Якщо умова2 хибна, то виконати)

$ENDLOOP

D (Якщо умова1 істинна, то виконати і

вийти з циклу)

$ENDSRCH

Через те, що структура SEARCH WHILE здійснює перевірку до виконання інших операторів, то її можна використовувати для обходу всієї структури, якщо початкові умови не виконані. Наприклад, що наступний фрагмент здійснює пошук у таблиці першого нульового значення і обходить пошук, якщо таблиця порожня:

MOV СХ,TABLE LENGTH ;Встановити лічильник

MOV ВХ,0 ;Зупинити вказівник на перший елемент

$SEARCH

$LEAVE CXZ

СМР ТABLE[ВХ],0 Порівняти з нулем

$EXITIF E

(Зобразити на екрані Знайдено нуль )

$OPELSE

INC ВX

$ENDLOOP LOOP

(Зобразити ”Нулів немає”)

$ENDSRCH

СТРУКТУРА SEARCH COMPLEX

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

$SEARCH

A

$ЕХIТIF умова1

В (Якщо умова1 істинна, то виконати і

вийти з циклу)

$ORELSE

С (Якщо умова1 хибна, то виконати)

$LEAVE умова2

D (Якщо умова2 хибна, то виконати) $ENDLOOP

Е (Якщо умова2 істинна, то виконати і вийти з циклу)

$ENDSRCH

На мал. 3, в показана блок-схема структури SEARCH COMPLEX. Звернемо увагу на те, що структура SEARCH COMPLEX аналогічна структурі SEARCH UNTIL, але виконує додатковий блок. D, якщо умова 2 хибна.

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

Деякі оператори структури SEARCH можуть мати додаткові операнди типу тих, що описувалися для структур IF і DO. Вони мають такі загальні форми:

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

$ORELSE [LONG]

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

$ENDLOOP [LOOPx],[LONG]

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

Єдиний новий операнд -- NUL, що можна використовувати в сполученні з оператором $EXITIF у ситуації, коли в структурі SEARCH треба пропустити блок В (успішний пошук). Звичайно, якщо блока В немає, то можна пропустити й оператор $ORELSE. Структура функціонує і в тому випадку, якщо блок В порожній, але вказівка операнда NUL прискорює її виконання.

Таблиця 2. Допустимі використання умов NCXZ і CXZ

Структурний оператор NCXZ CXZ
$IF умова

Так

Ні

$IF умова, OR

Ні

Так

$IF умова, AND

Так

Ні

$LEAVE умова

Ні

Так

$LEAVB умова, OR

Ні

Так

$LEAVE умова, AND

Так

Ні

$EXITIF умова

Так

Ні

$EXITIF умова, AND

Так

Ні

$EXITIF умова, OR

Ні

Так

$EXITIF умова, AND, NUL

Так

Ні

$EXITIF умова, OR, NUL

Ні

Так

$EXITIF умова, NUL

Ні

Так

$ENDLOOP умова

Так

Ні

$ENDLOOP умова, AND

Так

Ні

$ENDLOOP умова, OR

Ні

Так

$ENDDO умова

Так

Ні

$ENDDO умова, AND

Так

Ні

$ENDDO умова, OR

Ні

Так

ОБМЕЖЕННЯ НА ВИКОРИСТАННЯ УМОВ NCXZ І CXZ

Як згадувалося вище, програма SALUT транслює структурні оператори в їхні еквіваленти на мові асемблера. Зокрема, вона перетворить умовні оператори в команди Jx або JMP, а оператори $ENDIF, $DO, $SEARCH і $ENDSRCH -- у мітки. При цьому програма SALUT у багатьох випадках повинна перетворювати умовний оператор у протилежну команду умовної передачі керування. Наприклад, вона перетворить оператор $IF А в команду JNA L1 (де L1 -- мітка, що стоїть на місці оператора $ENDIF). Але через це при застосуванні умови CXZ можуть виникнути проблеми, оскільки команди JNCXZ немає. У табл. 2 перераховані ті оператори, в яких можуть використовуватися умови CXZ і NCXZ, і вказано, в яких випадках ці умови допустимі.

УПОРЯДКУВАННЯ СТРУКТУРОВАНИХ ПРОГРАМ

ПРОЦЕДУРА

При впорядкуванні структурованих програм можна користуватися тими ж прийомами, що і при впорядкуванні звичайних програм, із тією лише різницею, що текст програми треба опрацювати програмою SALUT для перетворення структурних операторів у стандартні команди на асемблері. Крім того, програма SALUT буде формувати вашу вихідну програму, розташовуючи елементи операторів по визначених стовпчиках. Таким чином, треба виконати такі кроки:

1. Набрати текст програми за допомогою редактора. Дати йому ім'я виду ім'я_файла. SAL, де SAL -- абревіатура від Structured Assembly Language (структурована мова асемблера).

2. Опрацювати файл типу SAL програмою SALUT. В результаті отримається файл з форматованою вихідною програмою ім'я_файла. SAL і проміжний робочий файл ім'я_файла. ASM. програма SALUT перейменує створений вами файл з неформатованою програмою в ім'я_файла. BAK.

3. Відтранслюйте проміжний робочий файл за допомогою Асемблера.

4. Знищити проміжний робочий файл типу ASM. При бажанні можна видалити і файл типу BAK.

5. Скористайтеся завантажувачем для створення виконуваного модуля.

РОЗРОБКА СТРУКТУРОВАНИХ ПРОГРАМ МЕТОДОМ «ЗВЕРХУ ВНИЗ»

Відповідно до методу розробки “зверху вниз” програма формується послідовною вставкою деталей у її початковий текст (що складається частіше всього лише з коментарів). Цей метод можна застосувати і для розробки структурованих програм. Для цього спочатку потрібно набирати керуючі оператори логічних структур, а потім вставляти команди, що повинні бути між ними. Щоб побудувати, наприклад, структуру IF, треба почати з операторів