Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие МИУС.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
865.51 Кб
Скачать
      1. Метод бинарных функций

Метод бинарных функций предлагает поэтапный способ решения задач путем их разбиения на более простые, причем сложность каждой из последних должна быть строго меньше исходной. В случае с вычислением ФАЛ можно поступить следующим образом. Предположим, что нам известно значение одной из переменных ФАЛ. Тогда, подставив это значение в функцию ее можно упростить. В качестве пример возьмем ФАЛ

Допустим мы узнали, что . Тогда

Если же мы узнали, что , то

Задача распалась на 2 подзадачи, сложность каждой из которых строго меньше исходной. В случае, если какая-либо из подзадач не является тривиальным выражением (т.е. по-прежнему содержит входные переменные), к ней следует снова применить описанные манипуляции: взять какую-либо из переменных, сначала задаться её нулевым значением, упростить, затем задаться единичным и т.п.

Таким образом, метод бинарных программ позволяет свести сколь угодно сложную ФАЛ к набору тривиальных задач. Алгоритм реализации этого метода для ОМЭВМ cостоит из 2 стадий:

  1. Составить граф бинарных переходов:

    1. Выбрать любую из переменных в составе ФАЛ.

    2. Задаться единичным значением переменной, подставить его в исходную ФАЛ, упростить.

    3. Задаться нулевым значением переменной, подставить его в исходную ФАЛ, упростить.

    4. Отразить полученные расчеты в графе.

    5. В случае, если какая-либо из полученных в результате упрощения ФАЛ не является тривиальной, применить к ней этот алгоритм, начиная с пункта (a).

  2. На основе полученного графа, составить программу.

    1. Задаться интерфейсом микропроцессорной системы. Этот шаг аналогичен шагу в предыдущем алгоритме, использующем метод непосредственного вычисления ФАЛ.

    2. Расставить метки. По одной для единичного и нулевого результата функции и по одной для каждой вершины графа бинарных переходов.

    3. Под метками единичного и нулевого результата записать последовательность мнемоник ассемблера, записывающую в выход единицу и нуль соответсвенно и осуществляющую безусловный переход к начальной вершине графа.

    4. Под метками вершин записать последовательность мнемоник ассемблера, осуществляющую условные переходы по исходящим ребрам вершины.

Достоинством метода являются: 1) пониженная по сравнению с методом непосредственного вычисления ФАЛ вычислительная сложность 2) отсутствие потребности в месте для хранения промежуточных результатов. Недостатком метода является его относительная сложность и трудоемкость составления графа бинарных переходов.

В качестве примера вычислим ту же ФАЛ, что и в разделе 2.2.1:

Допустим, что . Тогда

Допустим, что . В таком случае

Отразим это в графе бинарных переходов:

Далее рассмотрим аналогичным образом рассмотрим левое выражение

:

:

Граф примет вид:

Теперь можно поступить двояко: 1) начать рассматривать правую ветку исходной ФАЛ или 2) выражение . Рассмотрим вариант 1).

:

:

Граф примет вид:

Рассмотрим выражение .

:

:

Осталось выражение d, применение метода к которому тривиально и здесь не приводится. Готовый граф бинарных переходов примет вид:

Этот граф решает поставленую задачу. Тем не менее, можно заметить, что проверка переменной b осуществляется 2 раза. Действительно, если начать с рассмотрения переменной b, то получим более оптимальный вариант, в котором максимальное число проверок переменных будет снижено.

Итак, граф бинарных переходов получен. Перейдем ко второму этапу. Программу будем составлять на основе первого полученного графа.

Интерфейс аналогичен описанному в разделе 3.1

#define IN_A PORTB, 0

#define IN_B PORTB, 1

#define IN_C PORTB, 2

#define IN_D PORTB, 3

#define OUT_F PORTC, 0

Расставим метки:

out_1:

out_0:

check_a:

check_b1:

check_b2:

check_c:

check_d:

Запишем код для единичного и нулевого результатов:

out_1:

bsf OUT_F

goto check_a

out_0:

bcf OUT_F

goto check_a

Запишем условные переходы под каждой из вершин:

check_a:

btfsc IN_A

goto check_b1

goto check_b2

check_b1:

btfsc IN_B

goto out_1

goto check_c

check_b2:

btfsc IN_B

goto out_1

goto out_0

check_c:

btfsc IN_C

goto out_1

goto check_d

check_d:

btfsc IN_D

goto out_1

goto out_0

Полный исходный текст примера приведен в приложении Б.