您的位置:首页 > 编程语言

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( );)。

.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语言 汇编语言