如何计算汇编中两个 8 位值的 8 位平均值?
How do I compute the 8-bit average of two 8-bit values in assembly?
使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学编写一个函数 class,计算汇编中两个 8 位值的 8 位平均值。我也不允许使用任何分支指令(但可以跳过)。
这是我目前拥有的:
.global average
average:
add r24, r22
asr r24
ret
对于我必须计算 69 和 60 的平均值的程序部分,它是 returns -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。
使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学编写一个函数 class,计算汇编中两个 8 位值的 8 位平均值。我也不允许使用任何分支指令(但可以跳过)。
这是我目前拥有的:
.global average
average:
add r24, r22
asr r24
ret
对于我必须计算 69 和 60 的平均值的程序部分,它是 returns -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。