为什么需要C与汇编混合编程
1.汇编语言:执行效率高,编写繁琐
2.C语言:可读性强,移植性好,调试方便
3.混合编程可以提高执行效率,能够直接控制处理器,结合两者的优点
混合编程类型
1.汇编调用C函数
直接在汇编中调用C函数名(函数名相当于标号地址)
2.C调用汇编函数
在C中把汇编标号当函数调用(汇编标号需要通过global声明成全局)
3.C内嵌汇编代码
3.1格式:
__asm__(
汇编语句
:输出
:输入
:破坏描述
);
输出表示输出到C的变量,输入表示从C中输入的变量,破坏描述表示内嵌汇编中修改的寄存器。
C内嵌汇编以关键字”__asm__”或”asm”开始,下面四个部分,各部分之间使用”:”隔开,第一部分必须写,后面三个部分可以省略,但”:”不能省略
3.2示例:
void write_p15_c1(unsigned long value){ __asm__( “mcr p15, 0, %0, c1, c0\n” : :”r”(value) @编译器任意选择一个rx寄存器 : ); } unsigned long read_p15_c1(){ unsigned long value; __asm__( “mrc p15, 0, %0, c1, c0,0\n” :”=r”(value) @’=’表示只写操作数,用于输出 : :”memory” @表示修改内存,value局部变量保存在内存的栈中 ); return value; } unsigned long old; unsigned long temp; __asm__ volatile( @volatile告诉编译器,不要对优化下面的代码 “mrs %0, cpsr \n” “orr %1, %0, #128 \n” “msr cpsr_c, temp \n” :”=r”(old),”=r”(temp) : : ); void init_led(){ __asm__( "ldr r0, =0x56000010 \n" "ldr r1, =0x00015400 \n" "str r1, [r0] \n" "ldr r0, =0x56000014 \n" "ldr r1, =0x00000140 \n" "str r1, [r0] \n" : : :"r0", "r1" ); }
原文:http://www.cnblogs.com/d442130165/p/4931491.html