I
I
МИКРОКОНТРОЛЛЕРЫ
I
самим собой. Разумеется, такой спо-
соб реализации умножения пригоден
только для очень небольших чисел
(из-за огромных накладных расхо-
дов), но, тем не менее, в некоторых
случаях и он может оказаться полез-
ным. Гораздо чаще умножение чисел
в микроконтроллерах реализуют с
помощью двух операций - сложения
и
сдвига.
Остановимся на этом спо-
собе подробнее.
Вспомним (опять же из школьно-
го курса), как легко выполняются опе-
рации умножения на степень числа
1 0
: для того, чтобы умножить число
на
1 0
, достаточно просто приписать
к нему справа ноль; для того, чтобы
умножить число на
10 0
, достаточно
приписать справа два нуля и т.д.
Даже таблицу умножения знать не
нужно! Фактически мы просто сдви-
гаем множимое влево, а на освобо-
дившееся место записываем столько
нулей, на сколько цифр было сдви-
нуто множимое. В системе команд
микроконтроллера есть команды
сдвига содержимого числа на
1
раз-
ряд (бит) влево. Действие этой ко-
манды равносильно умножению чис-
ла на
2
, т.е. команда сдвига - это,
фактически, “хитрая" команда умно-
жения числа на 2. Допустим, нам не-
обходимо умножить какое-либо чис-
ло на 7. Представим в свою очередь
число 7 как 4 + 2 + 1. Это значит, что
для умножения числа на 7 достаточ-
но сложить множимое, умноженное
на
1
(т.е. само число), с множимым,
умноженным на
2
(читай - сдвинутым
на
1
разряд влево) и с множимым,
умноженным на 4 (читай - сдвинутым
на 2 разряда влево). Обобщая эту
методику, можно построить следую-
щий алгоритм умножения чисел:
♦ Сдвинуть множимое на 1 разряд
влево (умножить его на
2
).
♦ Если в соответствующем бите
множителя установлена лог.
1
, то
сложить сдвинутое множимое с
будущим результатом.
♦ Повторить все сначала, пока не
закончится множитель.
Отметим только особенность опе-
рации умножения Т- при умножении
двух чисел размер получаемого ре-
зультата будет равен сумме разме-
ров множимого и множителя (пример
- при умножении 9x9 получается 81,
40 |-------------------------------------------
т.е. 1+1=2 цифры). Соответственно,
при умножении двухбайтных чисел
результат получится (или, по крайней
мере, может получиться) четырехбай-
тным, при умножении четырехбайт-
ных чисел - восьмибайтным и т.д.
Сразу же - еще одно существенное
замечание - описанная методика
пригодна для умножения числа на
положительное число (этого вопро-
са мы касались, когда рассматрива-
ли способы представления знака чис-
ла). Если множитель отрицателен,
ему необходимо вначале сменить
знак, затем выполнить операцию
умножения, и затем вновь изменить
знак результата. Пример программы
см. там же.
Приведенная программа умноже-
ния является достаточно быстрой
(если в данном случае вообще умес-
тно говорить о быстроте), но ее мож-
но заметно ускорить, если кроме опе-
раций сдвига и сложения допустить
при работе еще одну операцию -
вычитание. Идея такого ускорения
заключается в следующем. Пусть
нам необходимо умножить какое-
либо число на число 15. Число 15, в
свою очередь можно представить как
сумму чисел
1
+2+4 +
8
, т.е. для
получения результата необходимо
сложить множимое +
2
* множимое +
4 * множимое +
8
* множимое —> ито-
го 3 операции сдвига и 4 операции
сложения. Но ведь число 15 можно
представить и другим способом, а
именно 15 = 16 - 11 В этом случае
для получения результата нам надо
рассчитать 16 * множимое - множи-
мое —>
итого 4 операции сдвига и 1
операция Вычитания! Обрабатывая
таким способом группы подряд иду-
щих битов лог
.1
множителя, мы мо-
жем существенно ускорить операцию
умножения. Реализацию этого вари-
анта операции умножения можно
найти в том же
примере.
И еще один способ ускорения
операции умножения - когда чис-
ло умножается на заранее задан-
ную константу (такие задачи встре-
чаются достаточно часто). В этом
случае вместо общей программы
умножения целесообразно реализо-
вать частную программу умножения
- ведь формула расчета (на сколь-
ко сдвигать и с чем складывать) нам
известна заранее. В этом же приме-
ре показан вариант умножения чи-
сел на константу
1 0
.
Деление многобайтных чисел
Деление многобайтных чисел мож-
но выполнить по той же методике,
которой старшее поколение обуча-
лось в школе - путем последова-
тельного вычитания сдвинутого де-
лителя из делимого. Здесь, однако,
предварительно следует остано-
виться на одном моменте. Если чи-
татель обратил внимание, для лево-
го сдвига в системе команд микро-
контроллера существует две коман-
ды -
shl
и
rlc,
а для правого - три:
stir, shra
и
rrc.
Что это такое и чем
зти команды отличаются? Для про-
яснения этого вопроса нужно вспом-
нить статью цикла “Первая програм-
ма для микроконтроллера”, в кото-
рой мы подробно останавливались
на способе представления знака
числа в микроконтроллере.
Предположим, что в ячейке па-
мяти хранится число -100. Его внут-
реннее представление
1 0 0 1 1 1 0 0
b.
Команда
shr
должна, по своему
смыслу, поделить это число на
2
, т.е.
получить в итоге -50. Внутреннее
представление числа -5 0 равно
1 1
001
1
10Ь. Но команда
shr
даст вме-
сто этого другое число -
0 1 0 0 1 1 1
0Ь,
т.е.
+78!
Поэтому, кроме команды
shr
в системе команд практически любо-
го микроконтроллера существует и
другая команда -
shra:
она не очи-
щает старший (знаковый) бит байта,
а оставляет его таким, каким он был
перед выполнением команды. При
сдвиге с ее помощью числа
- 1 0 0
мы
получим 11001110Ь, т.е. внутреннее
представление числа -50. Для лево-
го сдвига
shl
двух различных команд
в микроконтроллерах не предусмот-
рено - там бит, представляющий
знак числа, в любом случае будет
потерян.
Пример деления чисел
см. там же.
Следует отметить, что, во-первых,
размер частного равен разности
размеров делимого и делителя, а,
во-вторых, помимо частного при
операции деления всегда получает-
ся еще и остаток от деления, потому
что в микроконтроллере использует-
ся
целочисленная
арифметика.
| Радиолюбитель - 03/2006
предыдущая страница 39 Радиолюбитель 2006-03 читать онлайн следующая страница 41 Радиолюбитель 2006-03 читать онлайн Домой Выключить/включить текст