37.C与汇编混合编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了37.C与汇编混合编程相关的知识,希望对你有一定的参考价值。

37.C与汇编混合编程

新建light.c:

技术分享

修改start.S:

技术分享

修改Makefile:加light.o

技术分享

最后make成功,烧写成功。

 

同样,我们也可以在C函数里调用我们的汇编里面的函数:

修改start.S:把light_led申明为global:

技术分享

在light.c中被调用:

技术分享

Make编译烧写到开发板:发现灯是可以被点亮的。在C中调用汇编函数成功。

接下来的是在C中嵌入汇编代码,而不是调用:

 

 

C中嵌入汇编代码:

格式:

技术分享

C内嵌汇编以关键字"__asm__"或者"asm"开始,包含四个部分的内容,如上图,各个部分用":"分开,第一部分是必须写的,后面三个部分是可以忽略的,但是分号:不能省略。

  1. 汇编语句
  2. 输出部分:C语言中修改的变量
  3. 输入部分:从C传来的参数
  4. 破坏描述:寄存器的值被修改,寄存器就要列在这里。

技术分享

 

简单实例:

在C语言里实现读出CPSR里的c1寄存器的值:

技术分享

上面的汇编语句中,注意到通用寄存器的位置被一个参数%0,凡是要去读出的部分都放在输入部分,凡是要去写的部分都放在输出部分。

上面的输入部分的"r"是通用寄存器,由系统分配的,后面括号value是存在寄存器里的值。

 

在C语言里实现写入CPSR里的c1寄存器的值:

技术分享

参数寄存器是输出cpsr里寄存器的值。

技术分享

等号是只写的意思,就是对寄存器r进行只写的操作,还要把寄存器里的值写到value里。

破坏部里有memory,是告诉系统,在汇编语句里,修改了内存里变量的值。

 

 

Volatile是告诉cpu不要优化该代码:

技术分享

 

 

 

实现点灯:

技术分享

上面用%0和%1来表示这里是两个参数,参数的值是两个通用寄存器里的值。"r"(GPKCON)中的"r"表示通用寄存器,值是GPKCON。"r0"是破坏部,因为整个操作会影响r0的值。

Make烧写,灯亮。

 

以上是关于37.C与汇编混合编程的主要内容,如果未能解决你的问题,请参考以下文章

keil4 下 c语言和汇编语言。混合编程的方法。

如何在64位的linux系统上使用汇编和C语言混合编程

汇编语言和C语言混合编程时,它们之间是如何传递参数的?请用具体例子说明

关于ARM中汇编与C程序的混合编程的参数传递问题!

32位汇编第七讲,混合编程,内联汇编

嵌入式ARM 混合编程,汇编调用C语言,在线等