gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:35:18 28 4
gpt4 key购买 nike

使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学类(class)编写一个函数,用于计算汇编中两个 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 位完整结果中的低位。没有算术与逻辑移位选择,也没有环绕。

另请注意,通过向 -无穷大移动舍入进行除法(不像 C 的整数除法运算符那样向零截断)。所以 (1 + -2) >> 1-1

<小时/>

它足够小,您应该将其放入宏中,而不是函数中。在大多数调用站点可能至少需要 2 条指令,因此即使您可以使用 1 个字 RCALL instruction ,内联也可以节省代码大小。而不是 2 字 CALL。

关于assembly - 如何计算汇编中两个 8 位值的 8 位平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40894099/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com