使用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位结果保留在寄存器中。
我在评论中链接的问题的两个答案使用: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,内联代码也可以节省代码大小。