你如何从C程序调用汇编函数?

时间:2013-07-25 06:13:13

标签: c assembly embedded microcontroller pic

我是微控制器编程的新手,特别是PIC18F87J11,我正在使用MPLAB C18编译器。我正在阅读各种主题的数据表,例如保存到内存或使用计时器。我注意到这些例子是用汇编语言编写的,但我对它的经验最少。有没有办法在我的项目中一起使用Assembly和C的强大功能?

我不明白汇编是好的,否则我会尝试将代码转换为C,在这种情况下,我只是使用汇编代码,几乎没有变化。

现在有人可以向我展示如何在使用MPLAB C18编译器的C程序中使用汇编函数的示例吗?

汇编函数可以像hello world一样简单。我只需要了解在MPLAB上梳理和使用两种不同语言的过程。我试图创建一个快速测试功能,但我不知道在哪里放置汇编代码。汇编代码是否需要包含在项目中的自己的文件?

我希望有人可以通过一个完整的简单例子来启发我,以便能够看到全局。我提前给予帮助,谢谢!

2 个答案:

答案 0 :(得分:5)

有一种方法可以在C语言中使用asm,具体取决于您使用的编译器(在C中使用asm的容量不是标准的一部分)。每个编译器都不使用相同的语法。使用MPLAB C18,它是这样的:

void main()
{
     _asm
                movlw 0x57
                movwf PORTB
    _endasm
}

上面的示例来自此link,它将向您解释如何在C中使用带有MPLAB C18的asm。

答案 1 :(得分:2)

无法访问编译器,我无法对此进行测试,但我发现here MPLAB C18 C编译器用户指南和发行说明

  

2.8.2内联汇编

     

MPLAB C18使用类似于MPASM的语法提供内部汇编器   汇编。汇编代码块必须以_asm开头,以_endasm结尾。   块内的语法是:

     

[label:] [<instruction> [arg1[, arg2[, arg3]]]]

     

...

所以,在我看来,一个解决方案可能是在你的.C文件中嵌入这样的东西

void myAsmFunction()
{
  _asm
  // The asm code you've been looking at
  _endasm
}

然后从适当的地方调用myAsmFunction。如果你想要包含参数和返回值,那么它会变得有点棘手。