MUL - инструкция умножения в микроконтроллерах, присутствует, например, в микроконтроллерах Atmega . Но не во всех микроконтроллерах AVR присутствует аппаратная поддержка функций умножения. Например в микроконтроллерах Attiny команда MUL попросту отсутствует, поэтому решение этой задачи возлагается на программный код.
Основной момент, который необходимо учитывать при реализации функции умножения это то, что для сохранения результата умножения понадобится два регистра. В один из регистров будет сохранён младший байт результата, а во второй регистр буде сохранён старший байт результата.
Программная реализация MUL
Ниже приведена функция умножения, которая работает с 8-ми разрядными числами и на выходе даёт 16-ти разрядные числа.
;======= Программная функция умножения (реализует mul) ============================== ; r16 ; множимое ; r17 ; множитель ; r0 ; младший байт результата ; r1 ; старший байт результата ; r19 ; счетчик цикла ;----------------------------------------------------------------------------------- mpy8u_c: clr r1 ; очищаем регистр для сохранения старшего байта результата ldi r19,8 ; устанавливаем стартовое значение счетчика цикла lsr r17 ; сдвигаем множитель вправо m8u_1: brcc m8u_2 ; производим переход, если С = 0 add r1,r16 ; к старшему байту результата прибавляем множимое m8u_2: ror r1 ; старший байт результата сдвигаем вправо ror r0 ; младший байт результата сдвигаем вправо dec r19 ; производим декремент счетчика brne m8u_1 ; производим переход, если С != 0 ret
Примечание. В данной программной функции используются арифметические операции, контроль выполнения которых возлагается на SREG - AVR Status register.
SREG - AVR Status Register
- Бит 7 - Бит глобального включения прерываний;
- Бит 6 - Бит копирования и загрузки инструкций;
- Бит 5 - Флаг переноса. Выставляется после некоторых арифметических операций;
- Бит 4 - Флаг знака числа;
- Бит 3 - Флаг дополнения до двух. Выставляется при переполнении регистров;
- Бит 2 - Флаг негативного результата арифметических или логических операций;
- Бит 1 - Флаг нулевого результата. Выставляется, если результат арифметических или логических операций равен нулю.
- Бит 0 - Флаг переноса. Указывает перенос в арифметических и логических операциях.