C与汇编混合编程
来源:互联网 发布:外贸整合营销 海关数据 编辑:程序博客网 时间:2024/05/21 19:30
一、为什么需要混合编程
①汇编语言:执行效率高;编写繁琐
②C语言:可读性强,移植性好,调试方便
什么时候需要使用汇编:
1. 执行效率
2. 能够更直接地控制处理器
二、混合编程类型
1.汇编调用C函数
ldr pc, =xxxxxxxxx
2.C调用汇编函数
start.S中修改
main.c中
3.C内嵌汇编
3.1 C内嵌汇编-格式
__asm__(
汇编语句部分
:输出部分
:输入部分
:破坏描述部分
);
C内嵌汇编以关键字”__asm__”或”asm”开始,下辖四个部分,各部分之间使用":"分开, 第一部分是必须写的,后面三部分是可以省略,但是分号:不能省略!
1.汇编语句部分:汇编语句的集合,可以包含多条汇编语句,每条语句之间需要使用换行符 “\n”隔开或使用分号“ ; ”隔开。
2.输出部分:在汇编中被修改的C变量列表
3.输入部分: 作为参数输入到汇编中的变量列表
4.破坏描述部分: 执行汇编指令会破坏的寄存器描述
3.2 C内嵌汇编-范例
3.3 C内嵌汇编-优化
使用volatile来告诉编译器,不要对接下来的这部分代码进行优化。
3.4使用内嵌汇编点亮LED
main.c
①汇编语言:执行效率高;编写繁琐
②C语言:可读性强,移植性好,调试方便
什么时候需要使用汇编:
1. 执行效率
2. 能够更直接地控制处理器
二、混合编程类型
1.汇编调用C函数
ldr pc, =xxxxxxxxx
2.C调用汇编函数
start.S中修改
- #define GPBCON 0x56000010
- #define GPBDAT 0x56000014
- .global light_led 修改light_led设置为全局变量
- light_led:
- ldr r0, =GPBCON
- ldr r1, =0x15400
- str r1, [r0]
- ldr r0, =GPBDAT
- ldr r1, =0x6bf
- str r1, [r0]
- mov pc, lr
- #define GPBCON (volatile unsigned long*) 0x56000010
- #define GPBDAT (volatile unsigned long*) 0x56000014
- int gboot_main()
- {
- /* *(GPBCON) = 0x15400;
- *(GPBDAT) = 0x6bf;
- */
- light_led(); 调用了start.S中的light_led
- return 0;
- }
3.1 C内嵌汇编-格式
__asm__(
汇编语句部分
:输出部分
:输入部分
:破坏描述部分
);
C内嵌汇编以关键字”__asm__”或”asm”开始,下辖四个部分,各部分之间使用":"分开, 第一部分是必须写的,后面三部分是可以省略,但是分号:不能省略!
1.汇编语句部分:汇编语句的集合,可以包含多条汇编语句,每条语句之间需要使用换行符 “\n”隔开或使用分号“ ; ”隔开。
2.输出部分:在汇编中被修改的C变量列表
3.输入部分: 作为参数输入到汇编中的变量列表
4.破坏描述部分: 执行汇编指令会破坏的寄存器描述
3.2 C内嵌汇编-范例
- void write_p15_c1 (unsigned long value)
- {
- __asm__(
- “mcr p15, 0, %0, c1, c0, 0\n”
- :
- : “r” (value) @编译器选择一个R*寄存器
- : "memory");
- }
- unsigned long read_p15_c1 (void)
- {
- unsigned long value;
- __asm__(
- “mrc p15, 0, %0, c1, c0, 0\n”
- : “=r” (value) @ ’=‘ 表示只写操作数,用于输出部
- :
- : "memory");
- return value;
- }
3.3 C内嵌汇编-优化
使用volatile来告诉编译器,不要对接下来的这部分代码进行优化。
- unsigned long old;
- unsigned long temp;
- __asm__ volatile(
- "mrs %0, cpsr \n"
- "orr %1, %0, #128 \n“
- "msr cpsr_c, %1\n"
- : "=r“ (old), "=r“ (temp)
- : :
- "memory
3.4使用内嵌汇编点亮LED
main.c
- //#define GPBCON (volatile unsigned long*) 0x56000010
- //#define GPBDAT (volatile unsigned long*) 0x56000014
- #define GPBCON 0x56000010
- #define GPBDAT 0x56000014
- int gboot_main()
- {
- // *(GPBCON) = 0x15400;
- // *(GPBDAT) = 0x6bf;
- // light_led();
- __asm__(
- "ldr r1, =0x15400\n"
- "str r1, [%0]\n"
- "ldr r1, =0x6bf\n"
- "str r1, [%1]\n"
- :
- :"r"(GPBCON),"r"(GPBDAT) 输入部分第一个是GPBCON,第二个是GPBDAT
- :"r1" 告诉系统修改了r1寄存器
- );
- return 0;
- }
0
上一篇:一跃进入C大门
下一篇:MMU内容学习
相关热门文章
- SHTML是什么_SSI有什么用...
- 查看linux中某个端口(port)...
- 卡尔曼滤波的原理说明...
- shell中字符串操作
- 关于java中的“错误:找不到或...
给主人留下些什么吧!~~
评论热议
阅读全文
0 0
- C与汇编混合编程
- C与汇编混合编程
- C与汇编混合编程
- c与汇编混合编程
- c与汇编混合编程
- C与汇编混合编程
- c与汇编的确混合编程
- keil中的C与汇编混合编程
- C/C++ 与汇编混合编程 总结
- C/C++与汇编混合编程简介
- C语言与汇编混合编程
- C/C++与汇编混合编程简介
- 汇编与C混合编程(6.19)
- C语言与汇编混合编程
- C/C++与汇编混合编程简介
- C与汇编混合编程(1)
- ARM汇编与C混合编程
- C/C++与汇编混合编程简介
- Caused by: java.lang.ClassNotFoundException: Cannot find class:
- 栈初始化
- BSS初始化
- 一跃进入C大门
- 并发编程(五):Executor框架
- C与汇编混合编程
- MMU内容学习
- OSM数据下载的简易方法
- static_cast 转载from ider
- 什么是GPIO?
- 中断处理流程分析
- 关于EasyUI Datagrid JSON对象内嵌对象的取值问题
- uva 10562 Undraw the Trees
- STMFD和LDMFD指令个人理解分析
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
风机是什么
排风机价格
贯流风机
南方风机
风机温控器
风机选型
排风机品牌
英飞风机
锅炉用风机
远大新风机
风机壳
风机电容
抽油烟风机
鼓风机厂家
养殖用风机
风机离心式
多翼式风机
回旋式风机
云南风机
耐酸碱风机
风机维修
离心引风机
风机防腐
排尘风机
风机控制器
外转子风机
风机控制柜
旋涡式风机
风机降噪
风机公司
风机控制箱
箱式风机
佛山风机
风机价格表
气刀风机
斜流排风机
大丑流风机第一部全
暖风机品牌排行榜
暖风机哪个牌子好
暖风机和空调哪个费电
鼓风机和望远镜