帮助将此程序集转换为c

时间:2009-09-05 19:43:45

标签: c++ assembly translation pic status-register

我的编译器无法使用我拥有的汇编文件和我的其他编译器,它将无法使用我拥有的c文件。我不明白集会。我需要移动它,但我没有快速到达任何地方。那里有人可以提供帮助吗?我无法相信没有翻译。这是文件的开头:

    list        p=18F4480       
    #include    <p18F4480.inc> 

    #define _Z      STATUS,2
    #define _C      STATUS,0

    GLOBAL  AARGB0,AARGB1,AARGB2,AARGB3     
    GLOBAL  BARGB0,BARGB1,BARGB2,BARGB3
    GLOBAL  ZARGB0,ZARGB1,ZARGB2
    GLOBAL  REMB0,REMB1
    GLOBAL  TEMP,TEMPB0,TEMPB1,TEMPB2,TEMPB3
    GLOBAL  LOOPCOUNT,AEXP,CARGB2


LSB         equ 0
MSB         equ 7

math_data   UDATA   
AARGB0      RES 1       
AARGB1      RES 1
AARGB2      RES 1
AARGB3      RES 1
BARGB0      RES 1   
BARGB1      RES 1
BARGB2      RES 1
BARGB3      RES 1
REMB0       RES 1   
REMB1       RES 1
REMB2       RES 1
REMB3       RES 1   
TEMP        RES 1
TEMPB0      RES 1
TEMPB1      RES 1
TEMPB2      RES 1
TEMPB3      RES 1
ZARGB0      RES 1
ZARGB1      RES 1
ZARGB2      RES 1
CARGB2      RES 1
AEXP        RES 1
LOOPCOUNT   RES 1


math_code   CODE
;---------------------------------------------------------------------
;       24-BIT ADDITION             
_24_BitAdd
    GLOBAL  _24_BitAdd
    movf    BARGB2,w
    addwf   AARGB2,f

    movf    BARGB1,w
    btfsc   _C
    incfsz  BARGB1,w
    addwf   AARGB1,f

    movf    BARGB0,w
    btfsc   _C
    incfsz  BARGB0,w
    addwf   AARGB0,f
    return

我知道我可以大概排除前两行,因为设备定义的是在我的main.c中。这两个#defines就是这样,但最简单的方法(我认为)只是用STATUS,2和STATUS,0替换_Z和_C的实例。下一行(GLOBAL)只是我正在收集的变量声明。与LSB和MSB相同,但它们也分配值。下一个chunck我想我只是声明了一堆带有这些名字的整数(AARGB0等),之后的chunck就是一个函数。

我甚至懒得翻译这个函数,因为我的编译器有#asm / #end asm指令所以我可以把它放在raw中(只要它包含在一个函数中)。

我想我拥有它......直到我构建并且我的编译器尖叫没有定义STATUS。当然不是。但它是什么?我在网上读到STATUS寄存器是特别的东西,但我真的不知道它是如何工作的。

如果你没有注意到,我甚至不确定它是什么我真的在问。我只是想让血腥的东西发挥作用。

3 个答案:

答案 0 :(得分:6)

你的编译器拒绝你的来源?

要么使用损坏的工具,要么您的源文件有问题。在这两种情况下,您的问题不是“将ASM转换为C”或类似的东西,而是源/工具链中的错误。不要试图解决问题,解决问题。

答案 1 :(得分:3)

STATUS是PIC架构中的内置寄存器,它实现了与大多数CPU中的“status”或“condition”标志寄存器相同的功能。它包含在执行代码时由微控制器设置和清除的位标志,告诉您操作的结果。

例如,只要算术运算结果为零,就会设置Z标志,并在检测到算术溢出时设置C(进位)标志。

这些是通常在C中不可见的标志,因为C不希望主处理器甚至具有状态位,因此直接将此代码转换为C将很难。您需要找到一种方法,在C代码中包含状态读取位测试,并在可能的情况下使用这些指令。这可能很麻烦,因为从C开始,你对使用哪个寄存器的控制较少,这反过来可能使你难以确保在正确的位置检查正确的标志。

Here是指向其他人的扩展精度PIC代码的一些链接。大多数人似乎仍然在集会中,但他们可能仍然可以作为参考或灵感。

答案 2 :(得分:1)

您可以尝试对反汇编进行反向工程。但是你会学到什么?

您应该能够将程序集(使用编译器1)编译到目标文件中,并将其链接到编译器2从C文件编译的目标文件。