7. Так как в реализации умножения можно использовать различные подходы, связанные с тем, от какого разряда множителя начинается умножение, а так же с тем относительно чего сдвигается, можно использовать четыре способа (схемы) умножения.
Способы (схемы) реализации умножения
1. Умножение, начиная с младших разрядов множителя со сдвигом множимого влево.
2. Умножение, начиная с младших разрядов множителя со сдвигом СЧП вправо.
3. Умножение, начиная со старших разрядов множителя со сдвигом множимого вправо.
4. Умножение, начиная со старших разрядов множителя со сдвигом СЧП влево.
Анализ схем:
1. В схемах умножения со сдвигом множимого для его представления требуется 2n-разрядный регистр.
2. А в схеме умножения, начиная с младших разрядов множителя со сдвигом СЧП вправо для представления множимого требуется n-разрядный регистр.
3. А в схеме умножения, начиная со старших разрядов множителя со сдвигом множимого вправо необходимо использовать 2n-разрядный сумматор, связанный по входу с регистром множителя.
4. Четвертая схема требует 2n-разрядного сумматора.
5. Вторая схема - n-разрядного.
В целях минимизации оборудования целесообразно использовать схему 2, на основе которой реализуется умножение практически во всех ЭВМ.
Упрощенная схема операционного устройства для реализации умножения по второму способу
Операция деления и ее реализация в ЭВМ
Особенности двоичного деления
Пример: 130/10
А= 10000010 | 1010
1010 |--------
------------- |01101
0110010
1010
-------------
001010
1010
-----------
1010
1010
Операция двоичного деления сводится к последовательному вычитанию делителя из делимого и остатков на последующих шагах.
1) Под текущим остатком понимается результат полуученый при вычитании делителя из делимого на первом шаге или из предыдущего остатка на последующих шагах.
2) На предварительном шаге делитель совмещается со старшими разрядами делимого ,а затем на каждом шаге сдвигается вправо на одну цифру относительно неподвижного остатка На последнем шаге делитель совмещается с младшими разрядами остатка.
3) Цифры частного вырабатываемые каждом шаге определяются знаком текущего остатка ,для остатка >= 0 цифра частного равна единице ,для остатка < 0 цифра равна нулю.
Особенности реализации деления в ЭВМ.
(по отношению к целым числам)
1) Делимое по сравнению с делителем представляется в удвоенном формате.
2) В качестве результата деления формируется как частное так и остаток .При этом как правило остаток замещает старшие разряды ,а частное младшие.
3) В целях экономии оборудования на каждом шаге осуществляется не сдвиг делителя вправо относительно остатка ,а сдвиг остатка влево относительно неподвижного делителя. При этом делитель совмещается со старшими разрядами делимого ,а далее остатка.
4) При получении отрицательного остатка на каком либо шаге для перехода к следующему шагу требуется восстановление остатка путем сложения с делителем. Подобный метод называется делением с восстановлением остатка .В целях экономии времени деление как правило реализуется в ЭВМ с применением метода без восстановления .В соответствии с этим методом при получении отрицательного остатка он не восстанавливаясь сдвигается влево так же как и положительный однако при этом на следующем шаге производится не вычитание делителя ,а сложение с делителем.
Доказательство:Допустим на i-м шаге получен отрицательный остаток тогда по методу с восстановлением :Ri+1=2(Ri+B)-B
Ri+1 =2Ri +2B-B=2Ri+B
5) При некоторых соотношениях между делимым и делителем может оказаться что частное не помещается в отводимый формат. Подобная ситуация возникает также при делении на 0. Этот особый случай распознается на начальном шаге деления и приводит к прерыванию выполняемой программы по причине ошибки деления.
Деление беззнаковых.
А/В<2^n А-В*2^n<0 из этого неравенства следует что для проверки корректности деления необходимо вычесть делитель из старших разрядов делимого. Если результат вычитания положителен или равен 0 то операция прекращается выходом на прерывание. В остальном беззнаковое деление реализуется по описанным выше принципам так как цифра частного вырабатываемая на каждом шаге деления определяется знаком текущего остатка ,точнее представляет собой инверсию его знакового разряда, целесообразно расширить n-разрядный сумматор дополнительным разрядом для явного представления знака остатка.
Если по завершению всех шагов деления остаток является отрицательным то требуется его восстановление путем сложения с делителем.
Деление знаковых.
IDIV
По аналогии с операцией умножения знаковое деление может быть реализовано одним из двух методов:
1) Метод деления в прямых кодах .
2) Метод деления в дополнительных кодах.
При использовании первого метода отрицательные операнды предварительно преобразуются в прямой код и далее над ними выполняют деление по аналогии с беззнаковым .Знак частного формируется отдельным действием как сумма по модулю два знаков операндов. Знак остатка совпадает со знаком делимого. Исключением из этого правила является нулевой остаток содержащий в знаковом разряде 0.
Отрицательные результаты в конце операции преобразуют из прямого в дополнительный код.
Существенным отличием деления модулей операндов в прямых кодах от беззнакового деления является проверка корректности деления. Действительно модуль n-разрядного знакового числа размещается в (n-1)-разряде в связи с этим условие корректности для деления в прямых кодах имеет вид |A|/|B|<2^(n-1) ; |A|-|B|^(n-1)<0
В соответствии с последним неравенством пробное вычитание модулей с целью проверки корректности должно выполнятся путем совмещения делителя не со старшими разрядами делимого ,а со сдвинутыми на один разряд вправо.
В целях однообразия выполнения пробного вычитания с основным циклом деления в котором делитель совмещен со старшими разрядами остатка делимое предварительно сдвигают на один разряд влево после чего производится пробное вычитание из старших разрядов сдвинутого делимого.
Деление в дополнительных кодах.
Основное отличие этого метода от предыдущих состоит в том, что операнды вступают в операцию в коде своего представления вместе со знаком. Однако при этом возникает ряд нюансов :
1) Цифры частного, в том числе и знак, формируемые на каждом шаге, определяются не только остатком, но и знаком делителя. При их совпадении цифра частного равна единице, иначе - нулю.
2) Действие выполняемое над текущим остатком на каждом шаге определяется не только этим остатком, но и знаком делителя. При их совпадении выполняется вычитание делителя из старших разрядов делителя,при не совпадении выполняется сложение делителя со старшими разрядами делителя.
3) Коррекция остатка производится в конце операции в том случае, если его знак не совпадает со знаком делимого. Эта коррекция осуществляется действием над остатком, аналогичным основному циклу деления.
4) Коррекция частного выполняется только при отрицательном делимом и нулевом остатке деления и состоит в инкременте (увеличение на единицу) положительного частного и декременте отрицательного.
5) Проверка корректности деления выполняется также как при делении прямых кодов только в случае положительных операндов.
1) A>0, B>0 => A/B<2n-1 A-B*2n-1<0
2) A<0, B<0 => A/B<2n-1 A-B*2n-1>0
3) A<0, B>0 => A/B³-2n-1 A/B>-2n-1 A+B*2n-1+B>0
4) A>0, B>0 => A/B>-2n-1-1 A+B*2n-1+B<0
При одинаковых знаках операндов для проверки корректности деления необходимо сдвинуть делимое на 1 разряд влево а затем вычесть делитель из его старших разрядов.
Проверка корректности осуществляется сравнением знака первого остатка со знаком делимого. Если они НЕ совпадают деление корректно, в противном случае - не корректно.
При разных знаках пробное вычитание фактически заменяется сложением.
В этом нет ничего необычного, так как для первого шага в качестве остатка для первого шага фигурирует само делимое и его знак не совпадает со знаком делителя в соответствии с действиями для основного цикла над текущим остатком в этом случае необходимо выполнять сложение с остатком.
В связи с тем, что при разных знаках операндов получается отрицательное, имеющее диапазон, больший на единицу, чем положительное, начальные шаги, связанные с проверкой корректности деления содержат такую последовательность действий :
1) Сложение делимого с делителем, совмещенным с его младшими разрядами. При этом выполняется знаковое расширение делимого на старшие разряды делителя.
2) Сдвиг полученного остатка на один разряд влево.
3) Сложение с делителем, совмещенным со старшими разрядами остатка.
4) Сравнение знака остатка со знаком делимоговыполняется также как и для операндов с одинаковыми знаками.
В связи с тем, что при проверке корректности деления используется знак делимого необходимо при схемной реализации предусмотреть его сохранение до конца операции. По результату пробного вычитания формируется старшая цифра частного, интерпретируемая как знак.
Действительно, при корректном делении получается верный знак частного.
Пример :A=-168 B=-14 n=5
A=1101011000 ; B=10010
Выполняемые действия
N шага | обозначения | A/R (старшие) | A/C (младшие) |
0 | A¬ABR0 | 11010 -10101 10010¾¾¾ 00011sign R0¹sign B® | 11000100001000|0®® |
1 | ¬R0BR1 | +00111 10010¾¾¾ 11001sign R1=sign B | 000|00000|01 |
2 | ¬R1BR2 | +10010 10010¾¾¾ 00000sign R2¹sign B® | 00|01000|010®® |
3 | ¬R2BR3 | +00000 10010¾¾¾ 10010sign R3=sign B | 0|01000|0101 |
4 | ¬R3BR4 | -00100 10010¾¾¾ 10010sign R3=sign B | 0101001011 |
псевдо-коррекция | R4BR | -10010 10010¾¾¾ 00000 | |
коррекция частного | +01011 1¾¾¾ 01100 |
Приведенный пример иллюстрирует ряд дополнительных нюансов деления в дополнительных кодах :