|
|
|
+ |
0001 0001 1010 0110 0110 |
|
1010 коррекция |
|
|
+ |
0001 0001 0100 0110 0110 |
|
1111 1010 1000 1100 1101 |
|
|
+ |
0000 1011 1101 0011 0011 |
|
1010 1010 коррекция |
|
|
+ |
0000 0101 0111 0011 0011 |
|
1111 1010 1000 1100 1101 |
|
|
|
0000 0000 0000 0000 0000 |
|
1.4 Структурная схема ОА
(Приложение А, лист № 1 )
Для реализации предложенного алгоритма выполнения операции деления необходимы следующие операционные элементы:
1) Рг.А(0-19) – регистр делителя: 4р.- знак, 16р.- мантисса делителя.
2) СМ (0-43) – сумматор: 4р.- знак, 32р.- мантисса делимого,
4р.- переносы.
3) Рг.В(0-19) – регистр частного: 4р.- знак, 16р.- мантисса частного.
4) регистр Рг.К(0-3) – регистр коррекции.
5) счетчик Сч.1 - этот счетчик необходим для формирования тетрады частного.
6) счетчик Сч.2 - этот счетчик необходим для выхода из цикла деления, выход будет осуществлен после того, как будут пройдены все тетрады.
7) счетчик Сч.3 - этот счетчик необходим для выхода из коррекции.
1.5 Разработка граф-схемы алгоритма (ГСА)
(Приложение А, лист № 2,3)
Для реализации любой арифметической операции необходимо знать алгоритм ее выполнения, ниже приводится алгоритм операции деления чисел с фиксированной запятой в коде 8421, 8421+6. Если блоки выполняются последовательно, то ссылки на следующий блок не приводятся.
Таблица 1 - Определение блоков
Номер блока
Назначение
A00(Л2)
Начало.
B00(Л2)
Начальная установка:
СМ:=X, Рг.А:=Y, Сч1:=0, Сч2:=0, Сч3:=0, Рг.K:="1010".
C00(Л2)
Определяем знак частного путем сложения знаковых разрядов делимого и делителя по модулю два и заносим его в Рг.B[16-19].
D00(Л2)
Первое пробное сложение делимого и делителя, делитель в дополнительном коде.
F00(Л2)
Проверяем СМ[40-43]=0000, если Да то на G00(Л2), иначе на B00(Л3).
G00(Л2)
Программа обработки прерываний (АВОСТ).
Выдача сообщения о переполнение.
B00(Л3)
Проверяем СМ[22,23]=11, т.е. на наличие запрещенных комбинаций, если Да то на D00(Л3), иначе на C01(Л3).
C01(Л3)
Проверяем СМ[21,23]=11, т.е. на наличие запрещенных комбинаций, если Да то на D00(Л3), иначе на E00(Л3).
D00(Л3)
Коррекция: СМ[20-23]:=СМ[20-23] + Рг.К[0-3].
E00(Л3)
Проверяем СМ[27,28]=11, т.е. на наличие запрещенных комбинаций, если Да то на G00(Л3), иначе на F01(Л3).
F01(Л3)
Проверяем СМ[26,28]=11, т.е. на наличие запрещенных комбинаций, если Да то на G00(Л3), иначе на B02(Л3).
G00(Л3)
Коррекция: СМ[25-28]:=СМ[25-28] + Рг.К[0-3].
B02(Л3)
Проверяем СМ[32,33]=11, т.е. на наличие запрещенных комбинаций, если Да то на D02(Л3), иначе на C03(Л3).
C03(Л3)
Проверяем СМ[31,33]=11, т.е. на наличие запрещенных комбинаций, если Да то на D02(Л3), иначе на E02(Л3).
D02(Л3)
Коррекция: СМ[30-33]:=СМ[30-33] + Рг.К[0-3].
E02(Л3)
Проверяем СМ[37,38]=11, т.е. на наличие запрещенных комбинаций, если Да то на G02(Л3), иначе на F03(Л3).
F03(Л3)
Проверяем СМ[36,38]=11, т.е. на наличие запрещенных комбинаций, если Да то на G02(Л3), иначе на B04(Л3).
G02(Л3)
Коррекция: СМ[35-38]:=СМ[35-38] + Рг.К[0-3].
B04(Л3)
Проверяем СМ[42,43]=11, т.е. на наличие запрещенных комбинаций, если Да то на D04(Л3), иначе на C05(Л3).
C05(Л3)
Проверяем СМ[41,43]=11, т.е. на наличие запрещенных комбинаций, если Да то на D04(Л3), иначе на E04(Л3).
D04(Л3)
Коррекция: СМ[40-43]:=СМ[40-43] + Рг.К[0-3].
E04(Л3)
Проверяем Сч.3=0, если Да, то переходим на B04(Л2), иначе на F05(Л3).
F05(Л3)
Проверяем Сч.3=1, если Да, то переходим на B02(Л2), иначе на B06(Л2).
B04(Л2)
Сдвигаем регистр СМ влево на 5 разрядов.
В Сч.1 заносим 9.
C04(Л2)
Сч.1:=9.
D04(Л2)
Сложение делимого и делителя, делитель в прямом коде.
F04(Л2)
Сч.3:=1.
Переход на коррекцию.
B02(Л2)
Проверяем СМ[40-43]=0000, если Да то на C02(Л2), иначе на C03(Л2).
C03(Л2)
Декремент Сч1 (отнимаем от текущей тетрады частного 1).
C02(Л2)
Инкремент Сч.2 (переход к следущей тетраде частного).
Присваиваем Рг.В[0-3] значение Сч1.
Сдвигаем регистр Рг.В влево на 4 разряда.
D02(Л2)
Сдвигаем регистр СМ влево на 5 разрядов.
В Сч.1 заносим 1.
E02(Л2)
Сложение делимого и делителя, делитель в дополнительном коде.
G02(Л2)
Сч.3:=2.
Переход на коррекцию.
B06(Л2)
Проверяем СМ[40-43]=0000, если Да то на C06(Л2), иначе на C07(Л2).
C06(Л2)
Инкремент Сч1 (прибавляем к текущей тетраде частного 1).
C07(Л2)
Инкремент Сч.2 (переход к следущей тетраде частного).
Присваиваем Рг.В[0-3] значение Сч1.
Сдвигаем регистр Рг.В влево на 4 разряда.
D07(Л2)
Проверяем Сч.2=0, если Да то на E07(Л2), иначе на C04(Л2).
E07(Л2)
Выводим частное, т.е. Z:=Рг.В.
F07(Л2)
Конец.
1.6 Описание моделирующей программы
(Приложение В)
Программа операции деления без восстановления остатка со сдвигом остатка с фиксированной точкой в коде 8421, 8421+6 выполнена на языке программирования ассемблера. В моделирующей программе регистрами Рг.А, Рг.В, Рг.К, а так же счетчиками СЧ.1 и СЧ.2 СЧ.3 являются регистры самой ЭВМ и оперативная память.
Описание программы построчно:
1 – 22 – Связывание данных с сегментом данных DS, очистка экрана, приглашение к вводу двух чисел, запись введенных чисел по адресам в сегменте данных.
23 – 28 – Вычисление знака частного.
29 – 72 – Вычисление количества тетрад, подготовка под знак целой тетрады, вызов процедур преобразования из ASCII в байты делимого и делителя, пробное сложение, проверка на переполнение.
73 – 79 – Вывод сообщения о переполнении и переход на выход из программы.
80 – 103 – Вызов процедуры преобразования конечного результата из байта в ASCII, вывод знакового разряда и вывод результата, стандартный выход из программы.
104 – 131 – Процедура перевода делимого из ASCII в BIN.
При использовании материалов активная ссылка на источник обязательна.