《(27)--3-5 ARM程序设计基础.ppt》由会员分享,可在线阅读,更多相关《(27)--3-5 ARM程序设计基础.ppt(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、3C H A P T E R嵌入式微处理器嵌入式微处理器3.5 ARM程序设计程序设计基础基础ARM硬件系统硬件系统裸机程序裸机程序嵌入式操作系统嵌入式操作系统汇编语言、C/C+等汇编语言、c/c+,Java,Python,c#等Keil,ADS等开发工具QT,Eclipse等集成开发环境应用程序应用程序驱动程序驱动程序GCC基于ARM的程序设计3.5 ARM程序设计程序设计基础基础nARM编程中高级语言与汇编语言的对比:n(1)高级编程语言隐藏了CPU执行指令的许多细节,因此在只关心系统所具有功能的系统中,采用高级语言编写程序更为合适。n(2)CPU执行指令的细节差异会反映在系统的非功能特性
2、上,如系统程序的规模和运行速度。因此,了解汇编语言程序设计对于嵌入式系统的设计者来说是非常必要的。3.5.1 ARM汇编汇编程序设计程序设计 AREA Word,CODE,READONLY ;name this block of codenum EQU 20 ;Set number of words to be copied ENTRY ;mark the first instruction to callstart LDR r0,=src ;r0=pointer to source block LDR r1,=dst ;r1=pointer to destination block MOV
3、r2,#num ;r2=number of words to copywordcopy LDR r3,r0,#4 ;a word from the source STR r3,r1,#4 ;store a word to the destination SUBS r2,r2,#1 ;decrement the counter BNE wordcopy ;.copy morestop MOV r0,#0 x18 ;angel_SWIreason_ReportException LDR r1,=0 x20026 ;ADP_Stopped_ApplicationExit SWI 0 x123456
4、;ARM semihosting SWI AREA BlockData,DATA,READWRITEsrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END标号指令|指示符|伪指令;注解。3.5.1 ARM汇编汇编程序设计程序设计杂项指示符ALIGN从一个字边界开始AREA指示汇编器汇编一段新的代码或数据部分CODE16指示汇编器将随后的指令作为16位Thumb指令CODE32指示汇编器将随后的指令作为32位ARM指令END表示源程序的结束ENTRY指向程
5、序的入口,一个源文件中只能有一个ENTRY*或EQU对一个常量赋予一个符号名EXPORT或GLOBAL说明了由链接器在目标和库文件中使用的符号IMPORT或EXTERN提供汇编器在当前汇编中未曾定义的符号名GET或INCLUDE包含一个文件,在GET处汇编包含的文件INCBIN包含一个未被汇编过的文件KEEP指示汇编器保留符号表中的局部符号NOFP在汇编语言程序中禁止浮点指令REQUIRE指示两段之间的依赖关系REQUIRE8指示当前文件请求堆栈为8字节对准PRESERVE8指示当前文件保持堆栈为8字节对准RN给特定的寄存器命名ROUT标记局部标号使用范围的界面3.5.2 汇编与汇编与C的混合
6、编程的混合编程n(1)内嵌汇编n在C和C语言中嵌入汇编语言可以实现一些高级语言中没有的功能。n语法_asm _(“instruction .instruction”);/Linux gcc中支持_asminstruction instruction ;/ADS,Keil中支持 asm(“instruction;instruction”);/ARM C中使用 3.5.2 汇编与汇编与C的混合编程的混合编程#includemain()inti,j,s;i=0;j=1;_asmADDs,i,j;n(1)内嵌)内嵌汇编汇编n演示实例:在uVision中创建基于LPC2138(ARM7)的裸机程序,并运
7、行。n注意观察变量的使用3.5.2 汇编与汇编与C的混合编程的混合编程n(2)C语言中调用汇编程序语言中调用汇编程序#includeexternvoidstrcopy(char*d,constchar*s);intmain()constchar*srcstr=Firststring-source;chardststr=Secondstring-destination;strcopy(dststr,srcstr);return0;AREASCopy,CODE,READONLYEXPORTstrcopystrcopy;r0pointstodestinationstring;r1pointstoso
8、urcestringLDRBr2,r1,#1;loadbyteandupdateaddressSTRBr2,r0,#1;storebyteandupdateaddress;CMPr2,#0;checkforzeroterminatorBNEstrcopy;keepgoingifnotMOVpc,lr;ReturnENDstrcpy.cex.s3.5.2 汇编与汇编与C的混合编程的混合编程根据ATPCS标准,函数前4个参数通过R0R3来传递,其它参数通过堆栈(FD)传递n将C程序编译为汇编程序及查看方法:(1)在keil中创建针对某处理器(如LPC2138)的空白项目,(2)将strcpy.c
9、和ex.s添加进去(3)如图将C编译输出选中(4)编译无错后查看strcpy.txt;12 strcopy(dststr,srcstr);000034 e1a01004 MOV r1,r4000038 e28d0004 ADD r0,sp,#400003c ebfffffe BL strcopy3.5.2 汇编与汇编与C的混合编程的混合编程n(3)汇编汇编语言调用语言调用C函数函数int g(int a,int b,int c,int d,int e)return a+b+c+d+e;汇编程序调用c程序g()计算5个整数i,2*i,3*i,4*i,5*i的和EXPORT fAREA f,COD
10、E,READONLYIMPORT g ;使用伪操作数IMPORT声明c程序g()STR lr,sp,#-4!;保存返回地址,sp=sp-4ADD r1,r0,r0 ;假设进入程序f时,r0中的值为i,r1值设为2*iADD r2,r1,r0 ;r2的值设为3*iADD r3,r1,r2 ;r3的值设为5*iSTR r3,sp,#-4!;第五个参数5*i通过数据栈传递,将r3压入堆栈ADD r3,r1,r1 ;r4值设为4*iBL g ;调用c程序g()ADD sp,sp,#4 ;调整数据栈指针,准备返回LDR pc,sp,#4 ;返回ENDex3.cex3.s3.5.2 汇编与汇编与C的混合编
11、程的混合编程n g PROCn;1 int g(int a,int b,int c,int d,int e)n000000 e52d4004 PUSH r4n;2 n000004 e1a0c000 MOV r12,r0n000008 e59d4004 LDR r4,sp,#4n;3 return a+b+c+d+e;n00000c e08c0001 ADD r0,r12,r1n000010 e0800002 ADD r0,r0,r2n000014 e0800003 ADD r0,r0,r3n000018 e0800004 ADD r0,r0,r4n00001c e49d4004 POP r4n;4 n000020 e12fff1e BX lrn ENDPn(3)汇编汇编语言调用语言调用C函数函数3.5 ARM程序设计程序设计基础基础n小结小结nARM裸机编程使用裸机编程使用Keil或或ADS等开发工具等开发工具nARM裸机编程裸机编程使用汇编或使用汇编或C/C+n汇编语言和汇编语言和C语言可以混合编程语言可以混合编程nC语言内嵌汇编语言内嵌汇编nC语言调用汇编子程序语言调用汇编子程序n汇编调用汇编调用C函数函数