从C ++程序访问ASM文件中的函数?

时间:2009-09-04 08:06:09

标签: c++ assembly embedded microchip

Over here我问过将ASM文件翻译成C语言,从响应看起来没有合理的方法。精细。因此,其中一个回复建议我只是按原样使用函数并完成它。听起来不错。

但是怎么样?

神圣的废话我已经尝试了我能想到的一切!我正在使用Microchip品牌的MCU(PIC18F4480)和Microchip品牌的IDE(MPLAB IDE),而ASM文件是Microchip编写的...所以你认为我会找到一些方法来使用它们!到目前为止还没有运气。

我对ASM(汇编)一无所知。我用C ++编写代码,坦率地说,这不会改变。必须有一种方法可以访问Microchip ASM文件中的函数,而无需用新语言重写我的所有代码。

如果有人想看看,ASM文件和应用说明是here

3 个答案:

答案 0 :(得分:6)

看看PIDInt.asm,从C / C ++调用函数应该是相当简单的。 首先,为VARIABLE DEFINITIONS中列出的所有内容声明外部变量:

extern unsigned char error0, error1; /* etc */

然后,为所有具有“Function:”注释的事物声明extern函数,不带参数并且不返回任何结果:

extern void Proportional(); // extern "C" for C++

要调用其中一个,请填充输入变量,调用函数,然后读取输出变量。

答案 1 :(得分:5)

我希望你需要以某种方式从汇编代码构建一个对象(.o)文件,然后将你的C ++文件与该目标文件链接起来。您可能需要将这些函数声明为extern "C",以便从C ++中调用它们。

不确定这里的细节,在C ++和汇编之间调用约定可能会出现问题,特别是对于像PIC这样的微控制器。

您是否真正使用完整的C ++功能集,即对象,虚函数,重载等,用于微控制器?那是......不错,但我认为大多数PIC开发仍然是普通的C(当然还有汇编)。

答案 2 :(得分:2)

通常的方法是使用具有汇编程序和C / C ++编译器的构建环境和工具。编译器(和汇编器)获取源文件并生成中间目标文件格式。在Microsoft Windows上,使用Microsoft Tools,这些将是.obj文件。

然后使用链接器将.obj文件(可能由各种语言 - fortran,cobol,c ++,c,objective-c,assembly等生成)链接到单个应用程序二进制文件中。

目标文件基本上是导出符号的集合,标记了很少的字节块和未解析的符号,标记了在链接期间需要修补的字节块以指向不同目标文件中的某些内容。

现在,通常的问题 - 在我所经历过的与你不相近的平台上,c ++编译器并没有考虑到任何类型的交叉语言二进制兼容性。另一方面,C编译器是。因此,c ++编译器会生成高度损坏的符号,这些符号将有关参数和返回类型的各种信息合并到符号名称中。这种机制使操作符重载成为可能。

无论如何,关键是,

  • 您需要构建asm文件。如果你没有汇编程序,那就太幸运了。它可能需要来自与您的c / c ++工具集相同的供应商
  • 您需要告诉您的c ++程序外部符号的名称。以c兼容的方式。这是头文件通常用于的目的。

因此,创建一个头文件来保存pid代码的函数声明,并在其中放置这样的内容:

extern“C”void PidMain(void);

现在,#include c ++程序中的头文件,并确保汇编程序生成的目标文件包含在您的环境链接步骤中,您应该是金色的。

可能涉及某种调用约定。某些环境对于将事物推入堆栈的顺序和/或谁负责堆栈清理具有不同的标准。大多数ms windows工具集至少支持__pascal和__cdecl调用约定,因此declration看起来像

extern“C”void __pascal PidMain(void);

如果您的特定环境中有多个调用约定,我没有具体的知识。所以我不知道这有多大帮助。祝你好运。