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

这是我到目前为止的内容:

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


对于我必须计算69和60的平均值的程序部分,它返回-64而不是64。有人知道我将如何使此函数起作用吗?任何帮助将非常感激。

最佳答案

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

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

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,内联代码也可以节省代码大小。

08-18 03:29
查看更多