Деление в дополнительных кодах.

IDIV

Деление знаковых.

Особенности реализации деления в ЭВМ.

(по отношению к целым числам)

 

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-разрядный сумматор дополнительным разрядом для явного представления знака остатка.

Если по завершению всех шагов деления остаток является отрицательным то требуется его восстановление путем сложения с делителем.

По аналогии с операцией умножения знаковое деление может быть реализовано одним из двух методов:

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 (младшие)
A   A B R0   -10101 ¾¾¾ ­ sign R0¹sign B®         1000|0 ­ ®®
  R0 B   R1   +00111 ¾¾¾ sign R1=sign B   000|00     000|01
  R1 B   R2   +10010 ¾¾¾ ­ sign R2¹sign B®     00|010     00|010 ­ ®®
  R2 B   R3   +00000 ¾¾¾ sign R3=sign B   0|0100     0|0101
  R3 B   R4   -00100 ¾¾¾ sign R3=sign B      
псевдо- коррекция R4 B R -10010 ¾¾¾  
коррекция частного     +01011 ¾¾¾

 

Приведенный пример иллюстрирует ряд дополнительных нюансов деления в дополнительных кодах :

На четвертом шаге при сдвиге остатка произошло искажение его знака. Выполняемое действие над остатком должно определяться его знаком для предыдущего шага (до сдвига). В схемной реализации этот факт необходимо учитывать путем применения модифицированного кода с удвоенным знаковым разрядом. В связи с этим разрядность регистра для хранения остатка и частного должна быть 2n+1, а разрядность сумматора (сумматора вычитателя) n+1. При получении нулевого остатка на коком либо шаге деления для следующего шага остаток будет равен делителю. При его сдвиге влево он станет равен удвоенному делителю. И после вычитания делителя на следующем шаге он снова станет равен делителю. Таким образом в конце операции после выработки всех цифр частного остаток будет не нулевым, а равным делителю. Если при этом его знак совпадает со знаком делимого, то в соответствии с основным алгоритмом деления он не подлежит коррекции.

Для устранения этого недостатка алгоритма во всех случаях совпадения знака остатка и делимого выполняется попытка так называемой псевдокоррекции. Если после этой коррекции остаток равен нулю, то он является истинным, если же остаток не равен нулю, то требуется его восстановление обратным по сравнению с псевдокоррекцией действием с делителем.