Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C++程序中访问ASM文件中的函数?_C++_Assembly_Embedded_Microchip - Fatal编程技术网

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

从C++程序中访问ASM文件中的函数?,c++,assembly,embedded,microchip,C++,Assembly,Embedded,Microchip,我问过如何将一个ASM文件翻译成C,从回答来看,似乎没有合理的方法。好的因此,其中一个回答建议我只使用现有的函数并完成它。听起来不错 但是怎么做呢 妈的,我想的都试过了!我使用的是微芯片品牌的MCU PIC18F4480和微芯片品牌的IDE MPLAB IDE,ASM文件是微芯片编写的。。。所以你会认为我会想办法利用它们!到目前为止一点运气都没有 我对ASM组装一无所知。我用C++编写代码,坦率地说,这是不会改变的。必须有一种方法可以访问Microchip ASM文件中的函数,而不必用新语言重写

我问过如何将一个ASM文件翻译成C,从回答来看,似乎没有合理的方法。好的因此,其中一个回答建议我只使用现有的函数并完成它。听起来不错

但是怎么做呢

妈的,我想的都试过了!我使用的是微芯片品牌的MCU PIC18F4480和微芯片品牌的IDE MPLAB IDE,ASM文件是微芯片编写的。。。所以你会认为我会想办法利用它们!到目前为止一点运气都没有

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


如果有人想看一下,ASM文件和应用程序注释是.< /p> ,我希望你需要从汇编代码中构建一个对象.O文件,然后将C++文件链接到那个对象文件。您可能需要声明这些函数为ExtC,以从C++调用它们。

这里不知道细节,在C++和汇编之间调用约定可能会有问题,尤其是对于PIC、P/<


你是否真的使用一个完整的C++特性集,即对象、虚拟函数、重载等等,用于微控制器?那是。。。不错,但我认为大多数PIC开发仍然是在普通的C和汇编中进行的。

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

extern unsigned char error0, error1; /* etc */
然后,为所有具有函数的对象声明外部函数:注释,不带参数,不返回结果:

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

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

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

链接器然后用于链接.Objo文件,这些文件可能由各种语言——FORTRAN、COBOL、C++、C、ObjuleC、汇编等生成,成为一个单独的应用程序二进制。 对象文件基本上是导出符号的集合,标记小字节块和未解析的符号,标记链接到不同对象文件中的某些内容时需要修补的字节块

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

不管怎么说,关键是

您需要构建asm文件。如果你没有汇编程序,那你就倒霉了。而且它可能需要与您的c/c++工具集来自同一供应商 你需要告诉你的C++程序外部符号的名称。以与c兼容的方式。这是头文件通常用于的内容。 因此,创建一个头文件来保存pid代码的函数声明,并在其中放置如下内容:

外部C无效;外部C无效

现在,在C++程序中包含那个头文件,并确保汇编程序所生成的对象文件包含在环境链接步骤中,并且应该是金色的。 可能涉及到某种呼叫约定。对于推送到堆栈上的顺序和/或谁负责堆栈清理,某些环境有不同的标准。大多数ms windows工具集至少支持一个_pascal和_cdecl调用约定,因此该声明如下所示

外部C真空uu pascal PidMainvoid


我不知道在您的特定环境中是否有多个调用约定。所以我不知道这有多大帮助。我想,运气好。

对于C++,他还需要函数声明中的外部C。正如在其他答案链接中所说的,Objo文件是联机的。为你的收件人帕维尔干杯。感谢大家的帮助。我还没有真正了解它是否适用,但是如果函数接受参数并返回结果呢?extern不能这样做吗?哇-这是一个非常糟糕的接口,微芯片为此设计的,也许这张图片没有堆栈?我知道PIC可以是相当低资源的芯片。除非芯片真的没有资源,否则我会把Martin v。Löwis在自己的C函数中进行了描述,并让包装器使用适当的参数,因此只有一个小的
处理全局变量的代码位。不小心使用了加号。只是c