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