我有汇编代码,想要转换为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:
答案 0 :(得分:2)
将此转换为C代码并不能回答您的实际问题。对程序集正在做什么的描述会更有帮助。
X和Z寄存器实际上是两个寄存器,所以它们是两个字节长。某些指令使用Z寄存器作为输入的地址。这就是本代码中发生的事情。
该函数从地址0开始,逐字节地添加到带有
的16位X寄存器lpm R1,z+ ; load the byte at address Z into R1 and post-increment Z
add XL,R1 ; Add R1 to X
如果低字节溢出,则有一些代码可以递增X的高字节(通常的加法算法)。
循环继续,直到Z到达BSTART*2 -16
,这似乎是校验和之前的所有字节。
最后一部分将存储的校验和加载到R0和R1中,然后将其与在X(XH和XL)中计算的代码的校验和进行比较。
如果校验和失败,则代码跳过return语句并继续执行校验和函数之后的代码,这可能表示某种错误条件给用户。
答案 1 :(得分:-1)
这将是这样的:
typedef union {
unsigned short u16;
unsigned char u8[2];
} Pointer;
const Pointer BSTART = ???;
int Flash_Check_SUM( Pointer Z, Pointer X ){
unsigned char XH = ((unsigned char *)&X)[0];
unsigned char XL = ((unsigned char *)&X)[1];
unsigned char ZH = ((unsigned char *)&Z)[0];
unsigned char ZL = ((unsigned char *)&Z)[1];
AddZ:
unsigned short R1 = *Z++;
X += *R1;
if( XH > 0 ) goto IsEqual;
XH++;
IsEqual:
if( ZH != ((unsigned char *)&(BSTART * 2 - 16))[0] ) goto AddZ;
if( ZL != ((unsigned char *)&(BSTART * 2 - 16))[1] ) goto AddZ;
unsigned short R0 = *Z++;
R1 = *Z;
if( R0 != XH ) return -1;
if( R1 != XL ) return -1;
return 0;
}