Разработка алгоритма и программы на ассемблере
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
ение будем производить, побайтно переходя от младшего к старшему с учётом переноса. В начале задаются счетчик сложений кратный количеству байт чисел, начальные адреса, которыми являются ячейки памяти с младшими байтами чисел. Далее происходит непосредственное сложение. После этого необходимо изменить текущие адреса на следующие. Далее модифицируем счётчик, и если он показывает, что необходимое количество сложений произошло, выходим из цикла, в противном случае возвращаемся в блок сложения и повторяем цикл, начиная с него до тех пор, пока счетчик не достигнет определенного значения.
Для вычисления выражения 4 необходимо разработать алгоритм программного умножения. Простейший способ умножения двоичных чисел заключается в суммировании множимого с накоплением, которое производится m раз, где m - значение множителя. Основной недостаток данного способа, почти исключающий его практическое применение, заключается в очень низком быстродействии. Такого недостатка лишен второй алгоритм. Он выполняет умножение сдвигом разрядной сетки. Суть умножения сводится к тому, что один из множителей (второй) всегда должен сдвигаться вправо (сдвиг разрядной сетки вправо). При этом крайний разряд можно будет всегда оценивать на признак: ноль или один. Если он будет равен единице, то в сумму нужно будет добавлять первый множитель. Первый множитель, на каждой итерации цикла тоже должен изменяться, а, именно, его разрядную сетку нужно сдвигать влево. Будет получаться, что мы на каждой итерации добавляем ему справа по нолику. Имеются четыре варианта реализации данного способа, определяемых тем, начиная с каких цифр - младших или старших - анализируется множитель и что сдвигается - множимое или частичная сумма.
Данный алгоритм будет занимать гораздо меньше места, поскольку число раз повторения цикла будет зависеть не от значения числа множителя, а от количества его разрядов. Применение этого алгоритма особенно удобно при больших числах. Подобные программистские выверты позволили осуществить такие алгоритмы умножения, при которых задействованы лишь регистры МК, и нет обращений к внутренней или внешней памяти данных. Благодаря этому скорость выполнения умножения достаточно высока, т. к. операции с регистрами гораздо быстрее аналогичных операций с ячейками ОЗУ.
Для деления многобайтных чисел необходимо разработать алгоритм программного деления. Самый простой способ деления заключается в вычитании из делимого делителя, пока делимое не станет меньше делителя, и одновременном увеличении счетчика для нахождения частного. Этот способ не применяется, так как при большом делимом относительно делителя программа выполняется крайне медленно, что не соответствует требованию.
Более эффективный способ реализуется методом вычитание-сдвиг. Так как частное можно получать, только начиная со старших разрядов, имеются два варианта деления - со сдвигом остатка влево и со сдвигом делителя вправо. Второй вариант на практике не применяется из-за необходимости иметь регистры остатка и делителя удвоенной длины, что сказывается на быстродействии.
При делении целых чисел в отличие от деления правильных дробей приходится получать целую часть частного и остаток, а округление частного не производится. После вычитания делителя из сдвинутого положительного остатка информацию об очередном разряде частного содержит признак переноса. Если делитель больше остатка, то возникает заем, который фиксируется установкой признака переноса. В этом случае цифра частного равна нулю и делитель суммируется с результатом вычитания для восстановления предыдущего положительного остатка. Если при вычитании делителя заема не возникает и соответственно признак переноса сброшен, цифра частного равна единице, а положительная разность представляет собой очередной остаток. Таким образом, цифра частного противоположна значению признака переноса после вычитания делителя из остатка.
Таким образом, для вычисления функции необходимо выполнить следующие основные действия (рисунок 1).
Рисунок 1 - Обобщенный алгоритм программы
Основываясь на описанных методах умножения и деления, можно разработать программу вычисления заданной функции для микропроцессора КР580ВМ80, которая будет удовлетворять поставленным требованиям.
Рабочая частота микропроцессора . Эти данные предназначены для расчетной части работы, а именно для нахождения времени выполнения программы из расчета, что время одного такта процессора вычисляется по формуле (1.1).
(1.1)
Все числа, которыми мы оперируем в качестве переменных, имеют область определения. Она ограничена исключительно положительными числами.
. Разработка алгоритма программы
В анализе ТЗ было указано, что в микропроцессоре КР580ВМ80 отсутствуют команды многобайтного умножения и деления двоичных чисел. Поэтому были рассмотрены и выбраны методы программного вычисления данных операций.
Таким образом, исходя из обобщенного алгоритма программы и методов, описанных в предыдущем разделе, можно разработать алгоритмы, выполняющие вычисление заданной функции.
Для реализации умножения был выбран метод вычисление произведения при помощи сдвига множимого и сложения частичных результатов сдвига. Алгоритм умножения приведен на рисунке 2.
Рисунок 2 - Алгоритм вычисления 25X1.
В алгоритме применены следующие обозначения:
X1 - множимое;
P - частичная сумма (произведение);