ARM嵌入式开发中的GCC内联汇编__asm__

在针对ARM体系结构的编程中,通常很难直接使用C语言产生操做协处理器的相关代码,所以使用汇编语言来实现就成为了惟一的选择。但若是彻底经过汇编代码实现,又会过于复杂、难以调试。所以,C语言内嵌汇编的方式却是一个不错的选择。然而,使用内联汇编的一个主要问题是,内联汇编的语法格式与使用的编译器直接相关,也就是说,使用不一样的C编译器内联汇编代码时,它们的写法是各不相同的。下面介绍在ARM体系结构下GCC的内联汇编。GCC内联汇编的通常格式:linux

asm(


代码列表
: 输出运算符列表
: 输入运算符列表
: 被更改资源列表
);编程

在C代码中嵌入汇编须要使用asm关键字,在asm的修饰下,代码列表、输出运算符列表、输入运算符列表和被更改的资源列表这4个部分被3个“:”分隔。下面,咱们看一个例子:函数

void test(void)
{
……
asm(
"mov r1,#1\n"
:
:
:"r1"
);
……
} 网站

注:换行符和制表符的使用可使得指令列表看起来变得美观。你第一次看起来可能有点怪异,可是当C编译器编译C语句的是候,它就是按照上面(换行和制表)生成汇编的。调试

函数test中内嵌了一条汇编指令实现将当即数1赋值给寄存器R1的操做。因为没有任何形式的输出和输入,所以输出和输入列表的位置上什么都没有填写。可是,在汇编代码执行过程当中R1寄存器会被修改,所以为了通知编译器,在被更改资源列表中,须要写上寄存器R1。htm

寄存器被修改这种现象发生的频率仍是比较高的。例如,在调用某段汇编程序以前,寄存器R1可能已经保存了某个重要数据,当汇编指令被调用以后,R1寄存器被赋予了新的值,原来的值就会被修改,因此,须要将会被修改的寄存器放入到被更改资源列表中,这样编译器会自动帮助咱们解决这个问题。也能够说,出如今被更改资源列表中的资源会在调用汇编代码一开始就首先保存起来,而后在汇编代码结束时释放出去。因此,上面的代码与以下代码从语义上来讲是等价的。资源

void test(void)
{
……
asm(
"stmfd sp!,{r1}\n"
"mov r1,#1\n"
"ldmfd sp!,{r1}\n"
);
……
} 开发

这段代码中的内联汇编既无输出又无输入,也没有资源被更改,只留下了汇编代码的部分。因为程序在修改R1以前已经将寄存器R1的值压入了堆栈,在使用完以后,又将R1的值从堆栈中弹出,因此,经过被更改资源列表来临时保存R1的值就没什么必要了。get

在以上两段代码中,汇编指令都是独立运行的。但更多的时候,C和内联汇编之间会存在一种交互。C程序须要把某些值传递给内联汇编运算,内联汇编也会把运算结果输出给C代码。此时就能够经过将适当的值列在输入运算符列表和输出运算符列表中来实现这一要求。请看下面的例子:编译器

void test(void)
{
int tmp=5;
asm(
"mov r4,%0\n"
:
:"r"(tmp)
:"r4"
);
}

上面的代码中有一条mov指令,该指令将%0赋值给R4。这里,符号%0表明出如今输入运算符列表和输出运算符列表中的第一个值。若是%1存在的话,那么它就表明出如今列表中的第二个值,依此类推。因此,在该段代码中,%0表明的就是“r”(tmp)这个表达式的值了。

那么这个新的表达式又该怎样解释呢?原来,在“r”(tmp)这个表达式中,tmp表明的正是C语言向内联汇编输入的变量,操做符“r”则表明tmp的值会经过某一个寄存器来传递。在GCC4中与之相相似的操做符还包括“m”、“I”,等等,其含义见下表:

ARM嵌入式开发中的GCC内联汇编简介

与输入运算符列表的应用方法一致,当C语言须要利用内联汇编输出结果时,可使用输出运算符列表来实现,其格式应该是下面这样的。

void test(void)
{
int tmp;
asm(
"mov %0,#1\n"
:"=r"(tmp)
:
);
}

在上面的代码中,本来应出如今输入运算符列表中的运算符,如今出如今了输出运算符列表中,同时变量tmp将会存储内联汇编的输出结果。这里有一点可能已经引发你们的注意了,上面的代码中操做符r的前面多了一个“=”。这个等号被称为约束修饰符,其做用是对内联汇编的操做符进行修饰。几种修饰符的含义以下表所示:

ARM嵌入式开发中的GCC内联汇编简介

当一个操做符没有修饰符对其进行修饰时,表明这个操做符是只读的。当咱们须要将内联汇编的结果输出出来,那么至少要保证该操做符是可写的。所以,“=”或者“+”也就必不可少了。

本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文连接:http://www.linuxidc.com/Linux/2012-11/74645.htm

相关文章
相关标签/搜索