如何计算汇编中两个 8 位值的 8 位平均值?

How do I compute the 8-bit average of two 8-bit values in assembly?

使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学编写一个函数 class,计算汇编中两个 8 位值的 8 位平均值。我也不允许使用任何分支指令(但可以跳过)。

这是我目前拥有的:

.global average
average:
  add r24, r22
  asr r24
  ret

对于我必须计算 69 和 60 的平均值的程序部分,它是 returns -64 而不是 64。有谁知道我将如何使这个函数工作?任何帮助将不胜感激。

诀窍是相加,然后rotate-with-carry将9位结果除以2,并将8位结果留在寄存器中。

我在评论中链接的问题的两个答案使用:first, second

一个 AVR 实现是:

    add   r24, r25       ; 9-bit result in C and r24
    ror   r24            ; rotate-through-carry, like x86's RCR instruction

这适用于位的有符号或无符号解释,因为我们所做的只是从加法的 9 位完整结果中丢弃低位。没有算术与逻辑移位选择,也没有环绕。

另请注意,通过向 -infinity 移动轮数来进行除法(不像 C 的整数除法运算符那样向零截断)。所以 (1 + -2) >> 1-1.


这太小了,你应该把它放在宏中,而不是函数中。它可能在大多数调用站点至少需要 2 条指令,因此内联它可以节省代码大小,即使您可以使用 1 字 RCALL instruction 而不是 2 字 CALL。