ARM中ADS环境下C语言和汇编语言混合编程及示例

发布者:美好未来最新更新时间:2016-08-07 来源: eefocus关键字:ARM  ADS环境  C语言  汇编语言  混合编程 手机看文章 扫描二维码
随时随地手机看文章
稍大规模的嵌入式程序设计中,大部分的代码都是用C来编写的,主要是因为C语言具有较强的结构性,便于人的理解,并且具有大量的库支持。但对于一写硬件上的操作,很多地方还是要用到汇编语言,例如硬件系统的初始化中的CPU 状态的设定,中断的使能,主频的设定,RAM控制参数等。另外在一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依靠C编译器的生成代码,而要手工编写汇编,从而达到优化的目的。汇编语言是和CPU的指令集紧密相连的,作为涉及底层的嵌入式系统开发,熟练对应汇编语言的使用也是必须的。这里主要讨论C和汇编的混合编程,包括相互之间的函数调用。下面分四种情况来进行讨论,不涉及C++语言。

一、在C语言中内嵌汇编

    在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过使用与单纯的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面:

    a 不能直接向PC 寄存器赋值,程序跳转要使用B或者BL指令;

    b 在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突;

    c R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能把R0-R3、R12及R14用于子程序调用,因此避免直接使用这些物理寄存器;

    d 一般不要直接指定物理寄存器;

    e 让编译器进行分配内嵌汇编使用的标记是__asm或asm关键字,用法如下:__asm{instruction [; instruction]}或 asm(instruction

 

[; instruction])。

    下面是一个例子来说明如何在C中内嵌汇编语言

C语言文件.c httphi.baidu.comprocatlaw

 

#include stdio.h

void my_strcpy(const char src, char dest){

char ch;

       __asm{

              loop

                     ldrb ch, [src], #1

                     strb ch, [dest], #1

                     cmp ch, #0

                     bne loop  }}

int main(){

       char a=forget it and move on!;

       char b[64];

       my_strcpy(a, b);

       printf(original %s, a);

       printf(copyed %s, b);

       return 0;

}

 

    在此例子中C语言和汇编之间的值传递是用C语言的指针来实现的,因为指针对应的是地址,所以汇编中也可以访问。

二、在汇编中使用C定义的全局变量

    内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是有很多的限制。当汇编的代码较多时一般放在单独的汇编文件中,这时就需要在汇

 

编文件和C文件之间进行一些数据的传递,最简便的办法就是使用全局变量。

    下面是一个C语言和汇编语言共享全局变量的例子:

C语言文件.c

 

#include stdio.h

int gVar=12;

extern asmDouble(void);

int main(){

       printf(original value of gVar is %d, gVar_1);

       asmDouble();

       printf( modified value of gVar is %d, gVar_1);

       return 0;

}

;汇编语言文件.S httphi.baidu.comprocatlaw

       AREA asmfile, CODE, READONLY EXPORT asmDouble

       IMPORT gVar

asmDouble

       ldr r0, =gVar

       ldr r1, [r0]

       mov r2, #2

       mul r3, r1, r2

       str r3, [r0]

       mov pc, lr

       END

 

    在此例中,汇编文件与C文件之间相互传递了全局变量gVar和函数asmDouble,留意声明的关键字extern和IMPORT

三、在C中调用汇编的函数

    有一些对机器要求高的敏感函数,通过C语言编写再通过C编译器翻译有时会出现误差,因此这样的函数一般采用汇编语言来编写,然后供C语言调用。在C文件中调用汇编文件中的函数,要注意的有两点,一是要在C文件中声明所调用的汇编函数原型,并加入extern关键字作为引入函数的声明;二是在汇编文件中对对应的汇编代码段标识用EXPORT关键字作为导出函数的声明,函数通过mov pc, lr指令返回。这样,就可以在C文件中使用该函数了。从C语言的角度的角度,并不知道调用的函数的实现是用C语言还是汇编汇编语言,原因C语言的函数名起到表明函数

代码起始地址的作用,而这个作用和汇编语言的代码段标识符是一致的。

    下面是一个C语言调用汇编函数例子:

 

C语言文件.c httphi.baidu.comprocatlaw

#include stdio.h

extern void asm_strcpy(const char src, char dest);

int main(){

       const char s=seasons in the sun; char d[32];

       asm_strcpy(s, d);

       printf(source %s, s);

       printf( destination %s,d);

       return 0;

}

 

;汇编语言文件.S httphi.baidu.comprocatlaw

       AREA asmfile, CODE, READONLY

       EXPORT asm_strcpy

asm_strcpy

       loop

       ldrb r4, [r0], #1

       cmp r4, #0

       beq over

       strb r4, [r1], #1

       b loop

       over

       mov pc, lr

       END

 

    在此例中,C语言和汇编语言之间的参数传递是通过对应的用R0-R3来进行传递,即R0传递第一个参数,R1传递第二个参数,多于4个时借助栈完成,函数的返回值通过R0来传递。这个规定叫作ATPCS(ARM Thumb Procedure Call Standard),具体见ATPCS规范。

四、在汇编中调用C的函数

    在汇编语言中调用C语言的函数,需要在汇编中IMPORT对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理。

    下面是一个汇编语言调用C语言函数例子:

C语言文件.c   int cFun(int a, int b, int c){  return a+b+c;}

;汇编语言文件.S   AREA asmfile, CODE, READONLY

       EXPORT cFun

start

       mov r0, #0x1

       mov r1, #0x2

       mov r2, #0x3

       bl cFun

       nop

       nop

       b start

       END

在汇编语言中调用C语言的函数,参数的传递也是按照ATPCS规范来实现的。

  在这里简单介绍一下部分ATPCS规范:子程序间通过寄存器R0~R3来传递参数。

    A.在子程序中,使用寄存器R4~R11来保存局部变量。

    B.寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。

    C.寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。 

    D.寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。

    E.寄存器R15是程序计数器,记作PC

    F.参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。

    G.结果为一个32位整数时,可以通过寄存器R0返回

    H.结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。

关键字:ARM  ADS环境  C语言  汇编语言  混合编程 引用地址:ARM中ADS环境下C语言和汇编语言混合编程及示例

上一篇:arm中断学习及变量长度
下一篇:C语言和ARM汇编混合编程实现阶乘运算

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

集邦咨询:英伟达若收购了Arm,美国将主导全球芯片产业
针对英伟达拟以400亿美金收购全球IP龙头Arm一案,集邦咨询(TrendForce)旗下拓墣产业研究院表示,倘若英伟达成功收购软银旗下的Arm,美国将掌握x86与Arm两大阵营的生态系统,从而在CPU领域建立起无可撼动的地位,无疑将加大美国对中国半导体发展的牵制力道。 拓墣产业研究院分析师姚嘉洋指出,此收购案完成后,英伟达短期内的重心还是以数据中心与自动驾驶汽车两大领域为主。在数据中心方面,英伟达过去一直是重要配角,但长年来数据中心一直被英特尔的x86架构所垄断,尽管Arm阵营近期在超级运算领域取得冠军,但终究是宣誓大于实质意义。如今英伟达的GPU加上Arm的CPU架构,或许有机会一改数据中心的生态面貌。 而英伟达在自动驾驶
[手机便携]
ARM Powered智能家居,一切尽在掌握
物联网时代,智能家居系统可能是你我最触手可及的福音。那么问题来了,如何才能在自己的一方小天地里做到 得心应手,万物互联 ,即 赖在沙发上也能轻松掌控家中大小事 呢?ARM Powered 智能家居攻略,帮你轻松享受家中的物联网。 【Emberlight灯泡插座:打造居家灯光大师】 想象一下,你费劲一番周折总算是约到了TA,做客家中共进晚餐。作为一个细心的主(qing)人,灯光和音乐一样,当然是你要考虑在内的浪漫催化剂。TA刚刚进门,是不是需要明亮的灯光来给TA以安全感?共进晚餐时,是不是应该切入柔和的灯光以拉开浪漫帷幕?互诉衷肠时,是不是应该配合旖旎的灯光将彼此的情感推至高潮?以上这些,与你的距离只是一个灯泡。将一个可调
[物联网]
<font color='red'>ARM</font> Powered智能家居,一切尽在掌握
Holtek 5V宽电压Cortex-M0+支持触控单片机
Holtek 新推出 5V 宽电压 Arm® Cortex®-M0+ Touch 单片机 HT32F542xx 系列产品,频率最高可达 60MHz,提供最多 28 个触控键,可通过 CS (Conductive Susceptibility) 10V 动态测试,此外还内建具自动扫描功能的 LED controller。 应用上适用于各类电器产品,如空气炸锅、电饭锅、智能门锁、洗衣机面板等。 HT32F54231/54241 系 列 的 Flash 容 量 为 32KB/64KB,SRAM 容 量 为4KB/8KB,提供最多 24 个触控键,并支持深度休眠模式 1 / 深度休眠模式2下自动侦测功能,适合低功耗产品的应用。此外
[单片机]
ARM系统应用的数据类型
数据类型 长度(位) 对齐特性 Char 8 1(字节对齐) short 16 2(百字对齐) Int 32 4(字对齐) Long 32 4(字对齐) Longlong 64 4(字对齐) Float 32 4(字对齐) Double 64 4(字对齐) Long double 64 4(字对齐) All pointers 32 4(字对齐) Bool(C++ on ly) 32 4(字对齐) 1.整数类型 在ARM体 系中,整数类型是以2的补码形式存储的。对于long long类型来说,在little endian内存模式下,其低32位保存在低地址的字单元中,高32为保存在高地址的字单元中;在big e
[单片机]
矽鼎陈海雷:MID未来的方向是x86架构
    MID是什么?     从概念上理解,它是MobileInernetDevice的缩写,翻译成中文就是:移动互联网设备。最早的MID设备出现于2008年IDF大会上。按英特尔的定义,这是一种体积小于笔记电脑,但大于手机的流动互联网装置。通过MID,用户可进入互联网,随时享受娱乐、进行信息查询、邮件收发等操作。     在目前上网本如火如荼、 智能手机 步步紧逼的市场态势下,MID将走向何处了?作为英特尔在国内的重要战略合作伙伴,无锡矽鼎科技公司的CEO陈海雷博士认为:x86架构将会是MID发展的方向,而上网本并不会挤占原本属于MID的市场空间。     英特尔与Marvell的交易不是心血来潮     我们
[单片机]
Arm® Cortex®-M0+ MCU 如何优化通用处理、传感和控制
Arm® Cortex®-M0+ MCU 如何优化通用处理、传感和控制 嵌入式系统中的微控制器 (MCU) 像是繁忙机场的空中交通管制系统。MCU 可以感知所在的工作环境,根据感知结果采取相应操作,并与相关系统进行通信。MCU 可以管理和控制从数字温度计到烟雾探测器,再到暖通空调电机等几乎各种电子设备中的信号。 为了确保系统的经济性和使用寿命,嵌入式设计人员在设计过程中需要更大的灵活性。如果采用目前市面上的 MCU 产品系列,设计人员在当前和未来设计中可以重复使用的硬件和代码数量将很有限,并且计算、集成模拟和封装选项也很有限。这种有限的灵活性通常意味着设计人员必须向多家制造商采购 MCU,并需要花费额外的时间进行重新编程才
[单片机]
<font color='red'>Arm</font>® Cortex®-M0+ MCU 如何优化通用处理、传感和控制
微软展示Win 8平板电脑 配置四核ARM芯片
北京时间8月28日消息,据国外媒体报道,在上周五的“Tech Ed 2011新西兰”会议上,微软展示了名为Windows Slate、配置四核ARM芯片的平板电脑。 微软企业技术架构师帕特里克·赫维西(Patrick Hevesi)表示,该公司的目标是向企业用户提供iPad之外的其他选择。他说,微软正在与OEM合作伙伴合作生产更符合企业用户需求的新一代平板电脑,“我们发现,许多iPad用户同时配备了蓝牙键盘、鼠标、专用笔等”,微软的目标“是在一种混合产品中整合这些设备,使之更符合企业用户需求”。 赫维西指出,例如,微软在与部分合作伙伴合作,为新一代Windows平板电脑增添PC的“即时开机”(instant on)功能
[嵌入式]
Arm Neoverse正在成为数据中心的新势力
Arm在拥有手机和物联网设备的通用计算能力后,其下一步行动目前尚不明朗。尽管x86巨头在数据中心占据主导地位,但Arm和RISC-V之间在小型平台上的竞争已初露端倪。然而,Arm一直在积极拓展其业务,向上发展至基础设施领域,包括云计算、有线和无线通信,甚至延伸到网关和边缘设备。起初,他们的步伐是稳健的,但最近他们更积极地寻求取代主流处理器和FPGA,成为以AI为中心的GPU的前端,广泛应用于超大规模扩展、DPU、电信公司的网关和无线基带,以及汽车等边缘应用领域。在我看来,这是对支撑我们所有电子技术的快速增长和高价值基础设施的一次重要而未被充分认识的布局。 Arm的Neoverse系列在基础设施领域持续占据一席之地。以英伟达的超
[嵌入式]
<font color='red'>Arm</font> Neoverse正在成为数据中心的新势力
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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