
- •Программирование цифровой техники и микроконтроллеров управления
- •Алматы 2012
- •1 Микроконтроллеры в современном мире
- •1.1 Краткая история развития микроконтроллеров
- •1.2 Задачи и роль микроконтроллеров
- •2 Выполнение арифметических операций в мп
- •2.1 Системы счислений
- •2.2 Двоичная арифметика
- •2.3 Дополнительный код
- •2.4 Знаковый разряд
- •3 Регистры общего и специального назначения
- •3.1 Регистры portc и trisc
- •3.2 Регистр Status
- •3.3 Фиксированная (абсолютная) адресация
- •4 Косвенная адресация. Логика
- •4.1 Косвенная адресация
- •4.2 Логические функции
- •5 Маскирование. Стек
- •5.1 Маскирование
- •5.2 Счетчик команд
- •5.3 Стек
- •6 Конвейер и подпрограмма задержки
- •6.1 Конвейер
- •6.2 Программа задержки
- •6.3 Расчет времени задержки
- •7 Выполнение умножения и деления
- •7.1 Умножение и деление при помощи сдвига
- •7.2 Инструкции условных переходов
- •7.3 Целочисленное умножение
- •7.4 Целочисленное деление
- •7.5 Умножение на дробное число
- •8 Программирование клавиатуры. Дешифратор
- •8.1 Клавиатура
- •8.2 Фрагменты программы
- •8.3 Дешифратор
- •8.4 Компаратор
- •9 Основные элементы цифровой техники
- •9.1 Сумматор
- •9.2 Арифметико-логическое устройство
- •9.3 Бистабильные схемы
- •9.4 Триггеры и регистры
- •10 Структура микроконтроллера. Индикатор
- •10.1 Применение операций сдвига
- •10.2 Цифровой индикатор
- •10.2 Структурная схема мк
- •11 Прерывания и сторожевой таймер
- •11.1 Прерывания
- •11.2 Подсчет посетителей с помощью прерываний
- •11.3 Сторожевой таймер
- •12 Фактор времени и аналоговый мир
- •12.1 Модуль таймера tmr1
- •12.2 Применение таймера tmr1
- •12.3 Аналоговый мир
- •Приложение а Список некоторых сокращений
- •Список литературы
- •Содержание
- •050013, Алматы, Байтурсынова, 126
2.4 Знаковый разряд
При работе с десятичными числами для обозначения положительных и отрицательных чисел используются знаки «+» и «-» соответственно. В системе с двумя состояниями мы можем оперировать только единицами и нулями. Тем не менее, взглянув на последний пример, можно получить ключ к решению этой проблемы. Как уже было сказано, отрицательное значение получается в результате заема в старший разряд числа. Так что мы можем использовать этот разряд в качестве знакового бита (sign bit), причем 0 будет эквивалентен знаку «+», и 1 -- знаку «-». Таким образом, число b’11000101’ будет соответствовать значению —59, а число b'00111011 — значению +59 (в примерах знаковый бит выделен полужирным шрифтом). Преимущество такого представления заключается в том, что при арифметических операциях со знаковым битом можно обращаться так же, как с обычным битом.
При этом результат операции будет иметь верный знак. Рассмотрим два примера в дополнительном коде а) 96-37 и б) 37-96:
а) уменьшаемое больше вычитаемого |
б) уменьшаемое меньше вычитаемого |
01100000 (+96) +11011011 (дополнительный код -37) 00111011 (+59) |
00100101 (+37) + 10100000 (дополнительный код -96) 11000101 (дополнительный код -59) |
Из примеров видно, что если отрицательное число представлено в дополнительном коде, то нам не нужно изобретать аппаратный вычитатель, поскольку прибавление отрицательного числа эквивалентно вычитанию положительного. Другими словами, А - В = А + (-В).
Более того, если числа будут записаны в дополнительном коде, результаты всех последующих арифметических операций будут автоматически в правильном коде.
С арифметическими операциями над отрицательными числами, представленными в дополнительном коде, связаны две проблемы.
Первая из этих проблем - переполнение (overflow). Она заключается в том, что при сложении двух положительных или двух отрицательных чисел может возникнуть переполнение в знаковом бите. В приведенных ниже примерах старший бит знаковый.
а) сумма положительных чисел получается отрицательной |
б) сумма отрицательных чисел получается положительной |
01000 (+8 обычный код) + 01011 (+11 обычный код) 10011 (дополнительный код -13 !!!) |
11000 (-8 дополнительный код) + 10101 (-11 дополнительный код) 01101 (обычный код +13 !!!) |
Смена значения знакового бита означает переполнение знакового бита. За этой ситуацией надо следить. Об этом в некоторых микропроцессорах выводится сигнализация.
Вторая проблема связана с выполнением арифметических операций над знаковыми операндами с числами разной разрядности. В этом случае необходимо выполнить расширение числа с помощью знаковых разрядов.
При расширении данных дополнительные разряды слева следует заполнять знаковым битом. Этот метод называется расширением знака (sign extension).
С учетом сказанного, выполним расширение знаковым разрядом до 8 бит, тогда приведенные выше примеры будут выглядеть так.
а) сумма положительных чисел |
б) сумма отрицательных чисел |
00001000 (+8 обычный код) + 00001011 (+11 обычный код) 00010011 (+19 обычный код) |
11111000 (-8 дополнительный код) +11110101 (-11 дополнительный код) 11101101 (-19 дополнительный код) |
Результат получился правильный в обоих случаях.