0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ATPCS规则体现了一种模块化设计的思想

h1654155971.7688 来源:未知 作者:李倩 2018-05-22 09:26 次阅读

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);

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5327

    浏览量

    120071
  • C语言
    +关注

    关注

    180

    文章

    7601

    浏览量

    136272

原文标题:汇编C语言混合编程经验总结

文章出处:【微信号:weixin21ic,微信公众号:21ic电子网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    ATPCS规则体现一种模块化设计的思想,其基本内容
    的头像 发表于 06-01 09:13 8905次阅读

    模块化编程思想

    模块化编程思想
    发表于 06-24 10:09

    贴片机模块化设计概述

    逐步向柔性制造方向发展的趋势。  从应用上来讲,模块化设计是一种技术的集成,模块化贴片机将贴片机的高速度、高精度、多功能、灵活性、高效性集成在△个贴片机系统中。从设计上来说,模块化贴片
    发表于 09-06 16:40

    怎样去设计一种单片机模块化架构?设计要遵循哪些规则

    怎样去设计一种单片机模块化架构?设计要遵循哪些规则?为什么需要模块化设计整体架构?如何去拆分模块
    发表于 07-14 07:41

    机器人控制器的一种模块化设计方法

    本文针对地面移动机器人,在CAN总线的基础上,设计一种模块化的控制器结构。这种设计具有可靠性强、扩展性好等特点。实际应用证明了该设计的可行性。关键词:模块化
    发表于 05-25 11:22 30次下载

    实用性通信采集系统的模块化硬件设计

    本文从主从通讯电路、以太网通讯电路、电流环通讯电路、开关量输入与输出电路,共几个方面详细介绍一种实用性通信采集系统的模块化硬件设计。本设备采用模块化设计
    发表于 07-10 13:29 14次下载

    一种模块化高效电子商务推荐系统的设计

    论文提出了一种模块化的高效电子商务推荐系统的体系结构,详述该系统各个模块的构造、功能以及如何相互协作从而最终完成推荐任务。并着重研究数据
    发表于 03-02 11:59 19次下载

    电扶梯模块化改造

    本文分析目前电扶梯改造的市场机会,提出了一种电扶梯模块化改造方案。分析模块化改造方案的优势,并以具体实例介绍
    发表于 05-23 15:11 18次下载

    模块化程序设计

    模块化程序设计思想,单片机c语言的模块化设计,方便移植,将程序封装备用。
    发表于 03-22 15:29 9次下载

    模块化编程思想

    模块化编程思想,充分利用c语言的可移植性,更好的利用c语言。
    发表于 03-22 15:15 16次下载

    一种基于单片机系统的DMA控制电路的模块化设计方案

    一种基于单片机系统的DMA控制电路的模块化设计方案
    发表于 01-14 22:41 19次下载

    解读:一种基于模块化设计的PLM平台建设

    本文通过对PLM平台与模块化设计的关系及PLM平台对模块化设计支持的论述,帮助制造型企业提升对PLM平台的认识,使平台能和模块化设计结合起来,提升企业的核心竞争力。
    发表于 05-25 15:25 1694次阅读
    解读:<b class='flag-5'>一种</b>基于<b class='flag-5'>模块化</b>设计的PLM平台建设

    基于一种模块化的LED显示屏设计

    实际上不论显示屏的大小,其原理都是相同的,因此完全可以设计出一种标准模块化的LED显示屏,会对不同的需要,只需要得意组合相应的模块即可。本文介绍的就是
    发表于 10-14 16:42 1971次阅读
    基于<b class='flag-5'>一种</b><b class='flag-5'>模块化</b>的LED显示屏设计

    苹果新专利展示一种高度模块化AR眼镜设计

    近日,美国专利商标局发布项苹果AR眼镜相关的专利,专利中指出了一种高度模块化的AR眼镜设计方案。该方案的特点是可根据不同的需求和场景,更换不同的
    发表于 07-10 14:50 609次阅读

    ATPCS基本规则

    有调用关系的所有子程序必须遵守同一种ATPCS,编译器或者汇编器在ELF格式的目标文件中设置相应的属性,标识用户选定的ATPCS类型。对应不同类型的ATPCS
    的头像 发表于 05-27 10:12 2482次阅读