c与汇编混合编程
2017-02-20 17:40
169 查看
1、为什么要混合编程?
汇编语言:执行效率高,编写繁琐
C语言:可读性强,移植性好,调试方便
应用在对执行效率有要求的场合、能够更直接地控制处理器
(1)汇编调用c函数
很简单,在汇编程序中直接ldr:
例如:ldr pc,=gboot_main
(备注:gboot_main是main.c中的一个子函数,需要修改makefile,见上一篇博客)
(2)c调用汇编
在汇编中用标号注明,并设置为全局,然后再c语言中直接引用函数(标号(),例如 light_led( );)。
(3)c内嵌汇编
_arm__(
汇编语句部分
:输出部分 (凡是要写进去的参数都写到输出部分)
:输入部分 (凡是要读的参数都写到输入部分)
:破坏描述部分
);
后面三个部分可以省略,也可以arm开头。
例1:(输出:在汇编中被修改的C变量列表)
读取数据 到r*寄存器,并复制到变量value中去,因为value是存在于栈区(即内存中),所以破坏区要加上“memory”
例2:(输入:作为参数输入到汇编中的变量列表)
上面的%0表示 0 号参数(通用寄存器,系统自动分配一个寄存器),从这个参数中读取数据(值从value中获取)写到c1寄存器中。
例3:(volatile)
例4:(使用内嵌汇编点亮LED)
汇编语言:执行效率高,编写繁琐
C语言:可读性强,移植性好,调试方便
应用在对执行效率有要求的场合、能够更直接地控制处理器
(1)汇编调用c函数
很简单,在汇编程序中直接ldr:
例如:ldr pc,=gboot_main
(备注:gboot_main是main.c中的一个子函数,需要修改makefile,见上一篇博客)
(2)c调用汇编
在汇编中用标号注明,并设置为全局,然后再c语言中直接引用函数(标号(),例如 light_led( );)。
.global light_led light_led: ldr r0, =GPBCON mov r1, #0x400 str r1, [r0] ldr r0, =GPBDAT mov r1, #0x0 str r1, [r0] mov pc, lr
(3)c内嵌汇编
_arm__(
汇编语句部分
:输出部分 (凡是要写进去的参数都写到输出部分)
:输入部分 (凡是要读的参数都写到输入部分)
:破坏描述部分
);
后面三个部分可以省略,也可以arm开头。
例1:(输出:在汇编中被修改的C变量列表)
void long read_p15_c1(void) { unsigned long value; _arm_( "mrc p15,0,%0,c1,c0,0\n" :"r"(value) @'='表示只写操作数,用于输出部 : :“memory” ); return value; }
读取数据 到r*寄存器,并复制到变量value中去,因为value是存在于栈区(即内存中),所以破坏区要加上“memory”
例2:(输入:作为参数输入到汇编中的变量列表)
void write_p15_c1(unsigned long value) { _arm_( "mcr p15,0,%0,c1,c0,0\n" : :"r"(value) @编译器选择一个R*寄存器 ); }
上面的%0表示 0 号参数(通用寄存器,系统自动分配一个寄存器),从这个参数中读取数据(值从value中获取)写到c1寄存器中。
例3:(volatile)
例4:(使用内嵌汇编点亮LED)
#dedine GPKCON 0X7f008800 #define GPKDAT 0x7f008808 int gboot_main() { _arm_( "ldr r1,=0x11110000\n" "str r1,[%0]\n" "ldr r1,=0xa0\n" "str r1,[%1]\n" : :"r"(GPKCON),"r"(GPKDAT) @输入 :"r1" @因为上面修改了r1寄存器,所以放在破坏区 ); return 0; }
相关文章推荐
- C与汇编混合编程(1)
- 如何在64位的linux系统上使用汇编和C语言混合编程
- C 汇编混合编程
- 使用Visual Studio2005进行C和汇编的混合编程
- ARM中C语言和汇编语言的混合编程
- C/C++与汇编混合编程简介
- ARM汇编与C语言混合编程之汇编调用C函数
- 关于C51与汇编的实用混合编程
- ARM C、汇编混合编程
- C语言和汇编混合编程
- C语言与汇编语言混合编程应遵守的规则
- ARM汇编与C混合编程
- 如何在64位的linux系统上使用汇编和C语言混合编程
- C/C++与汇编混合编程简介
- C语言与汇编混合编程
- C语言与汇编语言混合编程应遵守的规则
- 如何实现C51和汇编的混合编程
- C与汇编混合编程
- CCS下的C和汇编的混合编程