Вы можете использовать классический сдвиг и добавить алгоритм умножения (при условии, что ваши числа без знака).
Он основан на том факте, что 4-битное число b 3 , b 2 , b 1 , b 0 представляет число B = 2 3 × b 3 + 2 2 × b 2 + 2 1 × b 1 + b0
А A × B = 2 3 × A × b 3 + 2 2 × A × b 2 + 2 1 × A × b 1 + A × b0
Умножение на бит b i будет 0, если b i ≠ 1, а умножение на степень 2 - всего лишь сдвиг.
shift-and-add-multiplication
// multiply A X B -> C
C=0
for i in 0..3
if B & 0x01
C = C + A
end if
A <<=1
B >>=1
end for
Я не знаю avr asm, но код долженбыть легко переведенным.
Если ваши числа подписаны, проще вычислить произведение их абсолютного значения и изменить знак результата - sign (A) ignsign (B) == 1
Существуют более сложные алгоритмы, которые могут напрямую работать со знаковыми целыми числами и могут уменьшить количество шагов, например, модифицированный алгоритм Бута, но реализация более сложная, и я не уверен, чтовыигрыш будет значительным.
Редактировать: согласно комментариям, первый операнд всегда 14 = 16-2 = 2 4 -2 1 .
В этом случае самым быстрым является вычисление
C = (B << 4) - (B << 1)