1

我正在做一个有 16 个通道的混音器。每个通道都是一个有符号半字(短),我想把它们加在一起,然后除以 16,这样结果就是一个有符号半字。我似乎无法理解如何做到这一点,以便保留标志。如果我添加 0x4fff 和 0x6fff 结果是负数,但真的希望它是 32 位字中的正值而不是负半字。我很确定这里需要使用符号扩展,但欢迎提出任何建议。我尝试将每个输入值缩放到 1/16,然后添加,这确实有效,但后来我失去了分辨率,因为每个通道都减少到 12 位

如果我添加所有通道并在添加之前对它们进行符号扩展,然后对添加的结果进行符号扩展,然后 asr #4 移位以返回 16 位结果。那行得通吗?

4

1 回答 1

2

一旦加载并添加了 2 个值,结果就已经在 32 位寄存器中。对除法使用算术移位应该保留最终结果的符号性。ldrsh将为您签名将您的负值扩展为 32 位。


ldrsh r0, [r2], #4
ldrsh r1, [r2], #4
add r0, r0, r1
mov r0, r0, asr #4

或者类似的东西。最后的班次也可以很容易地与另一个操作码结合起来。

于 2012-06-11T21:55:54.500 回答