
- •Алматы 2011
- •1 Лекция 1. Микроконтроллеры в современном мире
- •2 Лекция 2. Выполнение арифметических операций в мп
- •3 Лекция 3. Регистры общего и специального назначения
- •4 Лекция 4. Косвенная адресация. Логика. Маскирование
- •5 Лекция 5. Маскирование. Стек
- •7 Лекция 7. Выполнения умножения и деления
- •8 Лекция 8. Программирование клавиатуры. Дешифратор.
- •9 Лекция 9. Основные элементы цифровой техники
- •10 Лекция 10. Структура микроконтроллера, 2-10 система
- •11 Лекция 11. Прерывания и сторожевой таймер
- •12 Лекция 12. Фактор времени и аналоговый мир
- •Приложение а Список некоторых сокращений
- •Литература
- •Оглавление
- •0 50013, Алматы, Байтурсынова, 126
2 Лекция 2. Выполнение арифметических операций в мп
Цель лекции: освоить выполнение арифметических операций в двоичной системе с применением двоичного кода.
2.1 Системы счислений
Микропроцессор, работает с числами в двоичной системе счисления. Для удобства восприятия чисел человеком применяется также шестнадцатеричная система и двоично-десятичная. Двоично-десятичный код (Binary-Coded Decimal — BCD) является гибридом двоичного и десятичного представлений. Он широко используемым при работе с портами ввода/вывода цифровых устройств, например с семи сегментным символьным индикатором. При таком представлении каждый десятичный разряд заменяется своим двоичным эквивалентом. Выполнение арифметических операций с числами, записанными в 2-10 коде, представляет собой не простую задачу. Поэтому, как правило, BCD-числа сначала преобразовываются в обыкновенные двоичные числа и после выполнения операций вновь преобразовываются в код BCD.
-
Таблица 1.3 – Системы счислений
Различные формы записи чисел от 0 до 20
Десятичная система
Двоичная система
Шестнадцатеричная система
Двоично-десятичный код
0
0000
0
0000
1
0001
1
0001
2
0010
2
0010
3
0011
3
0011
4
0100
4
0100
5
0101
5
0101
6
0110
6
0110
7
0111
7
0111
8
1000
8
1000
9
1001
9
1001
10
1010
А
0001 0000
11
1011
В
0001 0001
12
1100
С
0001 0010
13
1101
D
0001 0011
14
1110
Е
0001 0100
15
1111
F
0001 0101
16
10000
10
0001 0110
17
10001
11
0001 0111
18
10010
12
0001 1000
19
10011
13
0001 1001
20
10100
14
0010 0000
2.2 Двоичная арифметика
Двоичная арифметика подчиняется тем же правилам, что привычная нам арифметика по основанию 10. Простейшей арифметической операцией является операция сложения, представляющая сокращенную форму записи операции нахождения общего количества чего-либо по сравнению с более примитивным процессом счета или прибавления единицы. Так, запись 2 + 4 = 6 гораздо удобнее, чем 2+1=3, 3+1=4, 4+1=5, 5+1=6. Хотя отметим, что именно так выполняются операции в МП. Двоичное сложение подчиняется всего 4-м правилам:
0+0=0 0+1=1 1+0=1 1+1=10 (1 в переносе)
Сначала эти правила применяются к самым младшим значащим битам (Least Significant Bit — LSB); при возникновении переноса он передается в бит, расположенный левее. Процесс вычисления заканчивается старшими значащими битами (Most Significant Bit — MSB). Если из этой позиции происходит перенос, то именно он становится самым старшим битом суммы.
Пример а) Десятичные числа 96 1-е слагаемое + 37 2-е слагаемое ^^ Переносы 133 Сумма |
Пример б) Двоичные числа 1100100 1-е слагаемое +0100101 2-е слагаемое ^^ ^ Переносы 10001001 Сумма |
Подобно тому, как при сложении осуществляется прямой счет, операция вычитания соответствует обратному счету, при котором от исходного значения отнимаются единицы. Так, операция 8-5=3 эквивалентна последовательности операций 8-1=7, 7-1=6, 6-1=5, 5-1=4, 4-1=3.
В соответствии с методикой вычитания десятичных чисел аналогичные правила вычитания применяются и к двоичным числам, начиная с младших битов и заканчивая старшими. Для каждого бита, в котором из меньшего числа вычитается большее число, из ближайшего старшего бита занимается единица. С учетом заема правила вычитания в двоичной системе имеют вид
0-0=0 0-1=1 из старшего бита занимается 1 |
1-0=1 1-1=0 |
а) Десятичные числа 96 Уменьшаемое - 37 Вычитаемое ^ Заем 59 Разность |
б) Двоичные числа 1100000 Уменьшаемое -0100101 Вычитаемое ^^ ^ Заем 0111011 Разность |
Несмотря на то, что эти знакомые методы прекрасно работают, при реализации их в цифровых схемах возникает ряд проблем:
- Что делать, если вычитаемое меньше уменьшаемого?
- Как нам различать положительные и отрицательные числа?
- Можно ли выполнить вычитание с помощью блока суммирования?
Чтобы понять суть проблем, рассмотрим следующий пример:
а) Десятичные числа 37 Уменьшаемое - 96 Вычитаемое ^ Заем 41 Разность (-59) |
б) Двоичные числа 0100101 Уменьшаемое —1100000 Вычитаемое ^ Заем 1000101 Разность (-0111011) |
Чтобы понять, что получилось рассмотрим дополнительный код.
2.3 Дополнительный код
Обычно, если уменьшаемое меньше вычитаемого, мы меняем операнды местами и добавляем знак минуса к результату, т.е. вычисляем выражение разность = вычитаемое - уменьшаемое. Если мы не выполним такой перестановки, как показано в примере, приведенном выше, то результат покажется неверным. На самом деле число 41 является правильным в том смысле, что представляет собой разность между числом 59 (правильный результат) и 100. То есть число 41 представляет собой дополнительный код числа 59 в десятичной системе. Более того, сам факт заема из старшего разряда числа указывает на то, что результат операции отрицателен и представлен в дополнительном коде. Для преобразования числа, представленного в дополнительном коде, в «нормальный» вид достаточно просто инвертировать каждый десятичный разряд и к полученному значению прибавить единицу. Инвертирование десятичного разряда заключается в вычитании его значения из 9.
Далее дополнительный код будем обозначать курсивом.
Таким образом, дополнительный код числа -59 в десятичной системе равен 41: 59 -> 40+1=41.
Причиной, по которой мы не оставляем отрицательные числа в дополнительном коде, является необычность для нас такого представления. Разумеется, использование дополнительного кода для представления отрицательных значений применимо и к двоичным числам. Причем, простота инвертирования (0—>1, 1—>0) делает этот метод очень привлекательным. Обратимся к приведенному выше примеру:
1000101 -> 0111010 + 1 = -0111011, т.е. -59 в десятичной системе.
И все же отрицательные числа следует оставлять в дополнительном коде. Операция преобразования в дополнительный код является обратимой.
2.4 Знаковый разряд
При работе с десятичными числами для обозначения положительных и отрицательных чисел используются знаки «+» и «-» соответственно. В системе с двумя состояниями мы можем оперировать только единицами и нулями. Тем не менее, взглянув на последний пример, можно получить ключ к решению этой проблемы. Как уже было сказано, отрицательное значение получается в результате заема в старший разряд числа. Так что мы можем использовать этот разряд в качестве знакового бита (sign bit), причем 0 будет эквивалентен знаку «+», и I -- знаку «-». Таким образом, число b’11000101’ будет соответствовать значению —59, а b'00111011 — значению +59 (в примерах знаковый бит выделен полужирным шрифтом). Преимущество такого представления заключается в том, что при любых арифметических операциях с ним можно обращаться так же, как и с обычным битом.
При этом результат операции будет иметь верный знак:
Пример а). Уменьшаемое больше вычитаемого |
Пример б) Уменьшаемое меньше вычитаемого |
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 дополнительный код) |
Результат получился правильный в обоих случаях.