【问题标题】:Assembly 8x8 four quadrant multiply algorithm汇编 8x8 四象限乘法算法
【发布时间】: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 行)

标签: math binary assembly


【解决方案1】:

编辑: 你做错了减法。

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

否则你的算法是正确的:在第四象限,你需要减去 100h 乘以总和 (a+b)。将两个补码字节写为 (100h-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

【讨论】:

    【解决方案2】:

    当我从 B1111110 中减去两次 前 8 位根据 算法,我得到 B11111110.00000100, 不像 B00000000.00000100 那样 想要。

    如果我从B11111100 中减去B11111110 两次,我得到B00000000,根据需要:

    B11111100 - B11111110 = B11111110
    B11111110 - B11111110 = B00000000
    

    看起来很简单。

    【讨论】:

    • 我应该提到它是减法产生不正确结果的程序的输出。我不擅长 AVR 组装,我必须更仔细地查看反汇编程序中的减法命令是怎么回事。
    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多