ARM汇编与C语言混合编程
- 格式:ppt
- 大小:227.00 KB
- 文档页数:24


ARM中ADS环境下C语言和汇编语言混合编程及示例(转)
lpc2000系列 2009-11-18 09:50:51 阅读230 评论0 字号:大中小
稍大规模的嵌入式程序设计中,大部分的代码都是用C来编写的,主要是因为C语言具有较强的结构性,便于人的理解,并且具有大量的库支持。但对于一写硬件上的操作,很多地方还是要用到汇编语言,例如硬件系统的初始化中的CPU 状态的设定,中断的使能,主频的设定,RAM控制参数等。另外在一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依靠C编译器的生成代码,而要手工编写汇编,从而达到优化的目的。汇编语言是和CPU的指令集紧密相连的,作为涉及底层的嵌入式系统开发,熟练对应汇编语言的使用也是必须的。这里主要讨论C和汇编的混合编程,包括相互之间的函数调用。下面分四种情况来进行讨论,不涉及C++语言。
一、在C语言中内嵌汇编
在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过使用与单纯的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面:
a 不能直接向PC 寄存器赋值,程序跳转要使用B或者BL指令;
b 在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突;
c R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能把R0-R3、R12及R14用于子程序调用,因此避免直接使用这些物理寄存器;
d 一般不要直接指定物理寄存器;
e 让编译器进行分配内嵌汇编使用的标记是__asm或asm关键字,用法如下:__asm{instruction [; instruction]}或
asm(instruction
[; instruction])。
下面是一个例子来说明如何在C中内嵌汇编语言
C语言文件.c procatlaw
#include stdio.h
龙源期刊网
C语言和汇编语言混合编程方法
作者:庞新法
来源:《价值工程》2014年第24期
摘要: C语言是一种高级的面向过程的开发语言,汇编语言是一种低级的面向机器的编程语言。两者在程序设计开发方面各有优劣,目前两者的混合编程得到了广泛的应用。本文通过具体的实例,说明了混合编程的基本方法,为C语言应用开发人员提供方便。
关键词: C 语言;汇编语言;混合编程
中图分类号:TP313 文献标识码:A 文章编号:1006-4311(2014)24-0231-02
0 引言
汇编语言是一种面向机器的语言,其优点是运行速度快,占用存储空间小,可直接对硬件进行控制。缺点是编写、调试困难、移植性差。C语言简洁、灵活、库函数丰富、调试方便、移植性好,目前已被广泛地应用于系统软件和应用软件的开发中,为了发挥各自优势,取长补短,采用混合编程。大部分程序,如界面、人机接口(外壳程序)、数据处理等用C语言编写,以提高程序的开发效率。而某些程序,如需要缩短程序的运行时间,或需要对硬件进行直接操作,或需要利用操作系统的某些功能模块,或频繁使用的程序、或需要占用内存空间少的程序(内核程序),则用汇编编写,以提高程序的运行效率。
1 嵌入式汇编
嵌入式汇编也称行内汇编,源程序中直接插入汇编语句。汇编语句可直接访问C程序中定义的常量、变量、函数。不必考虑二者之间的接口,方便编程。
1.1 嵌入式汇编语句的格式
格式:asm操作码 操作数[;或换行]
其中:操作数可以是汇编语句中的立即数、寄存器、表达式等还可以是C中的常量、变量、标号等。分号;是汇编语句结束符,并非注解,要用注解,用C的注解。如下例
所示。
1.2 汇编语句访问C的数据
keil C语言与汇编语言混合编程
1. C语言中嵌入汇编
1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma ASM
; Assembler Code Here
#pragma ENDASM
2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”
和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;
3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;
4、编译,即可生成目标代码。
来个实例吧:
#include
void main(void)
{
P2=1;
#pragma asm
MOV R7,#10
DEL:MOV R6,#20
DJNZ R6,$
DJNZ R7,DEL
#pragma endasm
P2=0;
}
2 . 无参数传递的函数调用
C51调用汇编函数
1.无参数传递的函数调用
先来个例子:其中example.c和example.a51为项目中的两个文件
***********************example.c***********************************************
extern void delay100();
main()
{delay100;}
***********************example.a51***********************************************
?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段
Program Design・程序设计 ARM汇编语言与c/c++语言混合编程实现方法
在计算机系统嵌入式应用程 序的开发中,对于;F-编语言与C/ c++语言的设计开发,二者都存在 着优缺点,所以相关人员在开发 中会采用ARM汇编语言与C/C++ 语言混合编程,从而取得最大的 效果。本文主要研究了ARM汇编 语言与C/C++语言混合编程的设 计实现方法,并进行相关的讨论。
【关键词】ARM汇编语言C/c++语言混合编程
在计算机系统的嵌入式应用程序中,所有 汇编任务都由汇编语言来完成,这样虽然完成 任务的效率很高,但是工作量却非常大,会影 响到对于应用程序的维护。若是所有的程序都 是由C/C++语言进行编程,虽然执行过程比 文/周晓燕 较的简单,但是这种方式却导致了目标代码的 执行任务效率低,实时性很差。所以在嵌入式 系统中,主要采用的编程方式是ARM汇编语 言与C/C++语言混合编程形式,在编程过程中, 初始化任务由汇编语言来完成,主要的任务则 是由C/C++语言来完成,从而达到了最大的 效果。 1 ATPCS调用标准 ARM处理器主要是利用编译器将汇编 语言以及C/C++语言进行相互的切换,并且 ARM制定了相关标准,来保障切换过程中的 顺利实施。 1.1寄存器使用规则 ATFCS为ARM寄存器进行不同命名, 从而在编程的过程中来利用ATPCS寄存器进 行编程。如表1所示。 1.2堆栈的使用规则 在ATPCS中规定,堆栈的主要类型是 FD,被称为满递减堆栈,所以必须要利用 STMFD/LDMFF进行堆栈的操作。 1.3参数传递规则 参数传递的规则不一样,利用参数的数 量可以将子程序分为参数数量固定,以及参数 数量不固定的子程序,对于参数变化的子程序, 若参数的数量少于四个,那么要利用寄存器来 进行参数的传递,若参数的数量多余四个,那 么必须要利用堆栈来进行参数的传递,所以参 数之间传递的规则不同。 2 ATPCS应用 2.1汇编语言调用C语言 在对计算机嵌入式程序的开发中,前期 由汇编语言进行初始化的编程,然后在进行C 语言之间的切换,对于C语言的切换,主要