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

}

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

    关注

    30

    文章

    4994

    浏览量

    117420
  • C语言
    +关注

    关注

    180

    文章

    7513

    浏览量

    124211

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    #硬声创作季 Java项目实战(金融项目)-模块化导入模块的另一种方式

    JAVA编程语言模块化
    Mr_haohao
    发布于 :2022年09月07日 10:50:34

    模块化编程思想

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

    C高级编程基于模块化设计思想的C语言开发CC技术丛书

    C高级编程基于模块化设计思想的C语言开发CC技术丛书
    发表于 09-28 12:34

    贴片机模块化设计概述

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

    模块化UPS的技术选择详解

    对两主流架构的模块化UPS进行剖析,希望能给各位读者些帮助及启发。  2. 模块化UPS的两典型架构  1)分布式架构  图1中展示
    发表于 09-30 16:25

    工程师们如何去建立一种模块化软件定义型测试系统?

    工程师们如何去建立一种模块化软件定义型测试系统?
    发表于 05-06 10:06

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

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

    编程框架或者编程思想

    玩单片机还可以,各个外设也都会驱动,但是如果让你完整的写套代码时,却无逻辑与框架可言。这说明编程还处于比较低的水平,你需要学会一种好的编程框架或者一种编程思想!比如
    发表于 09-01 07:09

    到底什么是模块化编程?

    对于些接触单片机编程不久的小萌新来说,模块化编程这个概念刚接触的时候可能会很懵,到底什么是模块化编程?我以前也不懂,后面根据网上的说明和自己对库函数例程的分析,已经完全掌握这门技能
    发表于 12-03 07:39

    浅析模块化编程思路

    放开手脚,代码写着写着就乱。不仅后续维护不方便,就是自己也不知道当初为啥这么写。低内聚高耦合的代码需要遵循以下原则:降低耦合度的方法1、 多使用模块化编程的思想,在编写之初,模块需要
    发表于 12-20 06:52

    组合逻辑模块化设计之静态数码管显示

    同样可以再继续分解为多个更底层的模块,这就是自顶向下的设计思想,也是目前主流的数字系统设计思想,而模块化设计就是遵循这设计
    发表于 07-29 15:50

    模块化程序设计

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

    模块化编程思想

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

    ATPCS基本规则

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