【问题标题】:How do you call an assembly function from C program?如何从 C 程序中调用汇编函数?
【发布时间】:2013-07-25 06:13:13
【问题描述】:

我对微控制器编程非常陌生,尤其是PIC18F87J11,我正在使用 MPLAB C18 编译器。我正在阅读各种主题的数据表,例如保存到内存或使用计时器。我注意到这些示例是用汇编语言编写的,但我对它的经验很少。有没有办法在我的项目中同时使用 Assembly 和 C 的强大功能?

我不太懂汇编,否则我会尝试将代码转换为 C,在这种情况下,我宁愿只使用稍加改动的汇编代码。

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

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

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

【问题讨论】:

  • c 中没有 __asm 这样的东西,但如果你有 asm 编译器,你可以创建 asm lib 并使用它,然后像这里描述的那样:dreamincode.net/forums/topic/…
  • 你确定这不可能吗?我正在阅读这个book page 229,看起来你可以做到。我试图实现这个例子,但我还做不到。我仍在寻找一个简单的 hello world 示例。谢谢!
  • @Heather - C 标准中可能没有 __asm 这样的东西,但大多数当前实际的 C 编译器确实实现了这种东西,尽管语法会有所不同。这个问题没有引用 C 标准,而是一个特定的命名编译器。
  • @ChrisStratton 我不知道。 gcc 可以做这样的事情吗?

标签: c assembly embedded microcontroller pic


【解决方案1】:

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

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

上面的例子来自link,它将解释如何在 MPLAB C18 中使用 C 语言中的 asm。

【讨论】:

  • 亲戚thread你也许能帮上忙。
【解决方案2】:

如果无法访问编译器,我无法对此进行测试,但我发现 hereMPLAB 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。如果你想包含参数和返回值,那么它会变得有点棘手。

【讨论】:

  • 亲戚thread你也许能帮上忙。
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2016-09-07
  • 2017-02-18
  • 2015-10-19
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多