gpt4 book ai didi

math - 组装 8x8 四象限乘法算法

转载 作者:行者123 更新时间:2023-12-04 12:13:14 27 4
gpt4 key购买 nike

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

最佳答案

编辑:
你做错了减法。

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

关于math - 组装 8x8 四象限乘法算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6000833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com