如何将汇编语言中的代码转换为C代码?

时间:2016-12-19 07:24:36

标签: assembly avr

我有汇编代码,想要转换为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:

2 个答案:

答案 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;
}