Введение
Для полноценного функционирования электронного средства существует необходимость в решение различных не сложных арифметических и логических функций, но огромное количество таких задач представляет собой очень трудоемкий и длительный процесс и его целесообразно выполнять с помощью микропроцессорной техники. Решению одной из таких задач посвящена данная курсовая работа. В которой будет разработана программа по вычислению функции на языке программирования ассемблер для микропроцессора Кр580ВМ80.
В ходе решения данной задачи нам необходимо подробно изучить микропроцессорную технику на примере однокристальной микро-ЭВМ Кр580ВМ80. Освоить приёмы программирования на языке низкого уровня - ассемблер. Затем произвести детальный анализ технического задания и найти пути решения в виде наиболее привлекательного с точки зрения рациональности алгоритма программы. Составить всю необходимую документацию к данной программе.
Анализ технического задания
Требуется разработать на ассемблере программу вычисления функции.
Исходные данные
1. Функция ;
. Тип микропроцессора КР580ВМ80;
. Рабочая частота - 2 МГц;
. Исходные числа целые, положительные, 4-х байтовые, двоичные;
. Специальное требование - минимизировать объем памяти программы.
Рассмотрим основные ресурсы с точки зрения программирования, которые предоставляют МП КР580ВМ80. Данный МП представляет собой однокристальный 8-разрядный микропроцессор и включает в себя три основные части: АЛУ, банк регистров, схему управления. Взаимосвязь между различными блоками осуществляется с помощью внутренней 8-разрядной шины данных. МП имеет внешнюю 8-и разрядную, двунаправленную шину данных с тремя логическими состояниями и 16-разрядную однонаправленную шину адреса с тремя логическими состояниями.
Такая 16-разрядная шина адреса позволяет адресовать 216 = 65536 ячеек памяти.
АЛУ МП представляет собой 8-разрядное комбинационное логическое устройство, предназначенное для выполнения арифметических и логических операций. Один из операндов, поступающих на АЛУ, всегда размещается в аккумуляторе, в аккумулятор помещается и результат операции. АЛУ данного МП выполняет только простейшие операции (сложение, вычитание, сдвиг и.т.д.), более сложные операции реализуются программно.
Все регистры МП Кр580ВМ80 можно разделить по назначению на две группы: регистры общего назначения (РОН) и специальные регистры.
МП имеет 8 регистров общего назначения. Из них регистры W и Z программно недоступны и предназначены для внутренних пересылок информации в МП, в частности для хранения двух и трехбайтовых команд. Регистры В,С,D,E,Н,L программно доступны и предназначены для хранения операндов и промежуточных результатов вычислений. Использование этих регистров в программе позволяет сократить время выполнения программы и её объём. Эти регистры могут использоваться как отдельно (как 8-разрядные регистры), так и в парах НL, BC, DE, при этом они используются для хранения 16-разрядных операндов и адресов. Пара регистров НL может использоваться для хранения адреса ячейки памяти (М) при обращении к ней как к регистру.
К специальным регистрам относятся: счетчик команд, указатель стека, регистр адреса, аккумулятор, регистр признаков.
Из них программно доступными являются счетчик команд, указатель стека, аккумулятор, регистр признаков.
Счетчик команд Рс представляет собой 16-ти разрядный регистр, содержащий адрес выполняемой команды.
Указатель стека Sр - 16-разрядный регистр, предназначенный для хранения адреса вершины стека. Стек располагается в оперативной памяти. Поэтому при разбивке адресного пространства необходимо в ОЗУ выделить область для стека.
Регистр состояния (регистр признаков) предназначен для хранения информации о результате операции.
Также МП содержит схема десятичной коррекции предназначена для автоматической коррекции результата операции сложения при представлении операндов, в двоично-десятичном коде.
Система команд МП включает команды пересылки, инкремента и декремента, команды арифметических и логических операций, сдвига, передачи управления, ввода-вывода и несколько дополнительных команд.
В данном МП нет команд деления и умножения. Поэтому необходимо разработать алгоритмы программного вычисления данных операций.
По заданию входными числами х1, х2, являются целые, положительные, 4-х байтные, двоичные числа. 4-х байтное двоичное число может принимать значения от 0 до 232-1 (FFFFFFFF16).
Максимальное значения функция достигает при минимальном значении знаменателя, то есть при х1=1 и равно (1+232-1+232-1)/(4×1) =2147483647 (7FFFFFFF16). Таким образом, для хранения результата в двоичном виде необходимо четыре байта.
Для хранения результата сложения х1, х2 и x необходимо пять байт, так как 232-1+232-1+232-1=12884901885 (2FFFFFFFD16).
Для хранения результата умножения 4 на х1 необходимо также пять байт, так как 4×232-1=17179869180 (3FFFFFFFC16).
Отметим, что областью допустимых значений, удовлетворяющей данной функции, является выражение > .
Проанализируем заданную математическую функцию. Она содержит три арифметических действия, поэтому программу можно логически разделить на три составляющих.
В первую очередь следует найти сумму . В своём составе МП Кр580ВМ80 имеет байтовое АЛУ с фиксированным набором команд. В этом перечне присутствует команда сложения. Так как разрядность процессора равна восьми, а переменные состоят из нескольких байт сложение будем производить, побайтно переходя от младшего к старшему с учётом переноса. В начале задаются счетчик сложений кратный количеству байт чисел, начальные адреса, которыми являются ячейки памяти с младшими байтами чисел. Далее происходит непосредственное сложение. После этого необходимо изменить текущие адреса на следующие. Далее модифицируем счётчик, и если он показывает, что необходимое количество сложений произошло, выходим из цикла, в противном случае возвращаемся в блок сложения и повторяем цикл, начиная с него до тех пор, пока счетчик не достигнет определенного значения.
Для вычисления выражения 4 необходимо разработать алгоритм программного умножения. Простейший способ умножения двоичных чисел заключается в суммировании множимого с накоплением, которое производится m раз, где m - значение множителя. Основной недостаток данного способа, почти исключающий его практическое применение, заключается в очень низком быстродействии. Такого недостатка лишен второй алгоритм. Он выполняет умножение сдвигом разрядной сетки. Суть умножения сводится к тому, что один из множителей (второй) всегда должен сдвигаться вправо (сдвиг разрядной сетки вправо). При этом крайний разряд можно будет всегда оценивать на признак: ноль или один. Если он будет равен единице, то в сумму нужно будет добавлять первый множитель. Первый множитель, на каждой итерации цикла тоже должен изменяться, а, именно, его разрядную сетку нужно сдвигать влево. Будет получаться, что мы на каждой итерации добавляем ему справа по нолику. Имеются четыре варианта реализации данного способа, определяемых тем, начиная с каких цифр - младших или старших - анализируется множитель и что сдвигается - множимое или частичная сумма.
Данный алгоритм будет занимать гораздо меньше места, поскольку число раз повторения цикла будет зависеть не от значения числа множителя, а от количества его разрядов. Применение этого алгоритма особенно удобно при больших числах. Подобные программистские «выверты» позволили осуществить такие алгоритмы умножения, при которых задействованы лишь регистры МК, и нет обращений к внутренней или внешней памяти данных. Благодаря этому скорость выполнения умножения достаточно высока, т. к. операции с регистрами гораздо быстрее аналогичных операций с ячейками ОЗУ.
Для деления многобайтных чисел необходимо разработать алгоритм программного деления. Самый простой способ деления заключается в вычитании из делимого делителя, пока делимое не станет меньше делителя, и одновременном увеличении счетчика для нахождения частного. Этот способ не применяется, так как при большом делимом относительно делителя программа выполняется крайне медленно, что не соответствует требованию.
Более эффективный способ реализуется методом «вычитание-сдвиг». Так как частное можно получать, только начиная со старших разрядов, имеются два варианта деления - со сдвигом остатка влево и со сдвигом делителя вправо. Второй вариант на практике не применяется из-за необходимости иметь регистры остатка и делителя удвоенной длины, что сказывается на быстродействии.
При делении целых чисел в отличие от деления правильных дробей приходится получать целую часть частного и остаток, а округление частного не производится. После вычитания делителя из сдвинутого положительного остатка информацию об очередном разряде частного содержит признак переноса. Если делитель больше остатка, то возникает заем, который фиксируется установкой признака переноса. В этом случае цифра частного равна нулю и делитель суммируется с результатом вычитания для восстановления предыдущего положительного остатка. Если при вычитании делителя заема не возникает и соответственно признак переноса сброшен, цифра частного равна единице, а положительная разность представляет собой очередной остаток. Таким образом, цифра частного противоположна значению признака переноса после вычитания делителя из остатка.
Таким образом, для вычисления функции необходимо выполнить следующие основные действия (рисунок 1).
Рисунок 1 - Обобщенный алгоритм программы
Основываясь на описанных методах умножения и деления, можно разработать программу вычисления заданной функции для микропроцессора КР580ВМ80, которая будет удовлетворять поставленным требованиям.
Рабочая частота микропроцессора . Эти данные предназначены для расчетной части работы, а именно для нахождения времени выполнения программы из расчета, что время одного такта процессора вычисляется по формуле (1.1).
(1.1)
Все числа, которыми мы оперируем в качестве переменных, имеют область определения. Она ограничена исключительно положительными числами.