C语言与汇编语言混合编程应遵守的规则

转载 2012年03月26日 22:30:04

        ARM编程中使用的C语言是标准C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境与ARM的硬件紧密相关。 在使用C语言时,要用到和汇编语言的混合编程。若汇编代码较为简洁,则可使用直接内嵌汇编的方法;否则要将汇编程序以文件的形式加入到项目中,按照ATPCS(ARM/Thumb过程调用标准,ARM/Thumb Procedure Call Standard)的规定与C程序相互调用与访问。 在C程序和ARM汇编程序之间相互调用时必须遵守ATPCS规则。ATPCS规定了一些子程序间调用的基本规则,哪寄存器的使用规则,堆栈的使用规则和参数的传递规则等。

 1)寄存器的使用规则 子程序之间通过寄存器r0~r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0~r3可记作A1~A4。 在子程序中,使用寄存器r4~r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4~r11可记作V1~V8。 寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。 寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。 寄存器r15称为程序计数器,记作PC。

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

 3)参数的传递规则 整数参数的前4个使用r0~r3传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的FP寄存器传递参数。 子程序的返回结果为一个32位整数时,通过r0返回;返回结果为一个64位整数时,通过r0和r1返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器F0、D0或者S0返回。

2、汇编程序调用C程序的方法 汇编程序的书写要遵循ATPCS规则,以保证程序调用时参数正确传递。在汇编程序中调用C程序的方法为:首先在汇编程序中使用IMPORT伪指令事先声明将要调用的C语言函数;然后通过BL指令来调用C函数。 例如在一个C源文件中定义了如下求和函数: int add(int x,int y){ return(x+y); } 调用add()函数的汇编程序结构如下: IMPORT add ;声明要调用的C函数 …… MOV r0,1 MOV r1,2 BL add ;调用C函数add …… 当进行函数调用时,使用r0和r1实现参数传递,返回结果由r0带回。函数调用结束后,r0的值变成3。 3、C程序调用汇编程序的方法 C程序调用汇编程序时,汇编程序的书写也要遵循ATPCS规则,以保证程序调用时参数正确传递。在C程序中调用汇编子程序的方法为:首先在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;然后在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。 例如在一个汇编源文件中定义了如下求和函数: EXPORT add ;声明add子程序将被外部函数调用 …… add ;求和子程序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子程序 …… } 当main()函数调用add汇编子程序时,变量a、b的值会给了r0和r1,返回结果由r0带回,并赋值给变量c。函数调用结束后,变量c的值变成3。

 4、C程序中内嵌汇编语句 在C语言中内嵌汇编语句可以实现一些高级语言不能实现或者不容易实现的功能。对于时间紧迫的功能也可以通过在C语言中内嵌汇编语句来实现。内嵌的汇编器支持大部分ARM指令和Thumb指令,但是不支持诸如直接修改PC实现跳转的底层功能,也不能直接引用C语言中的变量。 嵌入式汇编语句在形式上独立定义的函数体,其语法格式为: __asm { 指令[;指令] …… [指令] } 其中“__asm”为内嵌汇编语句的关键字,需要特别注意的是前面有两个下划线。指令之间用分号分隔,如果一条指令占据多行,除最后一行外都要使用连字符“\”。

 5、基于ARM的C语言与汇编语言混合编程举例 下面给出了一个向串口不断发送0x55的例子: 该工程的启动代码使用汇编语言编写,向串口发送数据使用C语言实现,下面是启动代码的整体框架: …… IMPORT Main AREA Init,CODE,READONLY; ENTRY …… BL Main ;跳转到Main()函数处的C/C++程序 …… END ;标识汇编程序结束 下面是使用C语言编写的主函数: #include "..\inc\config.h" //将有关硬件定义的头文件包含进来 unsigned char data; //定义全局变量 void main(void){ Target_Init(); //对目标板的硬件初始化 Delay(10); //延时 data=0x55; //给全局变量赋值 while(1) { Uart_Printf("%x",data); //向串口送数 Delay(10); } }

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

C/C++语言是一个被广泛使用的程序设计语言,它不仅具有良好的高级语言特征,而且还具有一些低级语言的特点,如:寄存器变量、位操作等。所以,C语言的程序与汇编语言程序之间能很平滑地衔接。另外,目前主要的...
  • yunhaiC
  • yunhaiC
  • 2007年01月16日 17:47
  • 2662

C语言与汇编语言混合编程

C语言与汇编语言混合编程 1、在C / C++程序中使用内嵌的汇编指令 在ARM C语言程序中,使用关键字__asm来标识一段汇编指令程序。 程序格式如下所示: __asm ;注意是两个下划线! { ...
  • zhengqijun_
  • zhengqijun_
  • 2016年12月25日 18:49
  • 770

C语言与汇编语言混合编程应遵守的规则

ARM编程中使用的C语言是标准C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境与ARM的硬件紧密相关。 在使用C语言时,要用到和汇编语言的混合编程。若汇编代码较为简...
  • akjsdhg
  • akjsdhg
  • 2014年11月24日 18:46
  • 234

浅谈汇编语言与Visual C++的混合编程

汇编语言是面向机器的语言,它与机器密切相关,具有占用存储空间小,运行速度快,可以直接控制硬件等特点;但是汇编语言程序的编写及调试烦琐,复杂,通用性不好,移植性差,程序员需要熟悉机器的内部结构之后才能编...
  • niushitang
  • niushitang
  • 2013年04月06日 19:21
  • 2328

C学习笔记(一) C语言和汇编语言的区别

C学习笔记(一) C语言和汇编语言的区别   C语言和汇编语言的区别: 汇编:效率高,对硬件的可操控性更强,体积小,不易维护,可移植性很差  C:效率比较低,硬件可操控性比较差,目标代码体积大,容易维...
  • ky_heart
  • ky_heart
  • 2016年07月11日 09:43
  • 4618

JavaBean的方法的命名必须遵循的规则

1、如果成员变量的名字为Xx,则相应的有两个用来得到成员变量值和设置变量值的方法,他们分别命名为getXx()和setXx(),即如下两种形式: public dataType getXx() p...
  • daijiguo
  • daijiguo
  • 2015年05月12日 20:17
  • 550

关于matlab与C语言的混合编程

摘要:本文着重描述了运用MATLAB命令将M文件翻译为C语言程序,并修改为可直接调用的C语言函数的方法,使用该方法所需要注意的方法局限性和MATLAB版本差异的影响。运用该方法将能够使C语言能直接使用...
  • u013845708
  • u013845708
  • 2014年06月28日 18:50
  • 2222

Lua 与 C混合编程

http://blog.csdn.net/pbymw8iwm/article/details/7894141 本文通过程序实例说明C调用lua脚本和lua调用C的方法: 先建立一个 test.c...
  • mydriverc2
  • mydriverc2
  • 2016年04月11日 15:55
  • 426

c语言和汇编语言的区别

什么是c语言:     C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语...
  • wp1995
  • wp1995
  • 2016年11月04日 17:57
  • 2558

C与汇编混合编程(1)

一个C与汇编混写的小例子
  • chen_tr
  • chen_tr
  • 2016年03月19日 23:31
  • 2419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言与汇编语言混合编程应遵守的规则
举报原因:
原因补充:

(最多只允许输入30个字)