2009-09-04 109 views
0

今天给我点头;)从C++程序访问ASM文件中的函数?

Over here我问到了如何将一个ASM文件翻译成C,并且从响应看起来好像没有合理的方法来做。精细。所以其中一个答复表明我只是按照原样使用这些功能并且完成它。听起来不错。

但是如何?

神圣的废话我试过了我能想到的一切!我正在使用Microchip品牌的MCU(PIC18F4480)和Microchip品牌的IDE(MPLAB IDE),并且ASM文件是由Microchip撰写的......所以您会认为我会找到使用它们的方法!到目前为止没有运气。

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

如果有人想看看,ASM文件和应用笔记是here

回答

6

查看PIDInt.asm,它应该是相当直接的从C/C++调用函数。 首先,你在变量定义列出的一切声明的extern变量:

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

然后,为所有有事情宣布extern函数“功能:”评论,不接受参数并没有返回结果:

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

要调用其中的一个,可以填充输入变量,调用函数并读取输出变量。

+0

对于C++,他还需要在函数声明中使用'extern“C”'。 – 2009-09-04 08:19:59

+0

@Pavel:谢谢,补充。 – 2009-09-04 08:22:03

+0

正如其他答案中所述,将obj文件链接在一起。 – simon 2009-09-04 13:05:47

5

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

不确定这里的细节,C++和程序集之间调用约定可能会有问题,特别是对于像PIC这样的微控制器。

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

+0

粗心使用加号。这只是c – Steven 2009-09-04 15:00:50

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”无效PidMain(无效);

现在的#include在C即头文件++程序,并确保由器产生的目标文件都包含在你的环境中链接步骤,你应该是金色的。

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

extern“C”void __pascal PidMain(void);

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

相关问题