Отчёт по лабораторным работам №№1-3 По дисциплине «Архитектура вычислительных систем» По теме «Арифметические операции с целыми. Арифметические операции с целыми числами
Скачать 0.65 Mb.
|
Министерство образования Республики Беларусь Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ КАФЕДРА ИНФОРМАТИКИ Отчёт по лабораторной работе №1-3По дисциплине «Архитектура вычислительных систем» По теме «Арифметические операции с целыми числами» Выполнил: студент гр. 953502 Романьков С.Ю. Проверил: Старший преподаватель Шиманский В. В. Минск 2021 СОДЕРЖАНИЕ 1.Цель работы 3 2.Постановка задачи 4 3.Теоретические сведенья 5 4.Программная реализация 13 6.Литература 38 Цель работыРассмотреть представление чисел в прямом и дополнительном кодах. Изучить процессы выполнения арифметических операций над целыми числами с фиксированной точкой. Рассмотреть различные алгоритмы выполнения арифметических операций. Сравнить различные варианты алгоритмов и определить наиболее подходящие для реализации в АЛУ. Постановка задачиЗадание к лабораторной работе 1НаписатьпрограммуэмулятораАЛУ,реализующегоОперациисложенияивычитаниясфиксированнойточкойнаддвумявведеннымичислами,свозможностьюпошаговоговыполнения алгоритмов. Задание к лабораторной работе 2НаписатьпрограммуэмулятораАЛУ,реализующегооперациюумножениянаддвумявведеннымичислами,свозможностьюпошаговоговыполненияалгоритмов. Задание к лабораторной работе 3Написать программу эмулятора АЛУ, реализующего операцию деленияс фиксированной точкой над двумя введенными числами, с возможностьюпошаговоговыполненияалгоритмов. Теоретические сведеньяПредставление информации в компьютереВ ЭВМ применяется двоичная система счисления, т.е. все числа в компьютере представляются с помощью нулей и единиц, поэтому компьютер может обрабатывать только информацию, представленную в цифровой форме. Для преобразования числовой, текстовой, графической, звуковой информации в цифровую необходимо применить кодирование. Кодирование – это преобразование данных одного типа через данные другого типа. В ЭВМ применяется система двоичного кодирования, основанная на представлении данных последовательностью двух знаков: 1 и 0, которые называются двоичными цифрами. Таким образом, единицей информации в компьютере является один бит, т.е. двоичный разряд, который может принимать значение 0 или 1. Восемь последовательных бит составляют байт. В одном байте можно закодировать значение одного символа из 256 возможных (256 = 2 в степени 8). Более крупной единицей информации является килобайт (Кбайт), равный 1024 байтам (1024 = 2 в степени 10). Еще более крупные единицы измерения данных: мегабайт, гигабайт, терабайт (1 Мбайт = 1024 Кбайт; 1 Гбайт = 1024 Мбайт; 1 Тбайт = 1024 Гбайт). Все разнообразие математических операций, выполняемых цифровыми устройствами, основывается на двоичной системе счисления. Двоичная система счисленияВ двоичной системе счисления используются всего две цифры 0 и 1. Другими словами, десятичная двойка является основанием двоичной системы счисления, аналогично тому, как в десятичной системе основанием является число десять. Формирование каждого последующего числа в двоичной системе счисления аналогично тому, как это происходит в десятичной за исключением того, что используются всего лишь две цифры: 0 и 1. Как только разряд достигает своего предела, то есть единицы, появляется новый разряд, а старый обнуляется. Например, число три в двоичной системе записывается как 11, в десятичной – как 3. Количественно это одинаковые числа. Это одно и то же число, выраженное в различных системах счисления. Для перевода десятичного числа в двоичную систему его необходимо последовательно делить на 2 до тех пор, пока не останется остаток, меньший или равный 1. Число в двоичной системе записывается как последовательность последнего результата деления и остатков от деления в обратном порядке. Представление целых чиселВ двоичной системе счисления числа представляются с помощью комбинации единиц и нулей, знака "минус" и знака разделяющей точки между целой и дробной частью числа. Например, десятичное число -1.312510 в двоичном виде будет выглядеть как -1001.01012. Но в компьютере мы не можем хранить и обрабатывать символы знака и разделяющей точки — для "машинного" представления чисел могут использоваться только двоичные цифры (0 и 1). Если операции выполняются только с неотрицательными числами, то формат представления очевиден. В машинном слове из 8 бит можно представить числа в интервале от 0 до 255. Например: В общем случае n-битовая последовательность двоичных цифр an-1an- 2…a1a0 интерпретирована как целое число А, значение которого равно При выборе способа хранения целых чисел, следует ориентироваться на следующие условия: код не должен требовать усложнения архитектуры процессора для выполнения арифметических операций с отрицательными числами; не усложнял арифметические действия; хранил бы одинаковое количество положительных и отрицательных чисел; и др. В рамках данной лабораторной работы рассматривается представление целых чисел в прямом и дополнительном кодах, а также создается программная реализация методов хранения информации и возможности произведения арифметических операций над ними (сложение, вычитание, умножение, деление). Прямой кодСуществует несколько соглашений о едином формате представления как положительных, так и отрицательных чисел. Всех их объединяет то, что старший бит слова (с точки зрения европейца — самый левый, или бит, которому при представлении числа без знака должен быть приписан самый большой вес) является битом хранения знака или знаковым разрядом. Все последующие биты слова представляют значащие разряды числа, которые в каждом формате интерпретируются по-своему. Значение 1 в знаковом разряде интерпретируется как представление всем словом отрицательного числа. Общее правило математически формулируется следующим образом: Формат представления чисел в прямом коде неудобен для использования в вычислениях. Во-первых, сложение и вычитание положительных и отрицательных чисел выполняется по-разному, а потому требуется анализировать знаковые разряды операндов. Во-вторых, в прямом коде числу 0 соответствуют две кодовых комбинации: Это также неудобно, поскольку усложняется анализ результата на равенство нулю, а такая операция в программах встречается очень часто. Из-за этих недостатков прямой код практически не применяется при peaлизации в АЛУ арифметических операций над целыми числами. Вместо этого более широкое применение находит другой формат, получивший наименование дополнительного кода. Дополнительный кодКак и в прямом, в дополнительном коде старший разряд в разрядной сетке отводится для представления знака числа. Остальные разряды интерпретируются не так, как в прямом коде. В табл. 1 перечислены основные свойства дополнительного кода и правила выполнения арифметических операций в дополнительном коде, которые мы рассмотрим в этом и следующем разделах. Таблица 1. Свойство представления чисел в дополнительном коде Сложение и вычитание двоичных чиселСложение в двоичной системе счисления выполняется по тем же правилам, что и в десятичной. Два числа записываются в столбик с выравниванием по разделителю целой и дробной части и при необходимости дополняются справа незначащими нулями. Сложение начинается с крайнего правого разряда. Две единицы младшего разряда объединяются в единицу старшего. Рассмотрим правила сложения: 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 (переносим единицу в старший разряд) Сложение двух единиц порождает значение "10", эквивалентное десятичной CC. Это абсолютно также как происходит в обычной десятичной CC при сложении двух цифр если результат равен или превышает основание системы 10, то цифра слева должна быть увеличена на единицу. Это известно как эффект переноса в старший разряд в большинстве систем счисления, возникающий при превышении основания системы счисления. Рассмотрим операцию сложения на примере: ВыполнитьсложениечиселA=53иB=14вдвоичнойсистемесчисления. Переведем числа в двоичную систему счисления: 5310 = 1101012 , 1410 = 11102 . Запишем числа «A» и «B» столбиком, одно под другим, начиная с младших разрядов (нумерация разрядов начинается с нуля). Сложим поразрядно числа «A» и «B» записывая результат в «C» начиная с младших разрядов. Весь процесс сложения наших чисел представлен в таблице 2. Таблица 2. Сложение чисел 53 и 14
Теперь опишем как происходит описанный выше процесс сложения и вычитания чисел в нашем эмуляторе АЛУ: Изучим блоки эмулятора АЛУ. Главный блок представляет собой модуль сложения двух чисел. Процесс сложения происходит по правилам сложения беззнаковых чисел. Вычитание чисел достигается инвертированием второго числа в противоположный знак. Данный блок назовем сумматором. Результат передается либо в один из регистров слагаемых (этот вариант показан на схеме), либо в третий регистр результата. Кроме кода результата сумматор формирует сигнал переполнения, который фиксируется в битовом флаге переполнения. Значение флага интерпретируется следующим образом: 0 — переполнение отсутствует, 1 – присутствует. При выполнении операции вычитания код вычитаемого, хранящийся перед началом операции в регистре В, передается на схему, выполняющую операцию отрицания, а уже с выхода этой схемы код поступает на вход сумматора. Правила вычитания: 0 – 0 = 0 0 – 1 = 1 (занимаем единицу из старшего разряда) 1 – 0 = 1 1 – 1 = 0 Умножение двоичных чиселАлгоритмы выполнения умножения значительно сложнее, чем сложения или вычитания, причем в современных вычислительных системах можно встретить как аппаратную его реализацию, так и программную. Существует много вариантов этих алгоритмов, причем многие из них имеют не только теоретический, но и практический интерес, и выбор одного из многих может быть произведен только с учетом специфики применения конкретной системы. Конструкторы АЛУ предпочитают способ, который не требует выполнения дополнительного преобразования после завершения умножения. Одним из таких способов является алгоритм Бута (Booth). Алгоритм Бута включает в себя циклическое сложение одного из двух заранее установленных значений Aи Sс произведением P, а затем выполнение арифметического сдвига вправо над P. Пусть m и r — множимое и множитель соответственно, а xи yпредставляют собой количество битов в m и r. Установить значения A и S, а также начальное значение P. Каждое из этих чисел должно иметь длину, равную (x+ y+ 1). A: Заполнить наиболее значимые (левые) биты значением m. Заполнить оставшиеся (y+ 1) бит нулями. S: Заполнить наиболее значимые биты значением (−m) в дополнительном коде. Заполнить оставшиеся (y+ 1) бит нулями. P: Заполнить наиболее значимые x бит нулями. Справа от них заполнить биты значением r. Записать 0 в крайний наименее значимый (правый) бит Определить значение двух наименее значимых (правых) битов Pи вычислить по ним значение для следующего шага: Если их значение равно 01, прибавить Aк P. Переполнение игнорировать. Если их значение равно 10, прибавить Sк P. Переполнение игнорировать. Если их значение равно 00, действие не требуется. Pиспользуется без изменений на следующем шаге. Если их значение равно 11, действие не требуется. Pиспользуется без изменений на следующем шаге. Выполнить операцию арифметического сдвига над значением, полученным на втором шаге, на один бит вправо. Присвоить Pэто новое значение. Повторить шаги 2 и 3 yраз. Отбросить крайний наименее значимый (правый) бит P. Это и есть произведение m и r. Деление двоичных чиселПо сравнению с умножением операция деления выполняется несколько сложнее, хотя соответствующие алгоритмы основываются на тех же принципах поразрядного анализа операндов. Ниже будет описан один из вариантов алгоритма деления чисел, представленных в дополнительном коде. Загрузить делитель в регистр М, а делимое — в регистры А и Q. Делимое должно иметь формат 2n -разрядного дополнительного кода. Например, 4-разрядное число 0111 должно быть представлено в формате 00000111, а число 1001 должно быть преобразовано в 11111001. Сдвинуть содержимое регистров А и Q на один разряд влево. Если коды в регистрах М и А имеют одинаковые знаки, вычесть из содержимого А содержимое М и оставить результат в А. В противном случае добавить к содержимому А код из М. Предыдущая операция считается успешной, если знак кода в регистре А не изменился в результате ее выполнения. Если операция была успешной или содержимое регистров А и Q равно нулю, то установить в младшем разряде частного (разряде Q0) код 1. Если операция не увенчалась успехом и содержимое одного из регистров А и Q (или обоих) отлично от нуля, то установить в младшем разряде частного, Q0, код 0 и восстановить прежнее значение в регистре А. Повторять операции, указанные в пунктах 2 и 4, столько раз, сколько разрядов в регистре Q. После завершения операции прочесть значение остатка в регистре А. Если знаки делимого и делителя одинаковы, значение частного извлечь из регистра Q; в противном случае значение частного равно содержимому регистра Q с обратным знаком (операция отрицания должна быть выполнена по правилам для дополнительного кода). Программная реализацияКраткая информацияСначала опишем процесс разработки программы. В качестве языка для реализации эмулятора АЛУ был выбран язык С#. Для работы с операциями сложения, умножения и вычитания предусмотрено хранение двоичных чисел в 16-битном формате, что предусматривает диапазон в 65536 (216) значений. Предусмотрена возможность обработки ситуаций переполнения с выводом информации о проблеме для сложения и вычитания. Результаты работы программыРис. 1. Сумма чисел 0 и 0Рис. 2. Сумма чисел 144 и 17Рис. 3. Сумма чисел 66 и -23Рис. 4. Сумма чисел -144 и -6666Рис. 5. Сумма чисел 10 и -32768Рис. 6. Разность чисел 0 и 0Рис. 7. Разность чисел 144 и 17Рис. 8. Разность чисел 63 и -23Рис. 9. Разность чисел -144 и -6666Рис. 10. Произведение чисел 0 и 0Рис. 11. Произведение чисел 144 и 17Рис. 12. Произведение чисел 66 и -23Рис. 13. Произведение чисел -144 и -6666Рис. 14. Произведение чисел 0 и 6421Рис. 15. Произведение чисел -32768 и 0Рис. 16. Деление числа 64 на -32Рис. 17. Деление числа -34 на 64Рис. 18. Деление числа 32767 на 3Рис. 19. Деление числа -32768 на -256На следующих скриншотах представленны исключительные ситуации.Рис. 20-23. Ошибка: введено неверное значениеРис. 24. Ошибка: переполнениеРис. 25. Ошибка: переполнениеРис. 26. Ошибка: переполнениеРис. 27. Ошибка: переполнениеРис. 28. Ошибка: деление на 0ВыводыВ ходе выполнения данных лабораторных работ рассмотрены представления чисел в прямом и дополнительном коде. Были изучены процессы выполнения арифметических операций над целыми числами с фиксированной точкой. Были написаны программы эмулятора АЛУ на языке C++, реализующие операции сложения, вычитания, умножения и деления целых чисел. ЛитератураВолорова Н. А. Лабораторный практикум по курсу «Архитектура вычислительных систем» для студентов специальности «Информатика» / 93-444-487-2- Мн.: БГУИР, 2003.-32с.: ил. Таненбаум, Э. Архитектура компьютера/ Э. Таненбаум, Т. Остин – 6- е изд. – Спб.: Питер, 2013. – 816 с.: ил. |