37.C与汇编混合编程 编程
新建light.c:函数
修改start.S:优化
修改Makefile:加light.ospa
最后make成功,烧写成功。3d
一样,咱们也能够在C函数里调用咱们的汇编里面的函数:blog
修改start.S:把light_led申明为global:内存
在light.c中被调用:开发
Make编译烧写到开发板:发现灯是能够被点亮的。在C中调用汇编函数成功。asm
接下来的是在C中嵌入汇编代码,而不是调用:编译
C中嵌入汇编代码:
格式:
C内嵌汇编以关键字"__asm__"或者"asm"开始,包含四个部分的内容,如上图,各个部分用":"分开,第一部分是必须写的,后面三个部分是能够忽略的,可是分号:不能省略。
简单实例:
在C语言里实现读出CPSR里的c1寄存器的值:
上面的汇编语句中,注意到通用寄存器的位置被一个参数%0,凡是要去读出的部分都放在输入部分,凡是要去写的部分都放在输出部分。
上面的输入部分的"r"是通用寄存器,由系统分配的,后面括号value是存在寄存器里的值。
在C语言里实现写入CPSR里的c1寄存器的值:
参数寄存器是输出cpsr里寄存器的值。
等号是只写的意思,就是对寄存器r进行只写的操做,还要把寄存器里的值写到value里。
破坏部里有memory,是告诉系统,在汇编语句里,修改了内存里变量的值。
Volatile是告诉cpu不要优化该代码:
实现点灯:
上面用%0和%1来表示这里是两个参数,参数的值是两个通用寄存器里的值。"r"(GPKCON)中的"r"表示通用寄存器,值是GPKCON。"r0"是破坏部,由于整个操做会影响r0的值。
Make烧写,灯亮。