Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PRINT.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.1 Mб
Скачать

29. Алгоритмы слож-я и выч-я двоично-десятичных чисел

Особенности операций сложения и вычитания в компьютерах двоично-десятичных чисел без знака.

Операции с двоично-десятичными числами осуществляются на тех же сумматорах, на которых осуществляются операции с двоичными числами и по тем же основным правилам двоичной арифметики. Однако для того, чтобы результаты сложения и вычитания были также представлены в двоично-десятичном коде, часто требуется вводить специальную коррекцию в коды, полученные после сложения и вычитания.

При суммировании коррекция производится в случае, если значение какой-либо тетрады (четырех двоичных разрядов, кодирующих десятичную цифру) полученного результата будет больше 1001 или, если есть перенос из данной тетрады в более старшую. Наличие такого переноса процессором определяется по состоянию флагов AF и CF.

Дело в том, что, используя 4 двоичных разряда, для представления одной десятичной цифры мы, фактически, реализуем шестнадцатеричную систему счисления. Однако, вычислительные операции должны проводиться с числами в двоично-десятичной системе счисления с весами разрядов 8421, в которой 6 кодов тетрады (1010, 1011, 1100, 1101, 1110 и 1111) являются запрещенными, их быть не должно. А поскольку для осуществления операций сложения и вычитания используются обычные двоичные сумматоры, перенос между разрядами происходит как при работе с шестнадцатеричными числами, т.е. после кода 1111 (1510), а не 1001 (1010), как это должно быть при двоично-десятичной системе счисления. Поэтому, для формирования результата в требуемой двоично-десятичной системе, и должна производиться коррекция результата, путем добавления числа 0110 (610) в те тетрады результата, значение которых больше 1001 или, если из этой тетрады был перенос в более старшую тетраду. (6 = 16 – 10→ разница между основаниями шестнадцатеричной и десятичной систем счисления).

Таким образом, операция суммирования двух двоично-десятичных кодов без знака осуществляется по следующему алгоритму.

- Осуществляется операция суммирования двух исходных двоично-десятичных кодов, рассматривая их как обычные двоичные коды без знака.

- Если результат суммирования в какой-либо тетраде двоичного результата будет > 9, или произойдет перенос из этой тетрады в более старшую (CF=1 или AF=1), то в данной тетраде производится коррекция суммирования.

- Коррекция суммирования заключается в том, что в этих тетрадах к результату суммирования прибавляется 0110.

Примеры:

01000110 + 00111000=01111110 (46 + 38 = 84).

Состояние флагов: ZF=0; AF=0; PF=1; CF=0.

Поскольку флаг CF=0; переноса из старшего разряда а, следовательно и переполнения разрядной сетки, нет, и результат достоверен. Однако значение кода младшей тетрады результата больше 1001.

Это означает, что необходимо ввести коррекцию в младшую тетраду, т.е. прибавить к ней 0110

01111110 + 0110 = 10000100.

01001001 : (49 + 58 = 107).

+ :

01011000 : Есть перенос из младшей тетрады в старшую и, кроме того, старшая

-------------- : тетрада результата содержит код, больший 1001. Следовательно, и

10100001 : в младшую и в старшую тетраду должна быть внесена коррекция.

+ : После коррекции происходит перенос из старшего разряда резуль-

01100110 : тата, что характеризует переполнение разрядной сетки результата.

--------------- : Состояние флагов: ZF=0; AF=1; PF=0; CF=1.

1: 00000111 :

01010010 : (52 + 34 = 86).

+ : Переноса из младшей тетрады в старшую тетраду нет, и обе тетрады

00110100 : не превышают значения 1001. Следовательно, коррекция результата

------------- : не требуется. Состояние флагов: ZF=0; AF=0; PF=0; CF=0.

10000110 :

Операция вычитания целых двоично-десятичных чисел осуществляется похожим образом, но имеет ту особенность, что при вычитании переполнение разрядной сетки не может произойти принципиально, однако при вычитании уменьшаемое может оказаться меньше вычитаемого. При этом возникает заем из старшего разряда, который фиксируется, аналогично переносу, установкой флага CF в единицу. Это характеризует отрицательный результат и, следовательно, он будет представлен в дополнительном коде, который необходимо преобразовать в прямой код и только после этого корректировать результат. Коррекция, как и в случае сложения, осуществляется либо при значении декады больше 1001, либо при установке флагов CF или AF в единицу и заключается в том, что из соответствующей тетрады результата, вычитается код 0110.

Таким образом, алгоритм вычитания двоично-десятичных целых чисел сводится к следующему.

- Осуществляется операция вычитания двух двоично-десятичных чисел, рассматриваемых как обычные двоичные числа.

- Если результат положительный (уменьшаемое больше вычитаемого), флаг CF=0, то результат анализируется на состояние флага AF и на полученные значения тетрад. Если значение тетрады больше 1001, или флаг, AF=1, то из соответствующей тетрады результата вычитается константа 0110.

- Если результат отрицательный (CF=1), то полученный двоичный код результата является дополнительным, он преобразуется в прямой код, который затем корректируется по тетрадно, т.е., при значении данной тетрады больше 1001, из нее вычитается константа 0110.

Примеры:

10000011 : (83 – 61 = 22).

- : ZF=0; AF=0; PF=1; CF=0.

01100001 : Переносов из тетрад нет, и обе они меньше 1001.

------------- : Коррекция не требуется.

00100010 :

10000001 : (81 – 69 = 12).

- : Состояние флагов: ZF=0; AF=1; PF=1; CF=0.

01101001 : Поскольку есть заем из старшей тетрады в младшую (AF=1),

------------- : в младшую тетраду результата вводится коррекция.

00011000 - 0110 = 00010010

00011000 : (18 – 87 = − 69).

- : Состояние флагов: ZF= 0; AF=0; PF=0; CF=1.

10000111 : Поскольку есть заем в старший разряд (CF=1), то

-------------- : результат отрицательный и получен в дополнительном коде.

1: 10010001 : Результат в дополнительном коде.

1: 01101111 : Результат в прямом коде. Младшая тетрада больше 1001,

- : и, следовательно, производится коррекция младшей тетрады.

0110 :

--------------- :

1: 01101001 : Прямой двоично-десятичный код результата.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]