【发布时间】:2011-08-25 10:37:36
【问题描述】:
在《微处理器的音乐应用》一书中,作者给出了以下算法,将两个 8 位有符号整数与 16 位有符号结果进行 4 象限相乘:
对原始操作数进行无符号乘法。然后纠正结果,如果被乘数符号为负,无符号单精度从原始 16 位结果的前 8 位中减去乘数。如果乘数符号也是负数,则无符号单精度从原始 16 位结果的前 8 位中减去被乘数。
我尝试在汇编程序中实现它,但似乎无法让它工作。例如,如果我无符号乘以 -2 乘以 -2,则二进制的原始结果为 B11111100.00000100。当我根据算法从前 8 位中减去 B1111110 两次时,我得到 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; \
})
【问题讨论】:
-
你能不能贴一些代码?
-
代码在 AVR-GCC 内联汇编器中,所以它真的丑陋。如果它可能有帮助,我当然可以发布它......
-
只是说如果我们看到一些代码可能会更容易提供帮助。 :) (除非它的 400 行)