ARM汇编语言和C语言混合编程

发布者:BlissfulAura最新更新时间:2020-08-28 来源: elecfans关键字:ARM  汇编语言  C语言  混合编程 手机看文章 扫描二维码
随时随地手机看文章

ATPCS规则体现了一种模块化设计的思想,其基本内容是C模块(函数)和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条规则)。

ATPCS规则内容:

1)寄存器的使用规则

1、子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r3可记作A1~A4。

2、在子程序中,使用寄存器r4~r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4~r11可记作V1~V8。

3、寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。

4、寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。

5、寄存器r15称为程序计数器,记作PC。


2)堆栈的使用规则

ATPCS规定堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。


3)参数的传递规则

1、整数参数的前4个使用r0~r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的寄存器传递参数。

2、子程序的返回结果为一个32位整数时,通过r0返回;返回结果为一个64位整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器F0、D0或者S0返回。


比较有条理,很清楚,我举两个例子:

1.汇编主程序调用C子程序

汇编程序的书写要遵循ATPCS规则,以保证程序调用时参数正确传递。在汇编程序中调用C程序的方法为:

1)在汇编程序中使用IMPORT伪指令或者extern事先声明将要调用的C语言函数;

2)通过BL指令来调用C函数。

例如在一个C源文件中定义了如下求和函数:

int add(int x,int y)

{

return(x+y);

}

调用add()函数的汇编程序结构如下:

area main,code,readonly ;代码段

entry ;声明程序入口

code32 ;32位ARM指令

IMPORT add 或者extern add;声明要调用的C函数

start

……

MOV r0,1

MOV r1,2

BL add ;调用C函数add

……

end

当进行函数调用时,使用r0和r1实现参数传递,返回结果由r0带回。函数调用结束后,r0的值变成3。

2.C主程序调用汇编子程序

C程序调用汇编程序时,汇编程序的书写也要遵循ATPCS规则,以保证程序调用时参数正确传递。在C程序中调用汇编子程序的方法为:

1)在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;

2)在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。

例如在一个汇编源文件中定义了如下求和函数:

EXPORT add ;声明add子程序将被外部函数调用

……

add ;求和子程序add

.global add ;声明

ADD r0,r0,r1

MOV pc,lr

……

在一个C程序的main()函数中对add汇编子程序进行了调用:

extern int add (int x,int y); //声明add为外部函数

void main(){

int a=1,b=2,c;

c=add(a,b); //调用add子程序,并且隐式地对r0和r1赋值

……

}

当main()函数调用add汇编子程序时,变量a、b的值会给了r0和r1,返回结果由r0带回,并赋值给变量c。函数调用结束后,变量c的值变成3。


3、C程序中内嵌汇编语句

在C语言中内嵌汇编语句可以实现一些高级语言不能实现或者不容易实现的功能。对于时间紧迫的功能也可以通过在C语言中内嵌汇编语句来实现。内嵌的汇编器支持大部分ARM指令和Thumb指令,但是不支持诸如直接修改PC实现跳转的底层功能,也不能直接引用C语言中的变量。


内嵌汇编:在C++和C++语言中嵌入汇编语言可以实现一些高级语言中没有的功能。

语法

__asm__( ;注意:前面是两个“_”

“instruction

...

instruction”

);//Linux gcc中支持

__asm{

instruction

...

instruction

}; //ADS中支持

asm(“instruction[; instruction]”); //ARM C++中使用

ARM内嵌汇编语法

asm(

汇编语句模板:

输出部分:

输入部分:

修改部分

);

比如: asm("mov %0, %1, ror #1" :"=r" (result) : "r" (value));

共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用“:”格开,汇编语句模板必不可少,其他三部分可选,如果使用了后面的部分,而前面部分为空,也需要用“:”格开,相应部分内容为空。例如:

__asm__ __volatile__(

"CLI":

:"memory"

);

示例:/* main.c */

void __main(void)

{

int var=0xAA;

__asm //内嵌汇编标识

{

MOV R1,var

CMP R1,#0xAA

}

while(1);

}

关键字:ARM  汇编语言  C语言  混合编程 引用地址:ARM汇编语言和C语言混合编程

上一篇:ARM架构基础知识小结
下一篇:arm实验报告——步进电机

推荐阅读最新更新时间:2024-11-02 16:13

基于ARM9的嵌入式网关的研究
   摘 要: 介绍了一种基于ARM9的嵌入式以太网的设计方案。基于ARM内核微处理器S3C2410的功能特点及其外扩组成部分,分析了以太网控制器芯片RTL8019AS的性能以及与S3C2410的接口。在软件设计上,分析了BootLoader的作用,介绍了Linux的移植,并给出了通信程序的流程图,实现了嵌入式以太网的数据传输。    关键词: 嵌入式系统;网关;ARM;移植    引 言   无所不在的网络给网络接入设备带来了巨大的发展机遇。而随着网络接入市场的迅速增长,嵌入式网络接入开始成为嵌入式系统技术中最令人关注的一个领域。在嵌入式网络技术的推动下将会形成这样一个局面:在网络上传输的信息中,将有70%的信息来自嵌入式
[嵌入式]
英国拟对英伟达以 400 亿美元收购 ARM 展开深入调查
据星期日泰晤士报报道,出于反垄断和国家安全的考虑,英国政府预计将对英伟达以 400 亿美元收购 ARM 的计划进行深入调查。 报道称,英国数字、文化、媒体和体育大臣纳丁・多里斯(Nadine Dorries)预计将指示竞争和市场管理局在下周对英伟达以 400 亿美元收购 ARM 的交易进行“第二阶段”调查。 今年 8 月,英国监管机构称该并购案可能涉及垄断,会对竞争对手不利,要求继续进行长时间的调查。 当时英国竞争和市场管理局负责人 Andrea Coscelli 表示:我们担心英伟达控制 ARM 会给其竞争对手带来真正的问题,限制他们获得关键技术,并最终扼杀一些重要的市场的创新。 此外,欧盟反垄断机构也在此前表示,将
[半导体设计/制造]
pic16f887用C语言灯闪烁
第2个部分就是编译器预设置,这个部分xc8 v1.41和xc8 v2.0一样规则。#pragma这种指令就是去设置编译器的,告诉编译器应该怎样编译这个c程序。 /* CONFIG1 */ #pragma config FOSC = XT /* Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN) */ #pragma config WDTE = OFF /* Watchdog Timer Enable bit (WDT disabled and can be enabled b
[单片机]
系统学习ARM之三 --load/store指令--装载和存储指令
一、简介: ARM体系架构中,是不允许cpu直接访问内存单元。 为了解决访问内存单元的需要,使用寄存器作为中继,内存和寄存器通过load/store指令交互,cpu在访问寄存器。 内存单元 和 寄存器 直接的数据交互。 单寄存器指令 ldr str 多寄存器指令 ldm stm 交互指令 swp 二、单寄存器指令: (1)指令功能:1个寄存器和1个内存单元数据交互。 ldr 内存单元 ---- 寄存器 (l是left)红字的部分只适用于单寄存器指令,多寄存器指令正好相反 str 寄存器 ---- 内存单元(t是to) (2)语法格式 : LDR{ co
[单片机]
ARM公司发布了RealView ICE 3.3版本
英国 ARM 公司发布了 RealView ® ICE 3.3版本,该版本可支持对CortexTM-A9 处理器 的调试。该版本同时也支持TI OMAP3和TI DaVinci 平台 ,以及 ARM 1176JZF-S ® 平台 ,同时还支持Freescale i.MX31应用 处理器 ,进一步增强了 RealView 调试工具的优势。   新功能    RealView ICE 3.3版本固件具有许多新的功能,包括:   ·对 ARM Cortex-A9 处理器 的全面调试支持   ·支持TI OMAP 34xx、TI OMAP 35xx、TI OMAP 1710、TI DaVinci、Freescale i.MX31
[嵌入式]
ARM9的中断控制器
简要复习一下ARM9中断控制器的控制过程: 1.首先能识别触发的中断(对应中断源必须打开,然后查询当前中断状态寄存器),硬件会操控PC跳到中断向量入口(IRQ_HANDLE,硬件控制的只要是IRQ中断类型就会进入),在中断跳转函数里面保存现场(保存R0等等工作寄存器)--跳到服务函数(里面进行中断源判断和处理)---恢复现场,基本流程是这样。 2.中断的触发:高低电平,上升下降沿等等,具体的设置寄存器实现。 3.中断能否传到CPU?触发以后还要通过许多开关(寄存器设置使能与否)确保到达CPU,这样CPU才能识别(有的中断源是不需要的),有些中断是二级中断,需要开关比较多,注意芯片手册说明 4. 比如我们要触发的是INT_TC这
[单片机]
<font color='red'>ARM</font>9的中断控制器
英特尔之痛:手机芯片ARM市占已超9成
来自国外媒体的最新报道称,英国芯片制造商ARM目前生产的芯片产品已经成为全球智能手机和平板电脑产品的标准配置,而其它包括数码相机、多媒体播放器在内的各种消费电子产品都采用了ARM架构的芯片,从全球范围内来看ARM架构的芯片占据了手机芯片市场90%的份额,而ARM的股票价格在过去的15个月时间里已经连续翻了2倍。 业内人士表示,成立于21年之前的ARM目前正在让全球的芯片市场格局发生变化,而即使是英特尔这样的芯片巨头目前也感受到来自ARM的巨大压力,而苹果iPad 2所采用的ARM架构芯片更是让其名声在外,英特尔的尴尬和无奈多少还是必露无遗。 今年3月2日苹果首席执行官乔布斯在发布iPad 2时表示这款平板
[手机便携]
英特尔之痛:手机芯片<font color='red'>ARM</font>市占已超9成
arm cpu的架构及分类说明
今天在编译mplayer for mx27ads的时候, 碰到了armv5te与armv6优化的问题。 默认的交叉编译器支持armv5te也支持armv6,就默认使用了mplayer中mpeg4的armv6解码代码, 结果在在mx27ads版上,播放mpeg4视频时颜色空间转换出错。 对比x86后总算找到了这个问题,顺手根据ARM官方资料和网上资料整理了一篇arm cpu的架构及分类说明。 ARM微处理器系列 ARM 微处理器目前包括下面几个系列,以及其它厂商基于 ARM 体系结构的处理器,除了具有 ARM 体系结构的共同特点以外,每一个系列的 ARM 微处理器都有各自的特点和应用领域。 - ARM7 系列 - ARM9 系列 -
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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