基于ARM的C语言与汇编语言混合编程

转载 2009年06月05日 14:05:00

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

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

嵌入式Linux ARM汇编(七)——C语言与ARM汇编混合编程

 转载:http://9291927.blog.51cto.com/9281927/1786072 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编。在大规模的嵌入式软件中,例如含有O...
  • qr_ljj
  • qr_ljj
  • 2016年11月08日 23:03
  • 261

ARM 汇编学习——编写简单的ARM汇编程序

首先,我们先看一个简单的汇编程序: area ff,code,readonly ;声明代码段 code32 ;声明为32位ARM指令 entry ;声明程序入口 start ;b指令...
  • zqixiao_09
  • zqixiao_09
  • 2016年02月23日 18:40
  • 4572

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

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

ARM中C和汇编混合编程及示例

参数的传递规则.      根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.      1.参数个数可变的子程序参数传...
  • Ropai
  • Ropai
  • 2013年05月20日 15:07
  • 2324

ARM汇编与C语言混合编程之汇编调用C函数

ARM汇编与C语言混合编程之汇编调用C函数 调用没有参数的函数 调用有参数的函数 总结 本文所用硬件平台为S3C2440开发板。通过一个点亮数码管的程序说明ARM汇编调用C函数的方法。 根据C...
  • zhangzhe6071
  • zhangzhe6071
  • 2016年07月22日 23:02
  • 3299

ARM:ARM汇编语言与基础汇编指令

1、为什么要学习汇编语言?     1)嵌入式硬件上电的初始化代码是用汇编代码编写;     2)调试代码时,问题的解决有可能看汇编代码;     3)系统调优(提高产品整体运行效率);   ...
  • sinat_36184075
  • sinat_36184075
  • 2017年02月19日 21:51
  • 369

ARM汇编语言学习笔记(一)---ARM汇编的程序结构

0x00 用到的书籍 《Android软件安全与逆向分析》第六章 0x01 原生程序的生成过程笔者是在Linux环境下测试的,详细过程见书中说明需要编译的C语言代码#include int mai...
  • u013736724
  • u013736724
  • 2016年11月17日 15:21
  • 1478

C与汇编混合编程(1)

一个C与汇编混写的小例子
  • chen_tr
  • chen_tr
  • 2016年03月19日 23:31
  • 2307

ARM汇编语言学习笔记

ARM处理器一共有37个寄存器 包括31个通用寄存器,包括PC,都是32位的寄存器,6个状态寄存器,也都是32位寄存器 有其中不同的模式,用户模式,快速中断模式,普通中断模式,管理模式,数据访问终...
  • a158337
  • a158337
  • 2014年09月27日 21:03
  • 2146
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于ARM的C语言与汇编语言混合编程
举报原因:
原因补充:

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