Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по практике ЭВМ и ПУ.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
12 Мб
Скачать
☆

8.4 Составление нелинейных программ на языке Assembler.

Нелинейные программы подразумевают наличие условий, в зависимости от их выполнения или нет выбирается порядок выполнения программы. Кроме того, к нелинейным программам относятся программы с циклами.

Рассмотрим пример программы с условием.

Задача. Проанализировать содержимое младшего разряда числа, хранящегося в регистре В. Если оно равно нулю, то к содержимому регистра В следует прибавить содержимое регистра С, если оно равно единицы, то к содержимому регистра В нужно прибавить содержимое регистра D. Результат записать в регистр В.

Решение данной задачи сразу представим в виде блок – схемы (рисунок 7).

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

В таких задачах, прежде чем писать программу желательно сначала присвоить всем командам адреса ячеек памяти, где они будут храниться. На рисунке 7 они расставлены с учетом количества байт, которое содержит каждая команда. Количество байт можно узнать из таблицы 1. Назначение и структура почти всех команд алгоритма на рисунке 7 были рассмотрены выше. Новыми командами являются команды передачи управления. В данной программе встречаются два вида команд передачи управления: условной (УПУ) и безусловной (БПУ).

В данном примере команда УПУ применяется при определении состояния младшего разряда числа, которое хранилось в регистре В. Условие выполняется по стоянию триггера Тс Команда условие может быть выбрана по нулю и по единице. На рисунке 7 выбрана команда УПУ по единице. Смысл заключается в следующем. Если условие по единице выполняется, т. е. в триггере Тс единица, то следующей выполняется команда, хранящаяся в ячейке памяти, адрес которой записан во втором и третьем байте команды. В данном примере будет выполнятся команда, которая хранится в ячейке памяти 0059. То есть, если в триггере Тс записана единица, то в регистр А записывается число из регистра D.

Рисунок 7 – Алгоритм выполнения программы с условием

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

Ранее говорилось, что при загрузки программы в ОЗУ, все команды записываются в ячейки памяти с порядковыми по возрастанию адресами. Команды выбираются по порядку из ячеек памяти. Из алгоритма, показанного на рисунке 7 видно, что после загрузки в аккумулятор числа из регистра С (команда из ячейки памяти 0055) или из регистра D (команда из ячейки памяти 0059) должна выполнятся команда сложения содержимого аккумулятора с содержимым регистра В. Значит, команда сложения должна находиться в следующей ячейке памяти и по отношению к команде в ячейке памяти 0055 и по отношению к команде в ячейке памяти 0059. Но это не возможно, или программа будет громоздкой и занимать много места. Поэтому можно использовать команду безусловной передачи управления (БПУ). Команда сложения находиться в соседней ячейке памяти (005А) после команды пересылки (0059). Но эта же команда сложения находится не в соседней ячейки памяти по отношению к команде пересылки (адрес 0055). Для того, что бы сохранить последовательность выполнения команд в программе, после команды пересылки поставлена команда БПУ. Она трехбайтовая. Во втором и третьем байтах находится адрес той команды, которая должна выполнятся следующей. В нашем случае, в этих байтах будет храниться адрес 005А. Если команды БПУ не будет, то смениться адресация команд в программе, но будет нарушена логика выполнения программы.

В таблице 4 показана программа выполнения алгоритма, показанного на рисунке 7. Команда RRC выбрана произвольно, т. к. в данной программе не важно какой сдвиг, с учетом триггера Тс или без него. Команда JC относится к группе команд «Операций перехода» (таблица 1). Все команды этой группы, за исключение команды БПУ (JMP), имеют общий формат 11К4010. Все эти команды трехбайтовые. Во втором и третьем байте всегда пишется адрес ячейки памяти, где хранится команда, которая должна выполнятся следующей. Для каждого триггера регистра признаков предусмотрено две команды, одна по нулю, другая по единице.

Таблица 4

Адрес хранения команды

Мнемоника

Структура

Описание

2 - ая

16 - ая

0050

MOV A, В

01111000

78

0051

RRC

00001111

0F

Сдв. в П (А)

0052

JC

11011010

DA

УПУ по Тс = 1

0053

-

01011001

59

В2 = 59

0054

-

00000000

00

В3 = 00

0055

MOV A, С

01111100

79

0056

JMP

11000011

C3

БПУ

0057

-

00001010

0А

В2 = 0А

0058

-

00000000

00

В3 = 00

0059

MOV A, D

01111010

7A

005A

ADD В

10000000

80

005B

MOV В, A

01000111

47

Рассмотрим построение программ с организацией циклов.

Задача. Выполнить умножение двух восьмиразрядных чисел.

Решение. Пусть множимое хранится в регистре D, множитель в аккумуляторе. Произведение будет формироваться в паре регистров HL. Будем анализировать разряды множителя, начиная с его старшего разряда. Поэтому, полученные частные произведения, начиная с восьмого, будут прибавляться к содержимому пары регистров HL. После каждого суммирования частного произведения, содержимое пары регистров HL будет сдвигаться влево путем удвоения их содержимого. Весь этот процесс должен повториться восемь раз. Поэтому необходим счетчик. Его можно организовать на каком – либо регистре, например В. В него записывается число восемь. После каждого цикла значение счетчика уменьшается на единицу и содержимое регистра проверяется на нулевое значение. Как только в регистре В будет ноль, то происходит выход из цикла.

На рисунке 8 показан алгоритм умножения двух чисел. Первая команда в алгоритме позволяет организовать счетчик, загрузив в регистр В число восемь. Дальше начинается цикл. Он начинается с того, что происходит сдвиг содержимого пары регистров HL вправо, путем удвоения. Но в системе команд для МПК КР580 нет команды умножения на два. Но есть команда сложения содержимого пары регистров HL с любой другой парой регистров, в том числе и с собой. Эта команда DAD, которая находиться в группе команд «Арифметических операций» (таблица 1). Поэтому удваивать содержимое пары регистров HL путем сложения их содержимого с самим собой. Сдвиг в лево осуществляется для того, что бы через триггер Тс определить состояние разряда: ноль или единица. Потом используется команда УПУ по нулю. Если условие не выполняется, т. е. разряд множителя равен единице, то к содержимому пары регистров HL прибавляется содержимое регистра D. Но поскольку складывать содержимое одного регистра и пары регистров нельзя, то складывается пара регистров HL с парой регистров DE.

Если условие по нулю выполняется, т. е. разряд множимого равен нулю, то прибавлять к паре регистров ни чего не надо, т. к. частное произведение будет равно нулю. Поэтому команда УПУ передаст управление команде уменьшения значения регистра В. Это обозначает, что прошел один цикл выполнения умножения. Значит, значение счетчика уменьшается на единицу. После этого содержимое регистра (счетчика) проверяется на наличие нуля с помощью триггера нуля (ТZ). Напомним, что этот триггер принимает значение единицы в том случае, если в каком – либо регистре появляется нулевое значение. В данном случае команда УПУ берется по нулю. Если условие выполняется, и в триггере Тz нулевое значение, т. е. значение счетчика не равно нулю, то команда УПУ передает управление команде, хранящейся в ячейке памяти с адресом 0052, где хранится команда сдвига пары регистра HL. Таким образом, выполнение программы повторяется.

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

В таблице 5 приведена программа, реализующая алгоритм, показанного на рисунке 8.

Команда DAD имеет свою особенность в структуре. Если посмотреть на ее мнемонику, то после самой команды указывается регистр, который стоит вторым в паре. Так команда, которая хранится в ячейке памяти 0057, осуществляет сложение пары регистров HL с парой регистров DE. В мнемонике этой команды показано DAD E, т. е. указан второй регистр в паре DE. Структуру и принцип работы остальных команд был разобран выше.

Рисунок 8 – Алгоритм умножения восьмиразрядных чисел

Таблица 5

Адрес хранения команды

Мнемоника

Структура

Описание

2 - ая

16 - ая

0050

MVI В

00000110

06

0051

-

00001000

08

B2 = 08

0052

DAD L

00101001

29

0053

RLC

00000111

07

Сдв. в Л (А)

0054

JNC

11010010

D2

УПУ по Тс = 0

0055

-

01011000

58

В2 = 58

0056

-

00000000

00

В3 = 00

0057

DAD E

00011001

19

0058

DCR B

00000101

05

0059

JNZ

11000010

C2

УПУ по Тz = 0

005A

-

01010010

52

В2 = 52

005B

-

00000000

00

В3 = 00