在《微处理器的音乐应用》一书中,作者给出了以下算法,用于对两个8位有符号整数进行4象限乘法,得到16位有符号结果:
对原始操作数执行无符号乘法。然后为了更正结果,如果被乘数符号为负,则无符号单精度从原始16位结果的前8位减去乘数。如果乘数符号也为负,则无符号单精度从原始16位结果的前8位减去被乘数。
我试着用汇编程序实现它,但似乎不能使它工作。例如,如果我用无符号乘法乘以二进制的原始结果是B11111100.00000100。当我根据算法从前8位减去B1111110两次时,我得到B1111110.00000100,不是一个人想要的b0000000.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; \
})
字符串
2条答案
按热度按时间6bc51xsx1#
编辑:你把减法做错了。
字符串
否则你的算法是正确的:在第四象限,你需要减去100 h乘以和(a+b)。写二进制补码字节为(100 h-x)我得到:
型
uurity8g2#
当我根据算法从前8位减去B1111110两次时,我得到B1111110.00000100,而不是人们想要的B00000000.00000100。
如果我从
B11111100
中减去B11111110
两次,我得到B00000000
,如下所示:字符串
看上去很简单。