【发布时间】:2016-12-19 07:24:36
【问题描述】:
我有汇编代码,我想在 c 中转换为等效代码
加法但我想如果它只是简单的加法所以需要提前帮助和thnx:
Flash_Check_SUM:
clr ZH
clr ZL
clr XH
clr XL
FCK_1:
lpm R1,z+
add XL,R1
brcc FCK_2
inc XH ;carry set so inc Hi Bit
FCK_2:
cpi ZH,HIGH(BSTART*2 -16)
brne FCK_1
cpi ZL,LOW(BSTART*2 -16)
brne FCK_1
lpm R0,Z+
lpm R1,Z
cp R0,XH
brne CK_Fail
cp R1,XL
brne CK_Fail
ret
CK_Fail:
【问题讨论】:
-
使用
adc XH代替inc上的那个分支不是更容易吗?无论如何,您不会说您无法理解其中的哪一部分,并且 asm 中没有 cmets。准确解释每条指令的作用以及为什么完整的详细信息需要太长时间,因此投票结束时过于宽泛。 -
坦率地说,我无法理解汇编,但我知道那部分是关于通过加法完成的校验和,所以我想确保它是正常的加法@peter cordes
-
@PeterCordes 不,
adc不会工作。该代码将单个字节添加为 16 位。必须有一条指令,如“将立即数添加到带有进位的字节”才能将 0 添加到带有进位的 XH,但没有。 -
看起来这个函数将字节 ptr [0] 与字节 ptr [BSTART*2 -18] 相加并将总和与字 ptr [BSTART*2 -16] 进行比较?
-
@UncleO:哦,我现在明白了,谢谢。 x86 有一个 adc-immediate,但我猜如果你在循环中这样做,AVR 可以使用一个归零的寄存器。我猜 AVR 中的分支非常便宜,但由于这个添加发生在循环内,可能值得在循环外清除一个额外的寄存器,因为 adc is always only 1 cycle。