首页 > 其他 > 详细

[国嵌攻略][046][C与汇编混合编程]

时间:2015-11-02 22:39:57      阅读:349      评论:0      收藏:0      [点我收藏+]

为什么需要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"
        );
}

 

[国嵌攻略][046][C与汇编混合编程]

原文:http://www.cnblogs.com/d442130165/p/4931491.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!