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

ste*_*r10 2 assembly signed avr average arduino

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

这是我到目前为止:

.global average
average:
  add r24, r22
  asr r24
  ret
Run Code Online (Sandbox Code Playgroud)

对于我的程序中我必须计算69和60的平均值的部分,它返回-64而不是64.有谁知道我将如何使这个功能工作?任何帮助将非常感激.

Pet*_*des 10

诀窍是添加然后旋转with-carry将9位结果除以2,并在寄存器中保留8位结果.

我在评论中链接的问题的两个答案使用了:第一,第二.

AVR的实现是:

    add   r24, r25       ; 9-bit result in C and r24
    ror   r24            ; rotate-through-carry, like x86's RCR instruction
Run Code Online (Sandbox Code Playgroud)

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

还要注意通过向-infinity移动舍入来划分(不像C的整数除法运算符那样截断为零).所以(1 + -2) >> 1-1.


这个小到足以让你把它放在一个宏中,而不是一个函数.在大多数呼叫站点可能至少需要2条指令,因此即使您可以使用1字RCALL指令而不是2字CALL ,内联也可以节省代码大小.