历史上的今天

今天是:2024年08月28日(星期三)

正在发生

2020年08月28日 | ARM汇编语言和C语言混合编程

发布者:BlissfulAura 来源: 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实验报告——步进电机

推荐阅读

    虽然LG智能机基本退出了大陆市场,但它在美国市场还是颇受欢迎的,品牌位列三星、苹果之后排名第三,而LG新机预计会在9月份发布。  8月27日消息,爆料网站Slashleaks上放出了LG V40 ThinQ的最新渲染图,并注明渲染图来自工厂的CAD蓝图,所以外观基本可以确认。  根据显示,LG V40 ThinQ采用6.3英寸屏幕,分辨率1440×3120,刘海屏设计,手...
摄影诞生之初是一项“高门槛”的技艺,复杂的拍摄操作、高昂的器材成本,让摄影艺术注定只能是少数人专享的福利。不过如今的摄影早已走进了千家万户,高阶设备的售价也一路走低,早先时期代表着“高端、专业”的全画幅相机,现在的价格也已经越发亲民友好,越来越多的品牌加入其中想要分一杯羹。如今这个全幅时代,为何各厂商还不放弃APS-C?  但就在全...
据台媒经济日报报道,日本夏普(Sharp)今天公告,将斥资3.9亿美元收购JapanDisplay Inc(JDI)旗下白山工厂。夏普会长戴正吴表示,该笔交易将有利于夏普扩充产能,并开发下一代显示器。这项交易案预计今年9月或10月完成。戴正吴表示,与JDI交涉协调长达一年时间,这笔交易不仅公平,还可共创双赢,并为日本社会做出贡献。戴正吴强调,收购JDI白山工厂对...
近日,韩国KNCAP公布了2021款 特斯拉Model 3 ( 参数 | 询价 ) 安全测试结果:综合分83.3分,但在自动刹车环节失利。在韩国KNCAP所设计的AEB自动紧急制动测试环节中,特斯拉Model 3分别以20km/h、25km/h和40km/h三个速度与行驶中的自行车、行人发生多次碰撞,导致该车的在行人安全与事故预防方面丢分较多,仅为三级(最高为一级)。在韩国,汽车安全测试...

史海拾趣

问答坊 | AI 解惑

提供ipod配件音箱设计方案

一、iPod 系列配件方案 方案一: iPod基座连接音箱/响最新方案(2.4G无线遥控/红外线技术,遥控器可带LCD显示iPod菜单,可加手触摸按键) 方案二: iPod + 钟控(闹钟)+ FM/AM 最火爆新产品(iHOME iH5)上市 方案三: iPod + PSP + AM/FM + SD卡(U盘)/ ...…

查看全部问答∨

考研 VS 全国电子设计大赛

本帖最后由 paulhyde 于 2014-9-15 09:10 编辑 各位讨论一下考研和参加今年的全国电子设计大赛那个更重要!  …

查看全部问答∨

菜鸟学电源(二)反激电源

首先反激电源 从隔离的角度来说:他是一个的隔离电路,这说明这种电路能去除一些外来的干扰信号,从一定程度上满足EMI/EMC要求,为设计人员的设计提供了选择!下面我们通过结构图来分析一下他的原理吧! Q1导通时,变压器初级NP电压不能突然的变化慢 ...…

查看全部问答∨

赛灵思公司采用ARM 处理器,大伙有又学的了

早在两年前公司(IC)老总就考虑加入ARM核做设计了,后来随着离职,不知道流片后情况如何。ARM作为IC产业链最上游,生活滋润啊,和Xilinx强强联手了,两家公司还定义了下一代ARM® AMBA®互联技术,见 新闻:https://www.eeworld.com.cn/ ...…

查看全部问答∨

关于Windows的驱动程序体系,MSDN的这2张图之间是如何对应的?

图1: ----------------------------------------------------------- 图2: ----------------------------------------------------------- 第1张图片是Windows驱动架构的层次(http://msdn.microsoft.com/en-us/library/ff554721(VS.85 ...…

查看全部问答∨

寻找答案

各位,受朋友所托,帮助他了解一下嵌入式系统有关的知识,我个人一点都不知道,所以就向大家问问了,大学有什么好的东西都可以说,比如如何入门嵌入式系统,要学那一些方向的知识,他是一个大一的学生,计算机专业的。…

查看全部问答∨

高功率LED照明设计须知

高功率LED通常指1W以上的LED,是目前市场上炙手可热的技术。自该项技术诞生以来,高功率LED以其用途广、功能全的优势引起了照明行业及世界各地消费人群的广泛关注。   高功率LED是照明技术发展的一次重大突破,在能效、节约成本及照明方面均有无 ...…

查看全部问答∨

关于ST-LINK的应用

1、ST-LINK都可以用于什么ST芯片开发?2、ST-LINK都可以用于什么IDE调试环境?3、ST-LINK和ST-LINK2有何区别?…

查看全部问答∨

逆变器的各种资料 很全的

逆变器的各种资料  很难得,赚点小钱啊,包涵…

查看全部问答∨

这是什么问题啊??

用的合众达dm642开发板,用ccs仿真器连接后,load-program运行了里边的视频采集程序loop2,然后再load-program运行一个跟踪程序的时候就绿屏了,什么原因啊??那个跟踪程序没问题,烧写运行过。。。 [ 本帖最后由 nbxxxxx 于 2012-8-31 10:29 编辑 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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