【问题标题】:Help with translating this assembly into c帮助将此程序集翻译成 c
【发布时间】:2009-09-05 19:43:44
【问题描述】:

我的编译器无法与我拥有的程序集文件一起使用,而我的其他编译器也无法与我拥有的 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 相同,除了它们也分配值。下一个块我想我只是声明了一堆具有这些名称(AARGB0 等)的整数,然后后面的块是一个函数。

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

我想我已经拥有了一切......直到我构建并且我的编译器尖叫着说 STATUS 没有被定义。当然不是。但它是什么?我在网上看到 STATUS 寄存器很特别,但我真的不明白它是如何工作的。

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

【问题讨论】:

  • 这里是翻译:return AARGB + BARGB;
  • 如果你知道你问的东西不清楚,你就不应该问。尝试按以下形式构建问题:这就是我所做的 - 这就是发生的事情 - 这就是我想要发生的事情。
  • 真正想做什么?我猜这是从一组汇编例程中摘录的,用于执行 24 位算术。如果那是你真正想做的(执行 24 位算术),那么也许这就是你应该问的问题。
  • 我猜你的问题是“我的 C 程序中需要一个数学包,但我拥有的那个是用汇编程序编写的”。
  • 不,你们俩都对“为什么”不正确。我知道我不清楚,你是对的——也许我不应该问。连续三天无处可去,我感到非常沮丧。事实上,上面的特定摘录只是我试图使用的代码的一部分。数学部分非常微不足道,它只是处理的最简单的摘录。我只是在寻找有关如何进行的提示。不过还是算了吧。我只是从头开始编写所有代码,并说“去他妈的”不要重新发明轮子。

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


【解决方案1】:

你的编译器拒绝你的源代码?

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

【讨论】:

    【解决方案2】:

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

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

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

    Here 是一些链接到其他人的扩展精度 PIC 代码。大多数似乎仍在组装中,但它们可能仍可用作参考或灵感。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的!我应该可以!这就是为什么我一直在拔头发。我正在使用的编译器(我不想更改)似乎与汇编器生成的目标文件完全不兼容,尽管它的帮助文件中有相反的文档。制造它的公司正在调查它,但到目前为止我什么也没听到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2016-02-10
      相关资源
      最近更新 更多