繁体   English   中英

帮助将此程序集转换为c

[英]Help with translating this assembly into c

我的编译器无法使用我拥有的汇编文件,而其他编译器将无法使用我拥有的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中。 这两个#define就是这样,但最简单的方法(我认为)是将_Z和_C的实例分别替换为STATUS,2和STATUS,0。 接下来的几行(GLOBAL)只是我正在收集的变量声明。 与LSB和MSB相同,除了它们也分配值。 下一个块,我想我只是用这些名称(AARGB0等)声明了一堆整数,然后是该函数的块。

我什至不用去翻译那个函数,因为我的编译器具有#asm /#end asm指令,因此我可以将其放在raw中(只要将它包装在函数中)。

我想我已经拥有了一切……直到我构建并编译器大喊关于未定义状态的消息。 当然不是。 那是什么 我在网上读到STATUS寄存器很特殊,但我真的不知道它是如何工作的。

如果您没有注意到,我什至不确定我真正要问的是什么。 我只是想让这件该死的事情起作用。

您的编译器拒绝您的源代码吗?

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

STATUS是PIC体系结构中的内置寄存器,其实现的功能与大多数较大CPU:s中的“状态”或“条件”标志寄存器相同。 它包含由微控制器在执行代码时设置和清除的位标志,告诉您操作的结果。

例如,每当算术运算结果为零时,就设置Z标志;当检测到算术溢出时,就设置C(进位)标志。

这些标志通常在C中不可见,因为C不想要求主机处理器甚至具有状态位,因此直接将此代码转换为C会很困难。 您将需要找出一种在C代码中包含状态读取位测试的方法,并在可能的情况下使用这些指令。 这可能很麻烦,因为从C语言中,您无法控制正在使用的寄存器,从而可能难以确保您在正确的位置检查正确的标志。

以下是指向其他人的扩展精度PIC代码的一些链接。 多数似乎仍在组装中,但它们可能仍可作为参考或启发。

您可以尝试对拆卸进行反向工程。 但是,您会学到什么?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM