Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭВМ.doc
Скачиваний:
43
Добавлен:
16.04.2015
Размер:
196.61 Кб
Скачать

2.4. Арифметика чисел в прямом, обратном и дополнительном кодах.

  1. Сложение в прямом коде чисел, имеющих одинаковые знаки, выполняется достаточно просто. Числа складываются, и сумме присваивается код знака слагаемых. Значительно более сложной является операция алгебраического сложения в прямом коде чисел с различными знаками. В этом случае приходится определять большее по модулю число, производить вычитание чисел и присваивать разности знак большего по модулю числа.

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

  1. Рассмотрим применение обратного и дополнительного кодов при алгебраическом сложении n-разрядных двоичных чисел. Могут быть сформулированы следующие правила (предполагаем, что код суммы представим в виде n-разрядной сетки).

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

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

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

3. Практическая разработка

3.1. Описание алгоритма

Идея алгоритма проделанной программы состоит в том, чтобы выяснить знак числа и разделить, собственно, основную программу на две части. В одной происходит запись положительных чисел в массив результатов, эта часть начинается с адреса 400В, заканчивается на адресе 4017. В другой части обрабатываются отрицательные числа, т.е. сначала происходит инверсия их байтов, а потом положительное приращение уже полученных инвертированных байтов и запись их в массив результатов.

3.2. Распределение памяти:

SP – двухбайтный регистр стека

B, C - пара регистров, занятых массивом исходных чисел

D, E – пара регистров, куда записываются результаты (модули исходных чисел)

H, L – пара регистров, используемых для хранения временных данных

H - регистр, используемый как счетчик

3.3. Покажем применение этого алгоритма с помощью блок-схемы.

Пуск

Ввод массива исходных чисел

Создание стека по адресу 8000h

Помещение в пару В, С массива исходных чисел

Помещение в пару D, E массива результатов

Помещение в регистрH константу 0Ah,

(создание счетчика на 10 шагов)

Засылка содержимого регистров H, L в стек

Загрузка в А старшего байта числа

Логическое умножение 80h и А

(проверка знакового разряда)

Z = 0 Да

Нет

Загрузка в А старшего байта числа Переход к младшему байту числа

Запись старшего байта результата Загрузка в А младшего байта числа

Переход к младшему байту числа Инвертирование

Переход к младшему байту результата Копирование содержимого

А в регистр L

2 1 1

2 1 1

Загрузка в А младшего байта числа Переход к старшему байту числа

Запись младшего байта числа Загрузка в А старшего байта числа

Продвижение адресов на следующую пару Инвертирование

исходных чисел (двойное приращение B)

Копирование содержимого

Продвижение адресов на следующую пару А в регистр H

результата (двойное приращение D)

Прибавление к содержимому

Извлечение содержимого H, L из стека H, L 1

Копирование содержимого

Да Z = 0 L в регистр А

Нет

Переход к младшему байту

Останов результата

Запись младшего байта

результата

Копирование содержимого

H в регистр A

Переход к старшему байту

результата

Запись старшего байта

результата

JMP