【问题标题】:ARM assembly add of signed halfwords带符号半字的 ARM 程序集添加
【发布时间】:2012-06-11 21:21:01
【问题描述】:

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

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

【问题讨论】:

  • 查看 gbadev.org。如果您需要的话,那里已经为您编写了汇编程序中的 ARM 混音器。

标签: assembly arm


【解决方案1】:

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


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

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

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多