【发布时间】:2017-04-15 02:45:13
【问题描述】:
使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学课编写一个函数,计算汇编中两个 8 位值的 8 位平均值。我也不允许使用任何分支指令(但可以跳过)。
这是我目前所拥有的:
.global average
average:
add r24, r22
asr r24
ret
对于我必须计算 69 和 60 的平均值的程序部分,它返回 -64 而不是 64。有人知道我将如何使这个函数工作吗?任何帮助将不胜感激。
【问题讨论】:
-
求平均值同时避免整数溢出/环绕的技巧:stackoverflow.com/a/3816471/224132。我通过搜索
integer average without overflow在不到一分钟的时间内找到了它,因为我知道那里有 一个技巧,但不记得了。它可能适用于有符号 2 的补码和无符号的,但我没有检查。如果您愿意,可以将signed放入谷歌搜索词中。 -
请注意,如果您知道它们的顺序,我链接的答案仅适用于未签名的答案。最高投票的答案不需要,但比 ADD 和 ROR 需要更多的操作。无论如何,这只是表明在寻找整数技巧时,不要将自己局限于 AVR asm。您会在 C 中找到很多东西,您可以自己在 AVR 中实现它们,甚至可以将其提供给编译器,看看它是如何实现的。例如其中一些很有用:graphics.stanford.edu/~seander/bithacks.html
标签: assembly arduino average avr signed