arm9汇编语言与cc++语言的混合编程

arm9汇编语言与cc++语言的混合编程

ID:33577190

大小:462.95 KB

页数:58页

时间:2019-02-27

arm9汇编语言与cc++语言的混合编程_第1页
arm9汇编语言与cc++语言的混合编程_第2页
arm9汇编语言与cc++语言的混合编程_第3页
arm9汇编语言与cc++语言的混合编程_第4页
arm9汇编语言与cc++语言的混合编程_第5页
资源描述:

《arm9汇编语言与cc++语言的混合编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、ARM9汇编语言与C/C++语言的混合编程ARM体系结构支持ARM的汇编语言与C/C++语言的混合编程。在一个项目中,至少有一个汇编源文件或C/C++语言文件,可以有多个汇编文件或多个C/C++程序文件,或者C/C++程序文件和汇编文件两者的组合。一般地,ARM源程序文件名的后缀如表4.2所示。表4.2ARM源文件类型及扩展名文件类型扩展名汇编引入文件.INC汇编源文件.SC/C++头文件.HC语言源文件.CC++源文件.CPP硅谷芯微嵌入式学院技术贡献官方网址:www.threeway.cc一般来讲,在设计一个完整的嵌入式程序中,除了初始化部分用汇编

2、语言完成外,其大部分的编程任务一般都用C/C++完成。当需要C/C++与汇编混合编程时,可以有以下两种处理策略:■若汇编代码较短,则可在C/C++源文件中直接内嵌汇编语言实现混合编程。■若汇编代码较长,可以单独写成汇编文件,最后以汇编文件的形式加入项目中,通过ATPCS规定与C程序相互调用及访问。ATPCS,即ARM/Thumb过程调用标准(ARM/ThumbProcedureCallStandard),它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则、堆栈的使用规则、参数的传递规则等。本节讨论混合编程的相关技术,将其分为以下3

3、个方面:■内嵌汇编语言指令。■汇编与C/C++程序的变量相互访问。■汇编与C/C++程序的函数相互调用。•4.3.1内嵌汇编语言指令用C/C++程序嵌入汇编程序中可以实现一些高级语言没有的功能,提高程序执行效率。Armcc编译器的内嵌汇编器支持ARM指令集,tcc编译器的内嵌汇编器支持Thumb指令集。•4.3.1.1内嵌汇编指令的语法格式在ARM的C语言程序中可以使用关键字__asm来加入一段汇编语言的程序,格式如下:__asm{指令[;指令]/*注释*/...[指令]}其中,{}中的指令都为汇编指令,一行允许写多条汇编指令语句,指令语句之间要用分号

4、隔开。在汇编指令段中,注释语句采用C语言的注释格式。ARMC++程序中除了可以使用关键字__asm来标识一段内嵌汇编指令程序外,还可以使用关键词asm来表示一段内嵌汇编指令,格式如下:asm("指令");/*注释*/其中,asm后面的括号中必须是一条汇编指令语句,并且不能包含注释语句。•4.3.1.2内嵌汇编指令的应用举例(1)本小节通过一个例子帮助读者理解内嵌汇编指令的用法。本例介绍如何利用内嵌的汇编指令实现使能中断和禁止中断。使能和禁止中断IRQ是通过修改CPSR寄存器中的位7完成的。因为用C语言无法修改寄存器CPSR的值,所以这些操作必须借助汇编

5、语句完成。例34使能/禁止中断采用内嵌汇编指令来实现。•4.3.1.2内嵌汇编指令的应用举例(2)例34使能/禁止中断采用内嵌汇编指令来实现。voidenable_IRQ(void)//使能中断程序{inttmp;//定义临时变量,后面使用__asm//内嵌汇编程序的关键词{MRStmp,CPSR//把状态寄存器加载给tmpBICtmp,tmp,#80//将IRQ控制位清0MSRCPSR_c,tmp//加载程序状态寄存器}}voiddisable_IRQ(void)//禁止中断程序{inttmp;//定义临时变量,后面使用__asm//内嵌汇编程序的关

6、键词{MRStmp,CPSR//把状态寄存器加载给tmpORRtmp,tmp,#80//将IRQ控制位置1MSRCPSR_c,tmp//加载程序状态寄存器}}•4.3.1.3内嵌汇编注意事项(1)后缀.S文件中的汇编指令是用armasm汇编器进行汇编的,而C语言程序中的内嵌汇编指令则是用内嵌汇编器进行汇编的。这两种汇编器存在一定的差异,所以在内嵌汇编时要注意以下几点:(1)必须小心使用物理寄存器,如R0~R3、IP(R12)、LR(R14)和CPSR中的N、Z、C、V标志位。因为计算汇编代码中的C表达式时,可能使用这些物理寄存器,并会修改N、Z、C、V

7、标志位。例35实现y=x+x/y。__asm{MOVR0,x//把x的值给R0ADDy,R0,x/y//计算x/y时R0的值会被修改}•4.3.1.3内嵌汇编注意事项(2)在计算x/y时R0会被修改,从而影响R0+x/y的结果。内嵌汇编程序中允许使用变量,用变量来代替寄存器R0可以解决上述问题。__asm{MOVvar,x//把x的值给R0ADDy,var,x/y//计算x/y时R0的值会被修改}这时内嵌汇编器将会为变量var分配合适的存储单元,从而避免冲突的发生。如果内嵌汇编器不能分配合适的存储单元,它将会报告错误。•4.3.1.3内嵌汇编注意事项(

8、3)(2)不要使用寄存器代替变量。尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。