Библиотека Microsoft включает функции для сложения и вычитания, которые имеют дело с недостаточным / переполнением (_Q15add и _Q15sub).
Умножение может быть реализовано как функция сборки (я думаю, что код хорош - это из памяти).
C вызывающий прототип:
extern _Q15 Q15mpy(_Q15 a, _Q15 b);
Подпрограмма (помещенная в исходный файл .s в вашем проекте):
.global _Q15mpy
_Q15mpy:
mul.ss w0, w1, w2 ; signed multiple parameters, result in w2:w3
SL w2, w2 ; place most significant bit of W2 in carry
RLC w3, w0 ; rotate left carry into w3; result in W0
return ; return value in W0
.end
Не забудьте включить libq.h
Эта процедура выполняет сдвиг влево на один бит вместо сдвига вправо на 15 бит для результата.Нет проблем переполнения, потому что числа Q15 всегда имеют величину <= 1. </p>