assembly 汇编8x8四象限乘法算法

yhqotfr8  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(684)

在《微处理器的音乐应用》一书中,作者给出了以下算法,用于对两个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;                   \
    })

字符串

6bc51xsx

6bc51xsx1#

编辑:你把减法做错了。

1111'1110b * 1111'1110b == 1111'1100'0000'0100b
                          -1111'1110'0000'0000b                   
                          -1111'1110'0000'0000b  
                          ---------------------
                                           100b

字符串
否则你的算法是正确的:在第四象限,你需要减去100 h乘以和(a+b)。写二进制补码字节为(100 h-x)我得到:

(100h-a)(100h-b) = 10000h - 100h*(a+b) + ab = 100h*(100h-a) + 100h*(100h-b) + ab mod 10000h
(100h-a)(100h-b) - 100h*(100h-a) - 100*(100h-b) = ab mod 10000h

uurity8g

uurity8g2#

当我根据算法从前8位减去B1111110两次时,我得到B1111110.00000100,而不是人们想要的B00000000.00000100。
如果我从B11111100中减去B11111110两次,我得到B00000000,如下所示:

B11111100 - B11111110 = B11111110
B11111110 - B11111110 = B00000000

字符串
看上去很简单。

相关问题