В анализе ТЗ было указано, что в микропроцессоре КР580ВМ80 отсутствуют команды многобайтного умножения и деления двоичных чисел. Поэтому были рассмотрены и выбраны методы программного вычисления данных операций.
Таким образом, исходя из обобщенного алгоритма программы и методов, описанных в предыдущем разделе, можно разработать алгоритмы, выполняющие вычисление заданной функции.
Для реализации умножения был выбран метод вычисление произведения при помощи сдвига множимого и сложения частичных результатов сдвига. Алгоритм умножения приведен на рисунке 2.
Рисунок 2 - Алгоритм вычисления 25·X1.
В алгоритме применены следующие обозначения:
X1 - множимое;
P - частичная сумма (произведение);
S - промежуточный результат сдвига;
S<< - сдвиг влево с переносом числа S;
С - счетчик сдвигов
Для реализации деления был выбран метод со сдвигом остатка влево.
Алгоритм деления приведен на рисунке 3.
Рисунок 3 - Алгоритм деления двух чисел методом сдвигом остатка влево
В алгоритме применены следующие обозначения: D - частное; K - остаток от деления; X1 - делимое; X2 - делитель; С - счетчик бит; N - количество бит в делимом; B - текущий бит делимого; E - инвертированный признак займа при вычитании делителя из остатка.
Для работы вышеописанных алгоритмов, необходимо также разработать алгоритмы многобайтного сложения, вычитания и сдвига влево.
Алгоритм многобайтного сложения приведен на рисунке 4.
Рисунок 4 - Алгоритм сложения многобайтных чисел X и Y.
В алгоритме применены следующие обозначения:
Tc - признак переноса;
N - количество байт в числе;
Xc - с-ый байт числа X;
Yc - с-ый байт числа Y;
С - счетчик байт;
Алгоритмы многобайтного сдвига влево и вычитания аналогичны алгоритму на рисунке 4, только вместо операции сложения используются соответственно операции сдвига и вычитания.
Из общей блок-схемы алгоритма на рисунке 1, а также из блок-схем на рисунках 2 и 3 видно, что алгоритмы сложения, вычитания и сдвига применяются в программе несколько раз, поэтому с целью минимизации объема программы, данные алгоритмы будут реализовываться в виде подпрограмм.
Таким образом, используя разработанные алгоритмы можно составить структурную схему алгоритма программы для микропроцессора КР580ВМ80.
Структурная схема алгоритма программы приведена в приложении и состоит из четырех частей.
Первая часть - основная программа, в которой выполняются следующие действия:
В блоке 1.1 выполняется инициализация указателя стека;
в блоке 1.2 загружается число x1 в переменную tmp1, tmp3 и tmp4;
в блоке 1.3 обнуляется пятый байт переменных tmp1, tmp3 и tmp4;
в блоке 1.4 загружается число x2 в переменную tmp2 и обнуляется пятый байт переменной tmp2;
в блоке 1.5 вызывается подпрограмма многобайтного сложения чисел в переменных tmp4 и tmp2, результат записывается в переменную tmp4;
в блоке 1.5 вызывается подпрограмма умножения чисел в переменных tmp1 и tmp2, результат записывается в переменную tmp3;
блоки 1.6-1.12 соответствуют функциональному алгоритму на рисунке 2 (умножение x1 на 25):
в блоке 1.6 загружается число сдвигов в регистр C и в блоках 1.7-1.9 выполняется цикл сдвига на 3 разряда с учетом переноса, сдвиг на один разряд многобайтного числа выполняется при помощи подпрограммы в блоке 1.7;
в блоке 1.10 выполняется сложение результата сдвига (в переменной tmp1) и числа x1 (в переменной tmp3), результат сохраняется в tmp3;
в блоке 1.11 выполняется еще один сдвиг влево на один разряд числа в tmp1;
в блоке 1.12 вычисляется окончательный результат умножения путем сложения чисел в tmp1 и tmp3, результат сохраняется в tmp3;
в блоках 1.13-1.22 выполняется деление числа в переменной tmp4 (сумма x1 и x2) на число в tmp3 (произведение 25 и x1), результат записывается в tmp1: в блоке 1.13 обнуляются переменные частного tmp1 и остатка tmp2, в регистр С загружается количество бит в делимом (40) и сбрасывается признак переноса, далее идет цикл деления (блоки 1.14-1.22): делимое сдвигается влево (блок 1.14), остаток сдвигается влево (блок 1.15), из остатка вычитается делитель (блок 1.16) и если результат меньше нуля (блок 1.17), остаток восстанавливается (блоки 1.18), далее вычисляется очередной бит частного (блок 1.19) и частное сдвигается влево (блок 1.20), уменьшается на один число в регистре С (блок 1.21), выход из цикла происходит если в регистре С ноль (блок 1.22);
в блоке 1.23 значение функции в переменной tmp1 сохраняется в переменную y.
Вторая часть - подпрограмма сложения двух 5-и байтных двоичных чисел, адреса которых находятся в регистровых парах HL и DE соответственно. Результат помещается в ячейках памяти на место первого числа.
В блоке 2.1 сбрасывается признак переноса, в блоке 2.2 в регистр В загружается количество байт в числах, далее идет цикл сложения (блоки 2.3-2.9): байт второго числа загружается в аккумулятор (блок 2.3), складывается с первым числом (блок 2.4) и с признаком переноса, и сохраняется в память (блок 2.5), увеличиваются адреса байт (блоки 2.6,2.7), уменьшается на один число в регистре B (блок 2.8), выход из цикла происходит, если в регистре B ноль (блок 2.9).
Третья часть - подпрограмма вычитания двух 5-и байтных двоичных чисел, адреса которых находятся в регистровых парах HL и DE соответственно. Результат помещается в ячейках памяти на место второго числа.
В блоке 3.1 сбрасывается признак переноса, в блоке 3.2 в регистр В загружается количество байт в числах, далее идет цикл вычитания (блоки 3.3-3.9): байт второго числа загружается в аккумулятор (блок 3.3), из него вычитается байт первого числа и признак переноса (блок 3.4), и результат сохраняется в память (блок 3.5), увеличиваются адреса байт (блоки 3.6,3.7), уменьшается на один число в регистре B (блок 3.8), выход из цикла происходит, если в регистре B ноль (блок 3.9).
Четвертая часть - подпрограмма сдвига влево с учетом переноса 5-и байтового двоичного числа, адрес которого находится в регистровой паре HL:
В блоке 4.1 в регистр В загружается количество байт в числе, далее идет цикл сдвига (блоки 4.2-4.7): байт числа загружается в аккумулятор (блок 4.2), сдвигается (блок 4.3) и сохраняется в память (блок 4.4), увеличивается адрес байта (блок 4.5), уменьшается на один число в регистре B (блок 4.6), выход из цикла происходит если в регистре B ноль (блок 4.7).
Таким образом, программа будет состоять из основной программы, и подпрограмм многобайтного сложения, вычитания и сдвига влево.