ARM汇编语言的语法知识PPT_第1页
ARM汇编语言的语法知识PPT_第2页
ARM汇编语言的语法知识PPT_第3页
ARM汇编语言的语法知识PPT_第4页
ARM汇编语言的语法知识PPT_第5页
已阅读5页,还剩110页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM汇编语言的语法知识,1,ARM汇编语言语句格式,ARM汇编语言的语句格式:symbolinstruction|directive|pseudo-instructioncomment,其中:instruction为指令。在ARM汇编语言中,指令不能从一行的行头开始.在一行语句中,指令的前面必须有空格或符号.directive为伪操作。pseudo-instruction为伪指令。symbol为符号。在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格,在指令和伪指令中符号用作地址标号,在有些伪操作中,符号用作变量或者常量.comment为语句的注释.在ARM汇编语言中注释以分号”;”开头.注释的结尾即为一行的结尾,注释也可以单独占用一行.,2,5.1.ARM汇编语言的伪操作、宏指令和伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成.伪操作是ARM汇编语言程序里的一些特殊指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行.也就是说,这些伪操作只在汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之结束.,3,5.1.ARM汇编语言的伪操作、宏指令和伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成.宏指令是一段独立的程序代码,可插在源程序中,它通过伪操作来定义.宏在被使用前必须提前定义好,宏之间可互相调用,也可自己递归调用.通过直接书写宏名来使用宏,并根据宏指令的格式设置相应的输入参数.这与C语言中子函数形参与实参的传递很相似.,4,5.1.ARM汇编语言的伪操作、宏指令和伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成.伪指令也是ARM汇编语言程序里的一些特殊指令助记符,它们不是真正的ARM指令或Thumb指令,也不在计算机运行期间由机器执行,而是在源程序进行汇编时被替换成相应的ARM指令或Thumb指令序列,从而实现真正的指令操作.,5,5.1.ARM汇编语言的伪操作、宏指令和伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成.伪操作和宏指令一般与编译程序有关,在不同的编译环境下有不同的编写形式和语法规则.常见的ARM编译开发环境有2种:ARM公司开发的ADS/SDTIDE开发环境集成了GNU开发工具的IDE开发环境,6,ARM汇编语言伪指令,ARM伪指令,ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令将被等效的ARM指令代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。,7,ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,ADRcondregister,expr,ADR伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式expr的取值范围:当地址值不是字对齐时,其取值范围为-255255字节;当地址值是字对齐时,其取值范围为-10201020字节;当地址值是16字节对齐时,其取值范围将更大;该地址必须与ADR伪指令在同一个代码段中。,8,ARM伪指令中等范围的地址读取,ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,ADRLcondregister,expr,ADRL伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式expr的取值范围:当地址值不是字对齐时,其取值范围为-64K64K;当地址值是字对齐时,其取值范围为-256K256K;当地址值是16字节对齐时,其取值范围将更大;该地址必须与ADRL伪指令在同一个代码段中。,9,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池(即数据缓冲区),并使用一条基于PC相对偏移的LDR指令从文字池读出该常量。,LDRcondregister,=expr,LDR伪指令格式,指令执行的条件码,加载的目标寄存器,基于PC的地址表达式或外部表达式,10,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。,应用示例(源程序):,.LDRR1,=InitStack.InitStackMOVR0,LR.,使用伪指令将程序标号InitStack的地址存入R1,11,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。,应用示例(源程序):,编译后的反汇编代码:,.LDRR1,=InitStack.InitStackMOVR0,LR.,.0 x60LDRR1,0 xb4.0 x84MOVR0,LR.0 xb4DCD0 x84,使用伪指令将程序标号InitStack的地址存入R1,地址,程序代码,12,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。,应用示例(源程序):,编译后的反汇编代码:,.LDRR1,=InitStack.InitStackMOVR0,LR.,.0 x60LDRR1,0 xb4.0 x84MOVR0,LR.0 xb4DCD0 x84,使用伪指令将程序标号InitStack的地址存入R1,LDR伪指令被汇编成一条LDR指令,并在文字池中定义了一个常量,该常量为InitStack标号的地址,13,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。,注意:1.从指令位置到文字池的偏移量必须小于4KB;2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。,14,ARM伪指令空操作伪指令,NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOVR0,R0”指令等。NOP可用于延时操作。,NOP,NOP伪指令格式,应用示例(延时子程序):,DelayNOP;空操作NOPNOPSUBSR1,R1,#1;循环次数减一BNEDelay;如果循环没有结束,跳转Delay继续MOVPC,LR;子程序返回,15,ADS编译环境下的ARM伪操作和宏指令,ADS编译环境下的伪操作有如下几种:1、符号定义伪操作4、框架描述伪操作2、数据定义伪操作、信息报告伪操作3、汇编控制伪操作、其他伪操作,16,ARM汇编语言伪操作-符号定义伪操作,全局变量声明,GBLA声明一个全局算术变量,并将其初始化为0GBLL声明一个全局逻辑变量,并将其初始化为FALSEGBLS声明一个全局字符串,并将其初始化为NULL,使用示例:,GBLAnum1GBLLlogic_xGBLSstring_y,符号定义伪操作用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存器名称,17,ARM汇编语言伪指令-符号定义伪操作,局部变量声明,LCLA声明一个局部算术变量,并将其初始化为0LCLL声明一个局部逻辑变量,并将其初始化为FALSELCLS声明一个局部字符串,并将其初始化为NULL,使用示例:,LCLAnum1LCLLlogic_xLCLSstring_y,注意:局部变量只能在宏中进行声明和使用.,18,ARM汇编语言伪指令-符号定义伪操作,变量赋值,SETA给一个全局或局部算术变量赋值SETL给一个全局或局部逻辑变量赋值SETS给一个全局或局部字符串变量赋值,使用示例:,num1SETA0 xfflogic_xSETLTRUEstring_ySETS“stringtest”,注意:在向变量赋值前,必须先声明该变量,19,ARM汇编语言伪指令-符号定义伪操作,RLIST,为通用寄存器列表定义名称,定义的名称可以在LDM/STM指令中使用.列表中的寄存器以逗号分隔,连续编号的寄存器可以用”-”包括,例如:R7-R9表示寄存器R7、R8、R9,使用示例:,Reg_listRLISTR0-R4,R6,R7-R9STMFDSP!Reg_list;将R0-R4,R6,R7-R9的内;容压入满降序栈中保存,20,ARM汇编语言伪指令-符号定义伪操作,RN,为寄存器定义名称,使用示例:,SPRNR13;将R13的名称定义为SP,21,ARM汇编语言伪指令-符号定义伪操作,CN、CP,CN为协处理器的寄存器定义名称CP为协处理器定义名称,使用示例:,powerCN6;将协处理器寄存器6的名称定义为powerdmuCP6;将协处理器6的名称定义为dmu,22,ARM汇编语言伪指令-符号定义伪操作,DN、SN、FN,DN为一个双精度的VFP寄存器定义名称SN为一个单精度的VFP寄存器定义名称FN为一个FPA浮点寄存器定义名称,使用示例:,heightDN6;将VFP双精度寄存器6名称定义为heightwidthSN16;将VFP单精度寄存器16名称定义为widthlowerFN6;将浮点寄存器6名称定义为lower,23,ARM汇编语言伪指令-数据定义伪操作,LTORG伪操作用于数据缓冲池(也称为文字池)的开始在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池,LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将数据池中的数据当做指令来执行,用LTORG伪指令定义数据缓冲池举例Funel;子程序LDRR1,=0 x8000;将0 x8000加载到R1MOVPC,LRLTORG;定义数据缓冲池,存放0 x8000DataSPACE40;从当前位置开始分配40字节的内存;单元,并初始化为0,24,ARM汇编语言伪指令-数据定义伪操作,MAP,MAP用于定义一个结构化的内存表的首地址此时,内存表的位置计数器设置成该地址值.该伪操作可以用”代替.,MAP伪操作举例MAPfun;fun就是内存表的首地址MAP0 x100,R9;内存表的首地址为R90 x100,25,ARM汇编语言伪指令-数据定义伪操作,FIELD,FIELD用于定义一个结构化内存表中的数据域MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构MAP伪操作定义内存表的首地址,FIELD伪操作定义内存表中各数据域的字节长度,并可为每一个数据域指定一个标号,其他指令可引用该标号该伪操作可以用”#”代替.,题目:定义一个内存表,其首地址为固定地址8192,该内存表中包含个数据域:consta长度为4字节,constb长度为4字节,x长度为8字节,y长度为8字节,string长度为16字节,26,MAP8192constaFIELD4constbFIELD4xFIELD8yFIELD8stringFIELD16,27,ARM汇编语言伪指令-数据定义伪操作,SPACE,SPACE伪操作常常用来分配一块连续的内存区域供程序使用,并且将这个内存区域初始化为0,该伪操作可以用”%”代替.,使用示例:,dataroomSPACE256;以dataroom为起始地址,分配256;字节的内存单元,并初始化为0,28,ARM汇编语言伪指令-数据定义伪操作,DCB,DCB用于定义并初始化1字节或多字节的内存区域.该伪操作可以用”=”代替.,使用示例:,data1DCB1,3,5stringDCB“hello!”,();构造一个以NULL结尾的字符串,字;符串的起始地址为string,29,ARM汇编语言伪指令-数据定义伪指令,DCD、DCDU,DCD和DCDU用于定义并初始化一个或多个字的内存区域,其中DCD可以用”其中0,2,4,6按字存储data2DCDU1,3,5,30,ARM汇编语言伪指令-数据定义伪操作,DCDO,DCDO用于定义并初始化一个或多个字的内存区域,且保证分配的内存单元是字对齐的.labelDCDOexpr,exprDCDO与DCD的区别在于DCDO将字单元初始化为expr相对于静态基址寄存器R9(SB)的偏移量.,使用示例:,IMPORTexternlabeldata1DCDOexternlabel;将地址为data1的字单元初;始化为标号externlabel相对于R9的偏移量,31,ARM汇编语言伪指令-数据定义伪操作,DCFD,DCFDU,DCFS,DCFSU,DCFD用于为双精度的浮点数分配字对齐的内存单元,每个双精度浮点数占据两个字单元.DCFDU与DCFD的不同之处在于DCFDU分配的内存单元不能保证是严格对齐的.DCFS用于为单精度的浮点数分配字对齐的内存单元,每个单精度浮点数占据1个字单元.DCFSU与DCFS的不同之处在于DCFSU分配的内存单元不能保证是严格字对齐的.,32,ARM汇编语言伪指令-数据定义伪操作,DCI,DCI用于分配并初始化一段内存单元,且认为内存单元中的数值为指令数据当DCI位于ARM代码中的时候,分配的内存是严格字对齐的,当DCI位于Thumb代码中的时候,分配的内存是半字对齐的注意:DCI伪操作和DCD伪操作非常类似,不同之处在于,DCI分配的内存中数据被标识为指令,可用于通过宏指令来定义处理器指令系统不支持的指令,33,ARM汇编语言伪指令-数据定义伪操作,DCQ,DCQU,DCQ用于分配一段以双字(字节)为单位的内存,分配的内存要求必须字对齐,并用伪操作中的64位的整数数据初始化DCQU与DCQ的不同之处在于,DCQU分配的内存单元并不严格字对齐,34,ARM汇编语言伪指令-数据定义伪操作,DCW,DCWU,DCW用于分配一段半字对齐的半字内存单元,并用伪操作中的expr初始化DCWU与DCW的不同之处在于,DCWU分配的内存单元并不严格半字对齐,35,ARM汇编语言伪指令-汇编控制伪操作,IF、ELSE、ENDIF,IF,ELSE及ENDIF伪操作能够根据条件把一段源代码包括在汇编语言程序内,或者将其排除在程序之外它与语言中的if语句的功能很相似语法格式如下:IFconditionInstructionorderectivesELSEInstructionorderectivesENDIF注意:condition表示控制条件,可以是逻辑表达式或标识符Instructionorderectives表示一组语句,可以是代码指令或伪指令注意:IF,ELSE及ENDIF可以嵌套使用,36,ARM汇编语言伪指令-汇编控制伪操作,WHILE及WEND,WHILE及WEND伪操作能够根据条件重复汇编相同的一段源代码,它与语言中的while语句很相似只要满足条件,就将重复汇编语法格式中的指令或伪指令注意:WHILE及WEND可以嵌套使用,37,ARM汇编语言伪指令-汇编控制伪操作,MACRO、MEND及MEXIT,MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束MEXIT用于从宏中跳转出去用MACRO和MEND定义的一段代码,称为宏定义体,这样在程序中就可通过宏名多次调用该代码段来完成相应的功能,38,MACRO$labelmacroname$parameter;宏代码MEND,39,局部变量定义举例MACRO;声明一个宏$labelmessage$a;宏的原型,宏的名称为;message,有一个参数$aLCLSstring;声明一个局部串变量stringStringSETS“error”;向该变量赋值$label;代码INFO0,”string”:CC:STR:$a;使用该串变量MEND;宏定义结束,40,ARM汇编语言伪指令-信息报告伪操作,信息报告伪操作用于汇编报告指示,ASSERT,ASSERT为断言错误伪操作,在汇编编译器对汇编程序的第遍扫描中,如果ASSERT中的条件不成立,则ASSERT伪操作将报告该错误信息ASSERT伪操作用于保证源程序被汇编时满足相关的条件如果条件不满足,则ASSERT伪操作报告错误类型,并终止汇编,41,ARM汇编语言伪指令-信息报告伪操作,INFO,汇编诊断信息显示伪操作在汇编处理过程的第遍扫描或者第遍扫描时,INFO伪操作报告诊断信息INFO伪操作用于显示用户自定义的错误信息INFO数字表达式,字符串表达式(即诊断信息)若数字表达式=0,第遍扫描时,打印字符串.若数字表达式0,第1遍扫描时,打印字符串,终止汇编.,OPT,设置列表选项伪操作,通过OPT伪操作可在源程序中设置列表选项,42,ARM汇编语言伪指令-信息报告伪操作,TTL及SUBT,TTL伪操作在列表文件每一页的开头插入一个标题该TTL伪操作将作用于其后的每一页,直到遇到新的TTL伪操作SUBT伪操作在列表文件每一页的开头插入一个子标题,该SUBT伪操作将作用于其后的每一页,直到遇到新的SUBT伪操作TTL伪操作在列表文件的页顶部显示一个标题SUBT伪操作在列表文件页标题的下面显示一个子标题如果要在列表文件的第一页显示标题或子标题,TTL伪操作或SUBT伪操作要放在源程序的第行当使用TTL或SUBT伪操作改变页标题时,新的标题将在下一页开始起作用,TTLTitle;在列表文件的第一页及后面的各页显示标题SUBTSubtitle;在列表文件的第一页及后面的各页显示;子标题,43,ARM汇编语言伪指令-其他伪操作,CODE16及CODE32,CODE16伪操作告诉汇编编译器后面的指令序列为16位的Thumb指令;CODE32伪操作告诉汇编编译器后面的指令序列为32位的ARM指令注意:只是告诉编译器后面指令的类型,该伪操作本身并不进行程序状态的切换,44,ARM汇编语言伪指令-其他伪操作,EQU,为数字常量或标号定义一个字符名称,该伪指令可以用”*”代替.,使用示例:,numEQU2;数字常量num的值为2label_aEQU0 x20;表示标号label_a的地址为0 x20,45,ARM汇编语言伪指令-其他伪操作,AREA,用于定义一个代码段或数据段,一个汇编程序至少包含一个代码段,使用示例:,AREAExample,CODE,READONLY定义了一个代码段,代码段的名称为Example,属性为READONLY,46,ARM汇编语言伪指令-其他伪操作,ENTRY,用于指定程序的入口点一个程序可含多个源文件,而一个源文件中最多只能有一个ENTRY(也可以没有),所以一个程序可有多个ENTRY,但至少要有一个ENTRY,END,END伪操作告诉编译器已经到了源程序结尾每一个汇编源程序都包含END伪操作,表示本源程序的结束,47,ARM汇编语言伪指令-其他伪操作,ALIGN,ALIGN伪操作通过添加补丁字节使当前位置满足一定的对齐方式.,ALIGNexpr,offset,为指定对齐方式,可能的取值为的次幂,如1,2,4,8如果没有指定,则默认当前位置对齐到下一个字边界处,不指定表示将当前位置对齐到以expr为单位的起始位置,48,ARM汇编语言伪指令-其他伪操作,ALIGN,ALIGN伪操作通过添加补丁字节使当前位置满足一定的对齐方式.,例如:ALIGN8表示将当前位置以个字的方式对齐,ALIGN4,3当原始位置在0 x0001(字节),使用ALIGN4,3以后,当前位置会转到0 x0007(0 x0004+3),49,ARM汇编语言伪指令-其他伪操作,EXPORT及GLOBAL,EXPORT声明一个符号可被其他文件引用,相当于声明了一个全局变量GLOBAL是EXPORT的同义词,注意:声明的符号名称是区分大小写的,50,ARM汇编语言伪指令-其他伪操作,IMPORT,IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中,IMPORTsymbolWEAK,指定这个选项后,如果symbol在所有源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号,Symbol为声明的符号名称,它是区分大小写的,51,ARM汇编语言伪指令-其他伪操作,EXTERN,EXTERN伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,与IMPORT不同之处在于,如果本源文件没有实际引用该符号,该符号将不会被加入到本源文件的符号表中,EXTERNsymbolWEAK,指定这个选项后,如果symbol在所有源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号,Symbol为声明的符号名称,它是区分大小写的,52,ARM汇编语言伪指令-其他伪操作,GET及INCLUDE,GET伪操作将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理,INCLUDE是同义GETfilename;其中filename为被包含的源文件的名称,;这里可使用路径信息,53,ARM汇编语言伪指令-其他伪操作,INCBIN,INCBIN伪操作将一个文件包含到当前源文件中,被包含的文件不进行汇编处理通常可使用INCBIN将一个可执行文件或者任意的数据包含到当前文件中被包含的执行文件或数据将被原封不动地放到当前文件中,编译器从INCBIN伪操作后面开始继续处理INCBINfilename;其中filename为被包含的文件名;称,这里可使用路径信息,INCBINfile1.datINCBINc:windowsfile2.txt注意:这里所包含的文件名称及其路径信息中都不能有空格,54,ARM汇编语言伪指令-其他伪操作,KEEP,KEEP伪操作告诉编译器将局部符号包含在目标文件中符号表中可使调试工作更加方便语法格式如下:KEEPsymbol;其中symbol为要保留的局部标号,如果没有指定symbol,则除了基于寄存器外的所有符号将被包含在目标文件的符号表中,labelCMPR0,R1KEEPlabel;将标号label包含到目标文件;的符号表中,55,ARM汇编语言伪指令-其他伪操作,NOFP,使用NOFP伪操作禁止源程序中包含浮点运算指令当系统中没有硬件或软件仿真代码支持浮点运算指令时,使用NOFP伪操作禁止在源程序中使用浮点运算指令这时如果源程序中包含浮点运算指令,或者在浮点运算指令的后面使用NOFP伪操作,编译器将会报告错误,56,ARM汇编语言伪指令-其他伪操作,REQUIRE,REQUIRE伪操作用于指定段之间的相互依赖关系格式如下:REQUIRElabel;其中label为所需要的标号的名称当进行连接处理包含有“REQUIRElabel”伪操作的源文件时,定义label的源文件也将被包含,57,ARM汇编语言伪指令-其他伪操作,REQUIRE8及PRESERVE8,REQUIRE8伪操作指示当前代码中要求数据栈字节对齐PRESERVE8伪操作表示当前代码中数据栈是字节对齐的使用说明:LDRD及STRD指令要求内存单元地址是字节对齐的当在程序中使用这些指令在数据栈中传送数据时,要求该数据栈是字节对齐的,这时就需要用REQUIRE8伪操作来说明链接器要保证要求字节对齐的数据栈代码只能被数据栈是字节对齐的代码调用,58,ARM汇编语言伪指令-其他伪操作,ROUT,ROUT伪操作用于定义局部变量的有效范围语法格式如下:nameROUT;其中name为所定义的作用范围的名称使用说明:当没有使用ROUT伪操作定义局部变量的作用范围时,局部变量的作用范围为其所在的段ROUT伪操作作用的范围为本ROUT伪操作和下一个ROUT(指同一个段中ROUT伪操作)伪操作之间若只有一个ROUT,则局部标号的作用范围在ROUT与段结束伪操作(END)之间,59,ARM汇编语言伪指令-其他伪操作,ROUT,ROUT伪操作举例,RoutineROUT;定义局部标号的有效范围,名称为routine.1routine;routine范围内的局部标号.BEQ%2routine;若条件成立,则跳转到routine范围内的局部标号2.BGE%1routine;若条件成立,则跳转到routine范围内的局部标号1.2routine.;routine范围内的局部标号2.otherroutineROUT;定义新的局部标号的有效范围,60,GNU编译环境下的ARM伪操作与宏指令,针对上述所讲的ARM伪操作,对应地给出了常用的GNU编译环境下的伪操作1、常量编译控制伪操作2、字符编译控制伪操作3、汇编程序代码控制伪操作4、宏编译控制伪操作5、条件编译控制伪操作6、反汇编代码控制伪操作7、其他常用伪操作,61,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.byte,.byte伪操作用于分配一段字节内存单元(分配的内存都是字节对齐的),并用伪指令中的expr初始化,语法格式如下:byteexpr,expr.其中expr可以为数字表达式或程序中的标号byte21,48,89,0 x13,oxFF,62,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.hword及.short,.hword及.short都是作用于分配一段半字内存单元(分配的内存都是半字对齐的),并用伪指令中的expr初始化,语法格式如下:hwordexpr,expr.其中expr可以为数字表达式或程序中的标号hword21,48,89,0 x1133,ox77FF,63,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.word、.long及.int,.word、.long及.int伪操作用于分配一段字内存单元(分配的内存都是字对齐的),并用伪指令中的expr初始化,语法格式如下:wordexpr,expr.其中expr可以为数字表达式或程序中的标号word21,0 x110033,ox77FF2255.int17,0 x77889933.long1,2,3,4,5,6,7,8,64,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.ascii,.ascii伪指令用于定义字符串expr(非0结束符),语法格式如下:asciiexpr,expr.ascii“Howareyou”/*定义字符串,不是以“0”结束*/,.asciz及.string,.asciz和.string伪指令都是用于定义字符串expr(以“/0”结束),.ascizexpr,expr.asciz“amastudent”/*定义字符串,以“0”结束*/,65,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.float及.single,.float和.single伪操作用于定义32位IEEE浮点数expr,语法格式如下:floatexpr,expr.float0F3.14,0F359.2E11,.double,.double伪操作用于定义64位IEEE浮点数expr.,.doubleexpr,expr.double0F2E1,66,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.fill,.fill伪指令用于分配一段字节内存单元,语法格式如下:fillrepeat,size(,value)其中size缺省为,value缺省为fill8,4,0 xFFFFFFFF分配个字节的内存单元,并将每个内存单元内容初始化为0 xFFFFFFFF,67,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.zero,.zero伪操作用于分配一段字节内存单元并用来填充内存,语法格式如下:zerosizefill400分配400字节的内存单元,并用0初始化,68,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.space及.skip,.space与.skip伪操作用于分配一段内存单元用value将内存单元初始化若value缺省,则用0初始化内存单元,,语法格式如下:spacesize,valueskipsize,value举例.space100XFF/*分配10字节的内存单元,并用0XFF初始化*/.skip22/*分配22字节的内存单元,并用0初始化*/,69,GNU编译环境下的ARM伪指令-字符编译控制伪操作,.equ及.set,.equ和.set伪操作用于为数字常量,基于寄存器的值和程序中的标号定义一个字符名称,语法格式如下:.equsymbol,expr.setsymbol,expr其中:expr为基于寄存器的地址值、程序中的标号,32位的地址常量或者32位的常量,symbol为.equ伪指令作为expr定义的字符名称,equPLLCON,0 x01D80000/*对PLL控制器设置*/equCLKCON,0 x01d80004/*对时钟控制器设置*/,70,GNU编译环境下的ARM伪指令-字符编译控制伪操作,.global及.globl,.global和.globl声明一个符号可被其他文件引用,相当于声明了一个全局变量,语法格式如下:globalsymbol其中:symbol为声明的符号名称,它是区分大小写的,.extern,.extern伪操作用于声明一个符号可被其他文件引用,相当于声明了一个全局变量,71,GNU编译环境下的ARM伪指令-汇编程序代码控制伪操作,.section,.section伪操作用于定义域中包含的段段可以是.text(只读代码区),.data(可读写数据区)及.bss(为静态和全局变量保留的可读写的数据区),语法格式如下:.sectionexpr.section.bss,72,GNU编译环境下的ARM伪指令-汇编程序代码控制伪操作,.text、.data及.bss,.text伪操作将操作符开始的代码编译到代码段或代码段子段.data伪操作将操作符开始的数据编译到数据段或数据段子段.bss伪操作用于将变量存放到.bss段或.bss段的子段,举例:.datasrc:.long1,2,3,4,5,6,7,8,9,0/*定义了一个数据区,以src为起始地址*/dst:.long0,0,0,0,0,0,0,0,0,0/*定义了一个数据区,以dst为起始地址*/,73,GNU编译环境下的ARM伪指令-汇编程序代码控制伪操作,.code16|32,.code伪操作用于选择当前汇编指令的指令集参数16选择Thumb指令集,参数32选择ARM指令集,举例:.code32/*表明下面是ARM指令*/header:ADRR0,start+1BXR0.code16/*表明下面是Thumb指令*/start:MOVR0,#10MOVR1,#3BLdoadd,74,GNU编译环境下的ARM伪指令-汇编程序代码控制伪操作,.end,标记汇编文件的结束行,即标号后的代码不处理,.include,用于将一个源文件包含到当前源文件中,一般是将该源文件用到的库文件包含到本源文件中,.include“option.a”.include“44b0.h”,75,GNU编译环境下的ARM伪指令-汇编程序代码控制伪操作,.align及.balign,.align和.balign伪操作用于表示对齐方式,通过添加填充字节使当前位置满足一定的对齐方式,语法格式如下:.alignalignment,fill,max其中:alignment用于指定对齐方式,可能的取值为的次幂,缺省为fill是填充内容,缺省时用填充max是填充字节数最大值,如果填充字节超过max,就不进行对齐,76,GNU编译环境下的ARM伪指令-宏编译控制伪操作,.macro及.endm,.macro伪操作标识宏定义的开始,.endm标识宏定义的结束,用.macro和.endm定义一段代码,称为宏定义体,这样在程序中就可通过宏指令多次调用该代码段,语法格式如下:.macromacronameparameter,parameter./*代码段*/.endm其中:macroname为所定义的宏的名称parameter为宏指令的参数,宏参数的定义可使用逗号分隔,.exitm,用于提前退出宏,77,GNU编译环境下的ARM伪指令-条件编译控制伪操作,.ifdef、.else及.endif,.ifdef、.else及.endif伪操作是汇编控制伪操作,当满足某条件时,对一组语句进行编译,当条件不满足时,则编译另一组语句,其中else可以缺省,语法格式如下:.ifdefconditionInstructionorderectives.else.endif注意:condition表示控制条件,可以是逻辑表达式或标识符Instructionorderectives表示一组语句,可以是代码指令或伪指令,78,GNU编译环境下的ARM伪指令-反汇编代码控制伪操作,.eject用于在汇编符号列表文件中插入一分页符.list用于产生汇编列表(从.list到.nolist).nolist伪操作用于表示汇编列表结束处.title语法格式为.title“heading”即使用“heading”作为标题(位于汇编列表文件中文件名的下一行).sbttl语法格式为.sbttl“heading”即使用“heading”作为子标题(位于.title标题的下一行),79,GNU编译环境下的ARM伪指令-其他常用伪操作,.ltorg,.ltorg伪操作用于在当前段(一般是.text段)的当前地址(字对齐地址)产生一个文字池.ltorg一般放在跳转指令的后面.,语法格式如下:.ltorg使用示例:#exitfromDRAM/SDRAMselfrefreshmodeLDRR0,=REFRESHSTRR3,R0MOVPC,LR.ltorg,80,GNU编译环境下的ARM伪指令-其他常用伪操作,.req,.req伪操作为一个特定的寄存器定义名称,以方便程序员记忆该寄存器的功能.,语法格式如下:.reqname,expr其中expr为某个寄存器的编码,name为本伪指令给寄存器定义的名称.使用示例:.reqCOUNT,7/*定义寄存器7为COUNT*/,81,GNU编译环境下的ARM伪指令-其他常用伪操作,.err,.err伪操作用于使编译时产生错误报告.,.print,.print伪操作用于打印信息到标准输出.,例如:.print“Somethingisbroken”,.fail,格式为.failexpr.fail伪操作用于汇编文件时产生警告.当expr小于500时产生错误信息,否则产生警告.,82,ARM汇编程序实例,注意:ADS编译环境下的汇编代码与GNU编译环境下(EmbestIDE内部集成GNU的开发工具)有较多不同点,主要是符号及伪操作的不同.,注释行以/*/代替”;”操作数及运算符号替换伪操作符替换,操作数及运算符替换如下所示,83,伪操作数替换如下所示,84,伪操作数替换如下所示,85,5.2ARM汇编语言语句格式,ARM汇编中的文件格式:,ARM源程序文件可由任意一种文件编辑器来编写程序代码,它一般为文件格式。在ARM程序设计中,常用的源文件可简单分为以下几种,不同种类的文件有不同的后缀名。,86,5.2ARM汇编语言语句格式,ARM汇编语言语句格式:,symbolinstruction|directive|pseudo-instruction;comment,为符号。在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格,在指令和伪指令中符号用作地址标号,在有些伪操作中,符号用作变量或者常量.,为指令。在ARM汇编语言中,指令不能从一行的行头开始.在一行语句中,指令的前面必须有空格或符号.,为伪操作,伪指令,为语句的注释.在ARM汇编语言中注释以分号”;”开头.注释的结尾即为一行的结尾,注释也可以单独占用一行.,87,5.2ARM汇编语言语句格式,ARM汇编语言的语句格式:注意:在ARM汇编语言中,各个指令、伪指令及伪操作的助记符可全部用大写字母,也可全部用小写字母,但不能在一个助记符中既有大写字母又有小写字母.源程序中,在语句之间适当地插入空行,可提高源代码的可读性.如果一条语句很长,为了提高可读性,可使用”将该长语句分成若干行来写,在”之后不能再有其他字符,包括空格和制表符.,88,5.2ARM汇编语言语句格式,ARM汇编语言中的符号,在ARM汇编语言中,符号可代表地址,变量和数字常量.当符号代表地址时又称为标号.符号包括变量,数字常量,标号和局部标号.符号的命名规则如下:,符号由大小写字母,数字以及下划线组成.局部标号以数字开头,其他符号都不能以数字开头.符号是区分大小写的符号在其作用范围内必须惟一,即在其作用范围内不可有同名的符号程序中的符号不能与系统内部变量或者系统预定义的符号同名.程序中的符号通常不要与指令助记符或者伪操作同名.,89,5.2ARM汇编语言语句格式,ARM汇编语言中的符号-变量,在ARM汇编语言中,变量有数字变量、逻辑变量和串变量3种类型.变量的类型在程序中是不能改变的.数字变量的取值范围为数字常量和数字表达式所能表示的数值范围逻辑变量的取值为true和false.串变量的取值范围为串表达式可表示的范围.,说明:在ARM汇编语言中,使用GBLA、GBLL、GBLS伪操作声明全局变量,使用LCLA、LCLL、LCLS伪操作声明局部变量,使用SETA,SETL,SETS伪操作为这些变量赋值.,90,5.2ARM汇编语言语句格式,ARM汇编语言中的符号-数字常量,数字常量一般有3种表达方式:十进制数,如43,6,112等十六进制数,如0 x3214,0 xFE,0 x1等n进制数,表示为n_XXX,其中n为2-9,如8_123即十进制数83.,若数字常量是32位整数,当作为无符号整数时,其取值范围为0232-1;当作为有符号整数时,其取值范围为-231231-1.,91,5.2ARM汇编语言语句格式,ARM汇编语言中的符号-标号,在ARM汇编语言中,标号是表示程序中的指令或数据地址的符号,一般它代表一个地址.根据地址值的生成方式可有3种:,基于PC的标号:是位于(将要跳转到的)目标指令前或程序中数据定义伪操作前的标号,在汇编时将被处理成PC值加上(或减去)一个数字常量.它常用于表示跳转指令的目标地址,或者代码段中所嵌入的少量数据.基于寄存器的标号:通常用MAP和FILED伪操作定义该标号,也可用EQU伪操作定义.这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数字常量.它常用于访问位于数据段中的数据.绝对地址:是一个32位的数字量,寻址的范围为0231-1,即直接可寻址整个内存空间.,92,5.2ARM汇编语言语句格式,ARM汇编语言中的符号-局部标号,局部标号主要用于局部范围代码.它由一个099数字和一个通常表示该局部标号作用范围的符号组成,可重复定义.局部标号的作用范围通常为当前段,也可用伪操作ROUT来定义局部标号的作用范围.其引用的语法格式:%F|BA|TNroutnameF:向前搜索B:向后搜索A:搜索宏的所有嵌套层T:搜索宏的当前层,93,ARM汇编语言伪指令-其他伪操作,ROUT,ROUT伪操作举例,routineROUT;定义局部标号的有效范围,名称为routine.1routine;routine范围内的局部标号.BEQ%2routine;若条件成立,则跳转到routine范围内的局部标号2.BGE%1routine;若条件成立,则跳转到routine范围内的局部标号1.2routine.;routine范围内的局部标号2.otherroutineROUT;定义新的局部标号的有效范围,94,5.2ARM汇编

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论