3.2.1. Ветвление программы

Рассмотрим простую задачу сравнения двух чисел. Нужно найти наибольшее и поместить его в определенную ячейку памяти (структурная схема решения этой задачи  на рис. 3.17).

В двух первых прямоугольных кадрах представлена операция загрузки двух чисел в регистры А (аккумулятор) и L (данные). Следующий прямоугольный кадр соответству

ет операции сравнения, где содержимое регистра L вычитается из содержимого регистра А. Команды сравнения не разрушают содержимого регистров, но влияют на индикатор.

Следующий кадр называется знаком принятия решения. Он завершает в программе этап решения и содержит поставленный вопрос (А)>(L)? Если ответ на этот вопрос Да, то программа продолжается последовательно и содержимое регистра А помещается в память, затем процессор останавливается. Если Нет, то программа ответвляется вправо, и содержимое регистра L помещается в память, затем процессор останавливается.

Использование знаков принятия решения приводит в программах к тому, что называется внутренним ветвлением программы.

В табл. 3.9 представлена на ассемблере задача, которую мы только что описали и в которой наибольшее число помещено в ячейку памяти 2040Н. Заметим, что здесь аккумулятор А загружен числом 15Н, а регистр L – числом 6Н.

Сравнивая содержимое регистров (А) и (L) (третья команда в этом примере), находим, что (А)>(L), и, следовательно, индикатор переноса (СУ) сброшен в 0. Команда перехода (мнемоника JC в примере) проверяет индикатор переноса и находит (СУ)=0.

Микропроцессор обращается тогда к следующей последовательной команде ПОМЕСТИТЬ (А) в память по адресу 2040Н и наибольшее число помещено в память по адресу 2040Н командой STA. Затем МП останавливается (команда HLT).

Три последние команды не были использованы в этом примере. Если обратиться к рис. 3.17, то мы установим, что программа прошла последовательно.

Рассмотрим теперь выполнение такой же программы, но в случае, когда содержимое аккумулятора меньше содержимого регистра L. Программа остается та же (табл. 3.9). Содержимое аккумулятора-0АН (1010) и регистра L-0ЕН (1410) здесь больше. Команда сравнения устанавливает индикатор СУ в 1, так как (А)<(L). Команда ПЕРЕЙТИ, если индикатор переноса установлен в 1 (JC здесь), проверяет индикатор СУ и определяет, установлен ли он. При этом изменяется содержимое счетчика команд, то есть загружается адрес следующей выполняемой команды (STORE L в нашем примере). Заметим, что МП перешел через две команды для того, чтобы обратиться туда, где находится символический адрес STORE L. Микропроцессор выполняет тогда три последние команды, которые помещают содержимое регистра L, то есть наибольшее число 0ЕН в ячейку памяти по адресу 2040Н. Обратившись к схеме на рис. 3.17, мы установим, что программа выполнена последовательно до знака принятия решения, затем ответвилась вправо, заканчиваясь оператором СТОП.

Рассмотрим снова три последние команды в табл. 3.9. Целью этих команд является размещение содержимого регистра L в память по адресу 2040Н. Наш микропроцессор не позволяет поместить содержимое регистра L прямо в память. Нужно последовательно передать сначала содержимое L в А, затем поместить содержимое А в память.

Таблица 3.9 Ветвящаяся программа на ассемблере

Подпись:

Таким образом, часто оказывается, что МП с ограниченным составом команд использовать сложнее, чем устройства, более мощные по своим возможностям.          

Таким образом, рассмотренный на структурной схеме способ ветвления осуществляется командами перехода (или ветвления), согласно которым принимаются решения, основанные на состоянии специальных индикаторов. Мы встретились здесь с использованием символического адреса (метки) при команде перехода. Ветвление очень широко используется при программировании.