В книге «Музыкальные приложения микропроцессоров» автор дает следующий алгоритм для умножения 4-х квадрантов двух 8-битных целых чисел со знаком с 16-битным результатом со знаком:
Делает умножение без знака нанеобработанные операнды.Затем, чтобы исправить результат, если знак мультипликатора отрицательный, беззнаковая одинарная точность вычитает множитель из старших 8 битов необработанного 16-битного результата.Если знак множителя также отрицателен, беззнаковая одинарная точность вычитает мультипликатор из верхних 8 бит необработанного 16-битного результата.
Я попытался реализовать это в ассемблере и, похоже, не смог заставить его работать.Например, если я беззнаковый умножить -2 на -2, необработанный результат в двоичном виде будет B11111100.00000100.Когда я вычитаю B1111110 дважды из старших 8 бит в соответствии с алгоритмом, я получаю B11111110.00000100, а не B00000000.00000100, как хотелось бы.Спасибо за понимание, где я могу ошибаться!
Редактировать - код:
#define smultfix(a,b) \
({ \
int16_t sproduct; \
int8_t smultiplier = a, smultiplicand = b; \
uint16_t uproduct = umultfix(smultiplier,smultiplicand);\
asm volatile ( \
"add %2, r1 \n\t" \
"brpl smult_"QUOTE(__LINE__)"\n\t" \
"sec \n\t" \
"sbc %B3, %1 \n\t" \
"smult_"QUOTE(__LINE__)": add %1, r1 \n\t" \
"brpl send_"QUOTE(__LINE__)" \n\t" \
"sec \n\t" \
"sbc %B3, %2 \n\t" \
"send_"QUOTE(__LINE__)": movw %A0,%A3 \n\t" \
:"=&r" (sproduct):"a" (smultiplier), "a" (smultiplicand), "a" (uproduct)\
); \
sproduct; \
})