
- •Глава 1. Принципы построения современных эвм.
- •Формы представления чисел
- •Арифметические операции над двоичными числами с фиксированной запятой
- •Арифметические операции над числами с плавающей запятой
- •Находим характеристику частного путем сложения с дополнением .
- •, При переходе к прямому коду, получим Теперь находим частное деления мантисс, используя схему деления без восстановления остатка. Коды мантиссы делителя
- •Таким образом, окончательный результат равен . Так же, как и впредудущих случаях проверим результат:
- •Логические основы построения эвм Элементы алгебры логики
- •Основные законы алгебры логики и формы логических функций
- •Синтез логических схем
- •Принципы построения современных эвм
- •Системы команд и методы адресации, применяемые в эвм
- •Постоянная память
- •Логическая организация оперативной памяти
- •Кэширование оперативной памяти
Арифметические операции над двоичными числами с фиксированной запятой
Сначала рассмотрим правильные дроби. При такой форме представления независимо от величин чисел их коды (операнды), над которыми производятся арифметические действия, обычно имеют одинаковое количество разрядов (длину). Для увеличения точности вычислений в машинах может предусматриваться возможность вычислений, например, с двойной разрядностью. В этих случаях либо арифметические устройства рассчитываются на непосредственное оперирование с операндами двойной длины, либо вычисления с повышенной точностью организуются программно. Сначала складываются младшие разряды чисел удвоенной разрядности, а затем старшие. При выполнении операций сложения и вычитания по командам СЛОЖИТЬ и ВЫЧЕСТЬ операнды из запоминающего устройства посылаются в арифметическое устройство. Чтобы свести процесс выполнения команды ВЫЧЕСТЬ к алгебраическому сложению, знак кода вычитаемого, поступающего в арифметическое устройство, искусственно меняется на обратный. Это изменение может выполняться путем суммирования по mod 2 кода знака с единицей, специально вырабатываемой схемой управления по команде ВЫЧЕСТЬ. В результате получается 01=1или 11=01.
Замена вычитания двоичных чисел
(или
в прямых кодах
)
сложением с дополнениями
или же
позволяет оперировать со знаковыми
разрядами так же, как и с цифровыми. При
этом знаковые разряды складываются так
же, как и значащие разряды числа, а
перенос из старшего значащего разряда
суммируется со значением суммы
знаковых разрядов. Перенос из знакового
разряда суммы и получение результата
для дополнительного и обратного кодов
производится последующему правилу:
при использовании дополнительного кода единица переноса из знакового разряда не учитывается;
при использовании обратного кода единица переноса из знакового разряда складывается с младшим разрядом суммы (осуществляется циклический перенос).
Рассмотрим пример сложения чисел
и
(в
десятичной системе счисления
)
с использованием обратного и
дополнительного кодов. Тогда
|
0*. |
1 |
0 |
0 |
1 |
1 |
0 |
+ |
1*. |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0*. |
0 |
1 |
0 |
1 |
1 |
1 |
|
|
|
|
|
|
|
|
|
0*. |
0 |
1 |
1 |
0 |
0 |
0. |
и
.
В данном примере происходит циклический
перенос в младший разряд, т.е. единица
переноса из знакового разряда суммируется
с младшим разрядом. Так как
,
то итоговый результат получен в прямом
коде, подсчет дает, что
Аналогично
получим, что
равно
|
0*. |
1 |
0 |
0 |
1 |
1 |
0 |
+ |
1*. |
1 |
1 |
0 |
0 |
1 |
0 |
|
0*. |
0 |
1 |
1 |
0 |
0 |
0. |
Проверка в десятичной системе дает
следующий результат
.
В двоичной системе
записываются в виде
.
Пусть
и
(в
десятичной систе счисления
).
Тогда
В данном примере
и
|
0*. |
1 |
1 |
0 |
1 |
1 |
0 |
+ |
1*. |
0 |
0 |
0 |
1 |
0 |
0 |
|
1*. |
1 |
1 |
1 |
0 |
1 |
0, |
то есть
(о чем свидетельствует отсутствие
переноса из знакового разряда). Аналогично
получим, что
|
0*. |
1 |
1 |
0 |
1 |
1 |
0 |
+ |
1*. |
0 |
0 |
0 |
1 |
0 |
1 |
|
1*. |
1 |
1 |
1 |
0 |
1 |
1, |
то есть
.
Так как, то результат получился
соответственно в обратном и
дополнительном кодах, то, используя
правила преобразования в прямой код,
находим
и
В десятичной системе
,
чему в двоичной системе соответствует
число
.
Теперь рассмотрим выполнение операции
вычитания с целыми числами. Пусть
.
Тогда
.
Вычислим сначала .
|
0*. |
1 |
0 |
1 |
0 |
+ |
1* |
1 |
0 |
0 |
0 |
1 |
0* |
0 |
0 |
1 |
0 |
|
|
|
|
|
|
|
0* |
0 |
1 |
1 |
1. |
Далее найдем
|
0* |
1 |
0 |
1 |
0 |
+ |
1* |
1 |
0 |
0 |
1 |
|
0* |
0 |
1 |
1 |
1. |
В обоих случаях мы получили результат в прямом коде (действительно, 10-7=3).
Рассмотрим разность чисел
.
В этом случае коды числ равны
и
.
равно
|
0* |
0 |
1 |
1 |
1 |
+ |
1* |
0 |
1 |
0 |
1 |
|
1* |
1 |
1 |
0 |
0. |
Переноса из знакового разряда не происходит, то есть вычитаемое больше уменьшаемого, и результат получен в обратном коде (отрицательный, равный -3). При вычислении с использованием дополнительного кода вычитаемого,пернос из знакового
|
0* |
0 |
1 |
1 |
1 |
+ |
1* |
0 |
1 |
1 |
0 |
|
1* |
1 |
1 |
0 |
1 |
получим результат в дополнительном коде (и здесь перенос отсутствует). Перевод в прямой код обратного и дополнительного кодов чисел осуществляется по тем же правилам, что и прямого кода в обратный и дополнительный. Отметим, что при различной длине чисел, участвующих в операций, число меньшей длины дополняется нулямислева, если число целое и справа, если оно дробное.
Процессы выполнения арифметических
операций часто организуются таким
образом, что отрицательные числа,
участвующие в них, хранятся в запоминающих
устройствах в вид дополнений. В этих
случаях перед операцией сложения анализ
знаков исходных кодов не нужен. При
операции сложения двоичные коды всегда
просто складываются. Если же требуется
произвести операцию вычитания, то для
кода вычитаемого всегда сначала
определяется дополнение, которое затем
прибавляется к уменьшаемому. При
сложении чисел меньших единицы в машине
могут получаться числа по абсолютной
величине большие единицы. Выход результата
операции за допустимые пределы
представления чисел приведет к ошибкам
в последующих вычислениях, если не
принять надлежащие меры. Поэтому случаи
переполнения должны немедленно
обнаруживаться. Для этого в компьютерах
применяют так называемые модифицированные
прямой, дополнительный и обратный коды,
которые отличаются от рассмотренных
выше простых кодов тем, что знаки чисел
изображаются не одним разрядом, а двумя.
Например, для
модифицированные коды будут иметь вид
Сложение чисел в модифицированных
кодах производится так же, как и в
обычных. Переносы между знаковыми
разрядами учитываются точно так же, как
и переносы из старшего цифрового разряда
в знаковый. Единица переноса из старшего
знакового разряда в модифицированном
дополнительном коде отбрасывается,
а в модифицированном обратном коде
передается в младший числовой разряд
(осуществляется циклический перенос).
Признаком переполнения разрядной сетки
в модифицированных кодах служит либо
появление в знаковом разряде суммы
сочетаний цифр 01 при сложении положительных
чисел (положительное переполнение),
либо 10 при сложении отрицательных чисел
(отрицательное переполнение). Поскольку
старший знаковый разряд при переполнении
соответствует действительному знаку
числа, его часто называют просто знаковым.
Младший знаковый разряд, который при
переполнении принимает значение,
противоположное знаку числа, указывая
на наличие переполнения, часто называют
разрядом переполнения. Переполнение
можно фиксировать не вводя специального
разряда переполнения. Для этого
необходимо регистрировать переносы
из знакового разряда и из старшего
значащего (цифрового, расположенного
правее знакового). Если при сложении
кодов эти переносы отсутствуют или
возникают оба вместе, то переполнения
нет. В противном случае, если возникает
перенос только из старшего значащего
разряда или только из знакового
(переносы не согласуются), то имеет место
переполнение.
Теперь рассмотрим выполнение операции умножения. Если в ОЗУ числа хранятся в прямом коде, то при выполнении операции умножения цифровая часть произведения обычно получается как результат перемножения (деления) абсолютных величин сомножителей, представленных в этом же коде. Знак произведения (частного) определяется путем суммирования по модулю два в специальном одноразрядном сумматоре значений знаковых разрядов сомножителей. Так как при суммировании по модулю два единица переноса теряется, то в результате получается 0 0 = 0, 0 1= 1 0 =1, 1 1= 0. В конце операции умножения знак результата заносится в знаковый разряд сумматора или регистра, где находится цифровая часть полученного произведения. Процесс перемножения цифровых частей сомножителей сводится к последовательности операций суммирования и сдвига. Если очередной разряд множителя равен 1, то соответствующее частное произведение прибавляется к содержимому сумматора, где накапливаются частные произведения. Если очередной разряд множителя равен нулю, то и очередное частное произведение равно нулю, то суммирование не производится. При анализе следующего разряда множителя происходит соответствующий сдвиг на один разряд множимого или суммы частных произведений. Умножение может производиться со сдвигами множимого или сумм частных произведений как влево, так и вправо. Сдвиги влево происходят в случае, если умножение осуществляется начиная с младшего разряда множителя, вправо — со старшего разряда множителя.Эта последовательность действий повторяется до тех пор, пока не будут проанализированы все разряды множителя.
Так как в
результате перемножения чисел, по
абсолютной величине меньших единиц,
получается произведение, по абсолютной
величине также меньшее единицы, то при
умножении не имеет смысла анализировать
результат на переполнение. Произведение
двух
-
разрядных чисел содержит
разрядов. Если для вычислений
-
разрядное произведение не требуется,
то младшие
разрядов отбрасываются, а оставшийся
результат округляется. Округление
выполняется путем учета единицы переноса
в младшем из оставшихся разрядов
прибавлением в конце умножения единицы
к старшему из отбрасываемых разрядов.
Очевидно, что для получения округленного
произведения с точностью до единицы
младшего из сохраняемых разрядов в
сумматоре частных произведений,
необходимо иметь помимо
основных еще
дополнительных
разрядов
Требуемое
число
дополнительных разрядов зависит от
схемы умножения, применяемой в машине.
Наименьшее количество дополнительных
разряда равное одному, требуется при
схеме умножения, начинающегося с младших
разрядов множителя, со сдвигами
промежуточных сумм частных произведений
вправо относительно неподвижного
множимого. В этом случае теряемый при
каждом сдвиге младший разряд очередной
суммы частных произведений не влияет
на точность результата. Для округления
результата необходимо сохранить только
младший разряд, выталкиваемый из
сумматора, что обеспечивается одним
дополнительным разрядом сумматора.
Рассмотрим следующий пример (Будем
считать, что для хранения произведения
используются
разрядов).
Пусть
Тогда
|
|
|
Разряды числа |
Множитель |
Содержимое сумматора перед началом |
|
0*.0000 |
|
|
|
+ |
0*.0110 |
|
1 |
Первая сумма частных произведений 1 |
= |
0*.0110 |
|
|
Сдвиг на один 1 разряд вправо |
|
0*.0011 |
0 |
|
|
+ |
0*.0110 |
|
1 |
Вторая сумма частных произведений 2 |
= |
0*.1001 |
|
|
Сдвиг на один 2 разряд вправо |
|
0*.0100 |
10 |
|
Сдвиг на один 2 разряд вправо |
|
0*.0010 |
010 |
0 |
|
+ |
0*.0110 |
|
1 |
Третья сумма частных произведений 3 |
= |
0*.1000 |
|
|
Сдвиг на один 3 разряд вправо |
|
0*.0100 |
0010 |
|
Результат |
= |
0*.0100 |
0010 |
|
Знак произведения 0 1=1 |
|
|
|
|
Окончательный результат |
|
1*.0100 |
0010 |
|
Окончательный
результат
Проверим правильность вычислений.
.
В двоичной системе
.
Далее рассмотрим
умножение целых чисел. Пусть
|
|
|
|
Множитель |
Содержимое сумматора перед началом |
|
0*0000 |
0000 |
|
|
+ |
0*0101 |
0000 |
1 |
Первая сумма частных произведений 1 |
= |
0*0101 |
0000 |
|
Сдвиг 1 на один разряд вправо |
|
0*0010 |
1000 |
|
Сдвиг 1 на один разряд вправо |
|
0*0001 |
0100 |
0 |
|
+ |
0*0101 |
0000 |
|
Вторая сумма частных произведений 2 |
= |
0*0110 |
0100 |
1 |
Сдвиг 2 на один разряд вправо |
|
0*0011 |
0010 |
|
|
+ |
0*0101 |
0000 |
1 |
Третья сумма частных произведений 3 |
= |
0*1000 |
0010 |
|
Сдвиг 3 на один разряд вправо |
|
0*0100 |
0001 |
|
Знак произведения 0 0=0 |
|
|
|
|
Окончательный результат |
|
0*0100 |
0001 |
|
Таким образом,
(
,
перевод 65 в двоичную систему счисления
дает результат
).
Следует заметить, что данная схема умножения двоичных чисел не является единственной. Для ускорения процессов умножения широко используются схемы, в которых производится умножение одновременно на несколько разрядов множителя (на 2, 4, 6).
Процесс деления в машинах состоит из последовательности операций вычитания и сдвигов, и, во многом аналогичен делению вручную, хотя имеет специфические особенности. Одной из них является представление делителя в дополнительном или обратном коде при вычитании его из делимого или остатков. Другая особенность заключается в том, что перед каждым очередным вычитанием обычно сдвигается на разряд влево остаток, полученный на предыдущем шаге деления, а не делитель, вправо, как это делается при делении вручную.
Существуют два
метода деления: с восстановлением и без
восстановления остатка. Если при
первом методе деления очередной остаток
отрицательный, то для получения
следующего разряда частного
восстанавливается предыдущий положительный
остаток путем прибавления делителя (в
прямом коде с положительным знаком) к
отрицательному остатку. Восстановленный
остаток сдвигается на один разряд влево
и теперь уже из него вычитается
делитель. Частное получается
последовательно, начиная со старшего
разряда. Рассмотрим следующий пример:
найти частное
,
где
,
(в
десятичной системе
).
(знак
делителя игнорируется),
|
|
|
Разряды частного |
Делимое |
|
0*.110 |
|
Делитель Bдоп |
+ |
1*.001 |
|
Остаток R1<0 |
= |
1*.111 |
0. |
Восстановление остатка |
+ |
0*.111 |
|
|
= |
|
|
Сдвиг R1 |
← |
1*.100 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R2>0 |
= |
|
1 |
Сдвиг R2 |
← |
1*.010 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R3>0 |
= |
|
1 |
Сдвиг R3 |
← |
0*.110 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R4<0 |
= |
1*.111 |
0 |
Восстановление остатка |
+ |
0*.111 |
|
|
= |
|
|
Сдвиг R4 |
← |
1*.100 |
|
Делитель Bдоп. |
+ |
1*001 |
|
Остаток R5>0 |
= |
|
1 |
Сдвиг R5 |
← |
1*.010 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R6>0, доп. разряд |
= |
|
1 |
Знак частного 1 0=1 |
|
|
|
Окончательный результат |
|
1*11011 |
|
Итак
.
Проверка в десятичной системе счисления
дает следующий результат :
,
что соответствует двоичному числу
.
При втором методе деления отрицательный
остаток не восстанавливается. Для
определения очередного разряда частного
отрицательный остаток сдвигается на
один разряд влево и к нему прибавляется
делитель. Так как сдвиг двоичного остатка
на
один разряд влево соответствует в этом
случае умножению его на 10 (два), то
прибавление к сдвинутому отрицательному
остатку делителя
равносильно вычитанию делителя
из предварительно восстановленного и
сдвинутого остатка, то сть справедлива
формула
.
Следовательно, при таком способе
продолжения деления происходит
автоматическое восстановление остатка.
Наиболее просто частное получается тогда, когда производится деление абсолютных значений чисел (цифровые части делимого и делителя представлены в прямом коде). При этом знак частного определяется путем суммирования по модулю два цифр, изображающих знаки делимого и делителя. Как и при умножении, знак частного добавляется к цифровой части в конце деления. Разряды частного определяются по следующему правилу: если полученная очередная разность положительна, то в соответствующий разряд частного заносится 1, если отрицательна, то 0. Если числа представляются правильными дробями, то при первом вычитании делителя из делимого определяется значение целой части частного (значение разряда слева от запятой). Рассмотрим предыдущий пример.
|
|
|
Разряды частного |
Делимое |
|
0*.110 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R1<0 |
= |
1*.111 |
0. |
Сдвиг R1 |
← |
1*.110 |
|
Делитель Bпр. |
+ |
0*.111 |
|
Остаток R2>0 |
= |
|
1 |
Сдвиг R2 |
← |
1*.010 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R3>0 |
= |
|
1 |
Сдвиг R3 |
← |
0*.110 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R4<0 |
= |
1*.111 |
0 |
Сдвиг R4 |
← |
1*.110 |
|
Делитель Bпр. |
+ |
0*.111 |
|
Остаток R5>0 |
= |
|
1 |
Сдвиг R5 |
← |
1*.010 |
|
Делитель Bдоп. |
+ |
1*.001 |
|
Остаток R6>0, доп. разряд |
= |
|
1 |
Знак частного 1 0=1 |
|
|
|
Окончательный результат |
|
1*.11011 |
|
Очевидно, что для исключения переполнения делитель должен быть больше делимого, так как в противном случае возникает переполнение, то есть в результате вычитания делителя из делимого получится положительный остаток, и, следовательно, разряд целой части частного будет равен единице. При делении правильных дробей частное анализируется на переполнение и вырабатывается соответствующий признак результата ПР. Признак ПР=11 вырабатывается, когда первый остаток положительный, т.е. делитель меньше делимого. Могут также вырабатываться специальные признаки результата по отношению к нулю. В машинах обычно реализуется деление без восстановления остатка, не требующее лишних действий, связанных с восстановлением остатков и, следовательно, удлиняющих процесс деления.
Для обеспечения возможности округления
в компьютерах часто вычисляется значение
дополнительного разряда частного путем
выполнения дополнительного шага деления.
Округление выполняется путем прибавления
единицы к значению дополнительного
разряда. Для последнего примера
округленное частное равно
11*.11011+1=11*.11100,
т.е.
При выполнении арифметических действий над целыми двоичными числами эти числа выравниваются по младшим разрядам, правее которых фиксируется десятичная запятая (точка). В арифметическом устройстве операции выполняются над операндами, имеющими одинаковую длину. Однако в ЗУ длина их может быть разной. Обычно в компьютерах устанавливаются несколько возможных для использования длин, соответственно имеющие 16, 32 и 64 двоичных разряда. Длины операндов, над которыми должны быть произведены действия, указываются в командах программы. Крайний левый разряд (нулевая позиция) операнда любой длины отводится для представления знака. За исключением выравнивания по правой границе операндов сложение и вычитание в арифметическом устройстве целых двоичных чисел выполняются аналогично действиям над правильными дробями. Если, например, в ЗУ отрицательные числа хранятся в дополнительном коде, то, когда требуется выполнить сложение, они просто складываются. Операнды, соответствующие положительным целым двоичным числам, занимающим только часть разрядов (младших) слова, имеют во всех разрядах левее старшей значащей цифры нули, а соответствующие отрицательным — единицы. Поэтому увеличение длин операндов в сторону старших разрядов осуществляется простым добавлением разрядов, содержащих согласно знаку, нули при положительном и единицы при отрицательном числах. Переполнение можно обнаружить применением в арифметическом устройстве модифицированных кодов или при анализе переносов в знаковый разряд и из знакового разряда. Из арифметических действий над целыми числами большими особенностями обладают операции умножения и деления. Произведение двух - разрядных двоичных чисел имеет не более разрядов. Это обстоятельство необходимо учитывать при перемножении целых чисел. На машинный код результата операции умножения должно отводиться удвоенное количество разрядов. В этом случае при умножении никогда не произойдет переполнения. Процесс собственно перемножения целых двоичных чисел может строиться по различным схемам, некоторые были рассмотрены в примерах. В обоих случаях перемножаются полностью -разрядные операнды независимо от того, сколько разрядов в них занимают целые числа. При делении целых чисел, наоборот, один из операндов, а именно делимое, имеет удвоенное количество разрядов по отношению к делителю и частному. Так же как и умножение, собственно деление реализуется аналогично рассмотренному выше. Важно лишь правильно начать вычитание делителя из старших разрядов делимого. Для этого вначале делают пробные шаги, чтобы правильно расположить делимое и делитель. Критерием правильности расположения может быть получение первого отрицательного остатка.