- •2005 Задание
- •Содержание
- •1. Индивидуальное задание.
- •1. Подготовить для аналитической части реферативный материал на тему:
- •2. Задача для разработки алгоритма и программной реализации на Эмуляторе микро-эвм см-1800
- •2. Аналитическая часть
- •2.1. Кодирование чисел в микропроцессорах.
- •2.2. Формы хранения чисел со знаком (фиксированная точка)
- •2.3. Двоичная арифметика
- •2.4. Арифметика чисел в прямом, обратном и дополнительном кодах.
- •3. Практическая разработка
- •3.1. Описание алгоритма
- •3.4. Листинг программы.
- •4. Описание средств вычислительной техники
- •5. Выводы
- •6. Литература
2.4. Арифметика чисел в прямом, обратном и дополнительном кодах.
Сложение в прямом коде чисел, имеющих одинаковые знаки, выполняется достаточно просто. Числа складываются, и сумме присваивается код знака слагаемых. Значительно более сложной является операция алгебраического сложения в прямом коде чисел с различными знаками. В этом случае приходится определять большее по модулю число, производить вычитание чисел и присваивать разности знак большего по модулю числа.
Операция вычитания (алгебраического сложения) сводится к операции простого арифметического сложения при помощи обратного и дополнительного кодов, используемых для представления в машине чисел со знаком.
Рассмотрим применение обратного и дополнительного кодов при алгебраическом сложении 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