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

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

3天内不再提示

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

j4AI_wujianying 来源:未知 作者:胡薇 2018-06-01 09:13 次阅读

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
    ARM
    +关注

    关注

    134

    文章

    8643

    浏览量

    361659
  • C语言
    +关注

    关注

    180

    文章

    7522

    浏览量

    127536

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

文章出处:【微信号:wujianying_danpianji,微信公众号:单片机精讲吴鉴鹰】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MSP430单片机C语言和汇编语言混合编程

    `为了发挥C语言和汇编语言各自的优点,二者需要相互调用函数。本文首先介绍了MSP430单片机的C语言函数的参数传递规则,然后对
    发表于 03-02 11:07

    ARM汇编语言C语言混合编程的实现方法.pdf

    ARM汇编语言C语言混合编程的实现方法.pdf
    发表于 03-13 15:51

    Keil下STM32的C汇编语言混合编程

    Keil下STM32的C汇编语言混合编程C语言调用汇编函数,以及
    发表于 12-20 06:06

    单片机C语言和汇编语言混合编程

    第5章单片机C语言和汇编语言混合编程第5章单片机C语言和
    发表于 01-25 06:47

    TMS320C3x的C和汇编语言混合编程及中断的C语言实现

    文章在简要介绍了TMS320C3x系列芯片的基础上,给出了如何使用C语言和汇编语言混合编程来开发应用程序的方法和一些编程实例。然后给出了TMS320C3x系列芯片的中断机制,同时举例说
    发表于 04-24 15:39 21次下载

    MSP430单片机C语言和汇编语言混合编程

    为了发挥C语言和汇编语言各自的优点,二者需要相互调用函数。本文首先介绍了MSP430单片机的C语言函数的参数传递规则,然后对C语言和汇编语言
    发表于 08-31 10:55 50次下载

    DSP汇编语言编程基础

    DSP汇编语言编程基础 一、  实验目的 1、了解 DSP 的寻址方式; 2、了解 DSP 的汇编语言与 C语言混合编程。 二、
    发表于 02-11 09:41 205次下载

    MDP430单片机语言和汇编语言混合编程

    摘要:为了发挥C语言和汇编语言各自的优点二者需要相互调用函数本文首先介绍了"MSP430”单片机的!语言函数的参数传递规则然后对C语言和汇编语言
    发表于 07-15 12:02 46次下载

    C语言汇编语言混合编程示例程序

    本文介绍了C语言和汇编语言模块接口的一般方法,并给出了完整的编程示例
    发表于 07-11 17:49 103次下载
    C<b class='flag-5'>语言</b>与<b class='flag-5'>汇编语言</b><b class='flag-5'>混合编程</b>示例程序

    C语言和汇编语言混合编程方法和C语言中断处理方法

    C语言和汇编语言混合编程方法和C语言中断处理方法,new
    发表于 01-06 14:36 36次下载

    基于MSP430单片机C语言和汇编语言混合编程

    基于MSP430单片机C语言和汇编语言混合编程
    发表于 10-12 17:05 18次下载
    基于MSP430单片机C<b class='flag-5'>语言和</b><b class='flag-5'>汇编语言</b><b class='flag-5'>混合编程</b>

    MSP430单片机的C语言和汇编语言混合编程

    MSP430单片机的C语言和汇编语言混合编程
    发表于 10-13 08:35 24次下载
    MSP430单片机的C<b class='flag-5'>语言和</b><b class='flag-5'>汇编语言</b><b class='flag-5'>混合编程</b>

    MSP430单片机的C语言和汇编语言混合编程的详细描述和应用实例

    为了发挥C语言和汇编语言各自的优点,二者需要相互调用函数。本文首先介绍了MSP430单片机的C语言函数的参数传递规则,然后对C语言和汇编语言
    发表于 02-22 17:06 20次下载
    MSP430单片机的C<b class='flag-5'>语言和</b><b class='flag-5'>汇编语言</b><b class='flag-5'>混合编程</b>的详细描述和应用实例

    单片机C语言和汇编语言混合编程实例详解

    单片机C语言和汇编语言混合编程实例详解
    发表于 08-16 09:50 221次下载

    "单片机r6/r7c语言怎么用,第5章MCU混合编程与C语言和汇编语言"

    第5章单片机C语言和汇编语言混合编程第5章单片机C语言和汇编语言混合编程5.1
    发表于 11-30 19:36 14次下载
    "单片机r6/r7c<b class='flag-5'>语言</b>怎么用,第5章MCU<b class='flag-5'>混合编程</b>与C<b class='flag-5'>语言和</b><b class='flag-5'>汇编语言</b>"