系统学习ARM之五 --C语言和汇编混合编写

发布者:Xiangtan最新更新时间:2018-05-06 来源: eefocus关键字:系统学习  ARM  C语言  汇编  混合编写 手机看文章 扫描二维码
随时随地手机看文章

转载自http://blog.csdn.net/qqliyunpeng/article/details/48791647


一、GNU汇编书写格式:

  • 代码行中的注释符号: ‘@’ 整行注释符号: ‘#’ 语句分离符号: ‘;’ 直接操作数前缀: ‘#’ 或 ‘$’

  • 全局标号:标号只能由a~z,A~Z,0~9,“.”,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成,标号的后面加“:”。

              段内标号的地址值在汇编时确定;
              段外标号的地址值在连接时确定。

  • 局部标号:局部标号 主要在局部范围内使用而且局部标号可以重复出现。它由两部组成开头是一个0-99直接的数字局部标号 后面加“:”???

         F:指示编译器只向前搜索,代码行数增加的方向 / 代码的下一句

         B:指示编译器只向后搜索,代码行数减小的方向

             注意局部标号的跳转,就近原则

例子:   

    1:a

    2:b

    1:c

    b 1b    跳转到 c 所处的位置

==================================================================

二、混合编程和内联汇编:

【1】1.c 和2.c 编译成一个elf文件

     gcc  -c 1.c -o 1.o  

     gcc  -c 2.c -o 2.o

     ld  -Ttext 40008000 1.o 2.o -o  a.elf

【2】1.s 和2.c 编译成一个elf文件

     gcc  -c 1.s -o 1.o  

     gcc  -c 2.c -o 2.o

     ld  -Ttext 40008000 1.o 2.o -o  a.elf

【3】c语言中调用汇编中的函数

            在汇编中.global/.globl  (在定义的文件中)

            在 c 中extern                 (在调用的文件中)  

================ 内联汇编 ============

【4】内联汇编:在c语言代码中嵌入汇编指令

    (1)Gcc 通过关键字“asm”来声明内联汇编

    (2)格式: asm或__asm__开头,小括号+分号,括号内容写汇编指令。

            指令+\n\t 用双引号引上

       asm(code : output operand list : input operand list : clobber list);

    (3)例一:无参数,无返回值

          asm

         (

            //汇编指令

            "mrs r0,cpsr     \n\t"

            "bic r0,r0,#0x80 \n\t"

            "msr cpsr,r0     \n\t"

         );

    (4)

        例二:有参数 1,有返回值

         让内联汇编做加法运算,求a+b,结果存在c中

             int a =100;

             int b =200;

             int c =0;

             asm

             (

                 "add %0,%1,%2\n\t"

                 : "=r"(c)              //输出列表 %0 --c

                 : "r"(a),"r"(b)        //输入列表 %1 --a  %2--b

                 : "memory"             //通知列表

             );

         例三:有参数 2 ,有返回值

         让内联汇编做加法运算,求a+b,结果存在c中,把a-b的存在d中

             int a=100;

             int b=200;

             int c=0;

             int d=0;

     asm volatile

    (

        "add  %[op1],%[op2],%[op3]\n\t"    

        :[op1]"=r”(sum)

        :[op2]"r"(a),[op3]”r”(b)

        :"memory"

        " sub %[op4],%[op2],%[op3]\n\t "

        :[%op4]"=r"(d)

        :

        :"memory"

    );

【5】 gcc的代码优化级别,在 makefile 文件中的编译命令

        4级  O0 -- O3  数字越大,优化程度越高。O3最大优化

 

【6】volatile作用

        volatile修饰的变量,编译器不再进行优化,每次都真正访问内存地址空间。

 

三、ATPCS规则:(ARM、thumber程序调用规范)

(1)使用r0-r3,依次接受参数

     void func(a,b,c,d,e)

      a -- r0

      b -- r1

      c -- r2

      d -- r3

      e -- 栈

(2)使用r0 接收返回值

     int func1(int m, int n)

     m  -- r0

     n  -- r1

     返回值给 r0

(3)局部变量,保存到r4--r11,当局部变量多余8个,用栈

(4)r12 -- ip(保存sp)

     r13 -- sp

     r14 -- lr

     r15 -- pc


关键字:系统学习  ARM  C语言  汇编  混合编写 引用地址:系统学习ARM之五 --C语言和汇编混合编写

上一篇:系统学习ARM之六 --异常处理
下一篇:系统学习ARM之四 --GNU的伪指令集

推荐阅读最新更新时间:2024-03-16 16:01

智能化信息化ARM的RFID门禁控制系统设计
自动化、信息化、智能化已经成为时代发展的需求,进入21世纪以来,无限技术、计算机技术继续不断深入发展,物联网行业蒸蒸日上。基于RFID技术的门禁控制系统正是物联网实用性的一个良好体现。门禁系统按进出识别方式可分为以下3大类:密码识别;卡片识别;生物识别。密码识别即通过检验输入密码是否正确来识别进出权限,密码识别安全性要相对高一些,但是密码容易忘记,而且每次进门都需输入密码,这样显得繁琐。生物识别即通过人的一些生物特征来识别,生物识别安全性高而且非常方便,但是其高昂的成本费使其难以得到推广。卡片识别分为2类:第一种是用磁卡,但是磁卡安全性低、易磨损而且需要经常性充磁;第二种是RFID卡片,RFID卡便宜、使用方便、安全性高而且能够用
[单片机]
智能化信息化<font color='red'>ARM</font>的RFID门禁控制<font color='red'>系统</font>设计
ARM启动过程
ARM 启动过程 对于一般的嵌入式系统来讲,考虑到系统成本,运行速度等因素,往往联合使用好几种存储器件。在下面讲到的例子中,是我在开发中用到的一个 ARM9EJ 的处理器,系统中采用了SDRAM, ROM, Nand FLASH, ITCM ,DTCM 等。 SDRAM: 程序正常运行时所在的存储器, 物理地址 0x24000000 - 0x24800000 (以8M 为例); ROM: 复位后, ARM 从 ROM 启动, ROM 是只读的,出厂时就烧好了,不可更改,正常运行时,物理地址: 0x2C000000 - 0x2C006000 (24KB); Nand FLASH: 外接存储器件,正常运
[工业控制]
PIC单片机PWM电机速度控制源码-实用C语言程序设计与典型实例
单片机源程序如下: #include p18cxxx.h #include 16x2LCDDriver.h unsigned char LCDBuffer_0 ={ STOP 00% DIR + }; unsigned char LCDBuffer_1 ={ Get Spd 0000 RPM }; struct TMR1COUNTER_STRUCT { unsigned char HighCounter; unsigned int LowCounter; unsigned char ChangeFlag; }; struct TMR1COUNTER_STRUCT MyTMR1,MyTMR3,GetTMR1
[单片机]
快速学Arm(26)--向量中断控制器VIC(4)
VIC是中断源和CPU内核之间的一座桥梁.VIC可以支持32个中断输入,我们可以使用编程将32个中断请求设置为快速中断请求(FIQ)和向量中断请求(IRQ): 我们先来讲一下FIQ,FIQ具有最高的优先级,当FIQ和IRQ同时触发的时候,只能响应FIQ. 我们使用VICIntSelect寄存器来选择哪一个中断为FIQ,哪一个中断为IRQ,这是一个32bit的寄存器,每一位对应着下面的中断源表,这个表要经常用到,大家要记住: 这个表中任何一个中断源请求都可以被分配为FIQ,当然也可以被分配为IRQ.当只有一个中断源被分配为FIQ的时候,中断响应将是最实时的.如果有两个中断源被分配了FIQ,那么则必须在中断服
[单片机]
快速学<font color='red'>Arm</font>(26)--向量中断控制器VIC(4)
基于ARM开发板的车辆检测系统控制单元设计
引言 由于交通需求的不断增加,有越来越多的环形感应线圈检测器用于交通检测。这些埋设在道路表面下的线圈可以检测到车辆通过时的电磁变化进而精确地算出交通流量。交通流量是交通统计和交通规划的基本数据,通过这些检测结果可以用来计算占用率(表征交通密度),在使用双线圈模式时还可以提供速度、车辆行驶方向、车型分类等数据,这些数据对于交通管理和统计是极为重要的。通常高速公路车辆检测系统由多通道环形检测单元LD4和控制单元CCU组成,本文采用PHILIPS公司最新推出的ARM7内核微处理器LPC2114设计实现了车辆检测系统控制单元部分,并且和5个LD4环形检测器一起构成10通道高速公路车辆检测系统。 LPC2114和电子硬盘连线示意图
[单片机]
基于<font color='red'>ARM</font>开发板的车辆检测<font color='red'>系统</font>控制单元设计
tiny4412学习(一)之从零搭建linux系统
硬件平台:tiny4412 系统:linux-3.5-20151029 文件系统:busybox-1.22.1.tar.bz2 编译器: arm-linux-gcc-4.5.1 目的: 使用uboot引导 Linux 系统,并挂接根文件系统,搭建起 linux 开发环境。 由于友善支臂提供的minitools不是开源,使用起来很不舒服。本文将记录从零使用uboot在tiny4412上搭建linux系统的。由于之前只是学了2440,完成这个流程也遇到各种,现在总结如下。其中参考了多篇博客才得以实现,具体涉及的时候会给出链接。 一、准备系统文件 1、安装交叉编译工具链 (1)解压编译器源码 tar arm
[单片机]
tiny4412<font color='red'>学习</font>(一)之从零搭建linux<font color='red'>系统</font>
ARM营销官:连网汽车面临安全挑战
    在日前于美国拉斯维加斯举行的2016年国际消费性电子展(CES)上,安谋国际(ARM)行销长暨市场开发执行副总裁Ian Drew提出了汽车产业(或整个科技产业)情愿避而不谈的几个问题。 在接受《EE Times》的专访中,记者问起了Ian Drew如何看待汽车制造商在日益连网的世界中所面临的挑战,以及ARM期望如何解决这些问题及其在此发展过程中所扮演的角色。Drew并不避谈第一个问题,但却未对第二个问题透露进一步的细节。 他认为汽车产业即将发生影响其业务模式的急剧变化、所有的汽车都将面对安全漏洞的问题,以及连接至云端后随之而来意想不到的后果。 ARM行销长暨市场开发执行副总裁Ian Drew 最重要的是,他
[手机便携]
基于ARM的大型LED点阵显示系统的设计
大型LED 显示系统是随着计算机及相关微电子、光电子技术的迅猛发展而形成的一种电子广告媒体,它利用发光二极管构成的点阵模块或像素单元组成大面积显示屏幕,主要用于显示字符、图像等信息。它采用低电压扫描驱动,具有: 耗电少、寿命长、成本低、亮度高、故障少、视角大、可视距离远等优点。随着LED材料技术和工艺的提升,大型LED显示系统以突出的优势成为平板显示的主流产品之一,广泛应用在如证券交易,机场航班,港口,车站等场合,在信息显示领域得到广泛应用。 1 系统结构与原理 大型LED显示系统一般分为显示驱动模块和主控板两部分。 1.1 显示模块 大型LED显示系统是利用人眼视觉特点采用逐行扫描和列驱动方式以节省硬件开支,本系统采用1 /16
[单片机]
基于<font color='red'>ARM</font>的大型LED点阵显示<font color='red'>系统</font>的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved