ARM体系下的GCC内联汇编

发布时间:2024-08-30  

在操作系统级的编程中,有时候,C语言并不能完全的使用硬件的功能,这时候就需要嵌入一些汇编代码来实现功能。 有两种方式可以使C语言和assemly语言一起工作,一种是两种语言分开写成两个文件,链接的时候链接成一个文件;另一种就是在C语言中嵌入汇编代码。下面简单介绍一下如何在GCC中嵌入汇编代码。


GCC规定了一个内联汇编的语法,不同硬件平台上的GCC内联汇编几乎都是这样的:


asm(

    汇编指令列表

    :输出运算符列表

    :输入运算符列表

    :被更改的资源列表

};

在GCC中插入汇编代码,需要以asm关键字开头,中间四个部分用”:”分隔,如果你嵌入的汇编没有输入输出,或者更改资源,后面三项是可以省略的。


下面以一个实例来说明这个语法:


 1  void test(void)

 2  {

 3      int tmp;

 4      // some code

 5      __asm__(

 6         ' mov r1,%0nt'

 7         : 

 8         : 'r' (tmp)

 9         : 'r1'

10      );

11      

12   }

13   


以上代码的意思就是,将tmp变量的值赋给r1寄存器,%0代表出现在输入运算符列表和输出运算符列表中的第一个值,%1,%2依次类推。由于我们自己的汇编代码改变了r1的值,所以我们要通知GCC编译器,r1的值被我们改变了, 在 “r” (tmp) 表达式中,tmp代表C语言输入到汇编中的变量,”r”代表tmp会通过一个寄存器传递。可以使用的符号有以下几种:


表1 GCC4内联汇编操作符节选

操作符 含义
r 通用寄存器R0~R15
m 一个有效内存地址
l 数据处理指令中的立即数
X 被修饰的操作符只能作为输出

上面一个代码是将C语言的值传递到汇编代码中,也可以将汇编代码输出的结果传给C代码:


 1     void test(void)

 2     {

 3         int tmp;

 4         __asm__(

 5             'mov %0, #1nt'

 6             : '=r' (tmp)

 7             :

 8         ); 

 9      }

10      

这段代码的意思是,将立即数1赋给变量tmp。 与上面不同的是,输入运算符列表移到了输出运算符列表,”r”前面也多了一个等于号。这个等号被称为约束修饰符,以下是几种修饰符的含义列表:


表2  GCC4中内联汇编修饰符

修饰符 说明
被修饰的操作符是只读的
= 被修饰的操作符只写
+ 被修饰的操作符具有可读写的属性
& 被修饰的操作符只能作为输出


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    是两种语言分开写成两个文件,链接的时候链接成一个文件;另一种就是在C语言中嵌入汇编代码。下面简单介绍一下如何在GCC中嵌入汇编代码。 GCC规定了一个内联汇编的语法,不同硬件平台上的GCC内联汇编......
    GCC 内联汇编(GCC内嵌ARM汇编规则);有时为了高效,有时为了直接控制硬件,有些模块我们不得不直接用汇编语言来编写,并且对外提供调用的接口,隐藏细节,这其实就是内联汇编。如何使用内联汇编?我们......
    中变量名代替寄存器 {     MOV var,x     ADD y,var,x/y } 内联汇编语言中的寄存器名被编译器视为 C 或 C++语言中的变量,所以内联汇编......
    stm32f10x.h错误 图3.7 芯片类型宏定义选项 修改位置3: 出现如图3.8所示语法错误时,需要将keil编译器识别的汇编语法全部修改为gcc所能识别的语法 图3.8 汇编语法错误 修改前sys.c文件......
    分析:在语法树上进行类型检查和语义分析,确定变量类型和作用域等信息。 (4) 代码生成:将语法树转换为目标代码,生成可执行程序或库文件。 2. 汇编语言 在51单片机编程中,使用汇编语......
    调试等功能。 2. 基本语法 51单片机汇编程序设计的基本语法与其他汇编语言类似,主要包括以下几个方面: (1) 注释:使用分号(;)表示注释,用于说明代码的作用和功能。 (2) 标识符:用于定义变量名、子程......
    分享一些单片机汇编语言常见的语法和程序错误;一、汇编软件汇编失败原因分析这里采用Keil C51软件包中的宏汇编器A51作为编绎器,单片机的汇编语言编写时要注意一定的语法,详细......
    语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。二十世纪八十年代至今的有关程序开发工具,一般都支持匹配ANSI C的语法。 二、汇编语言简介 汇编语言( assembly......
    后面跟着的一个规则集合,确定它们之间的关系。 语法分析器的输出结果是树结构, 会被传递给编译程序的后端。 语法分析树结构会被翻译成伪汇编语言(psuedo-assembly language) ,叫做......
    进行STM32单片机编程时,需要掌握C语言的基本语法、数据类型、指针、结构体等概念,以及STM32单片机的寄存器操作和库函数使用方法。   汇编语言也是STM32单片机的一种编程语言,它可以直接操作CPU......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>