ARM汇编语言的语法知识

上传人:伴*** 文档编号:243309022 上传时间:2024-09-20 格式:PPT 页数:115 大小:790KB
返回 下载 相关 举报
ARM汇编语言的语法知识_第1页
第1页 / 共115页
ARM汇编语言的语法知识_第2页
第2页 / 共115页
ARM汇编语言的语法知识_第3页
第3页 / 共115页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,ARM,汇编语言,的语法知识,ARM,汇编语言语句格式,ARM,汇编语言的语句格式,:,symbolinstruction|directive|pseudo-instructioncomment,其中,:,instruction,为指令。在,ARM,汇编语言中,指令不能从一行的行头开始,.,在一行语句中,指令的前面必须有空格或符号,.,directive,为伪操作。,pseudo-instruction,为伪指令。,symbol,为符号。 在,ARM,汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格,在指令和伪指令中符号用作地址标号,在有些伪操作中,符号用作变量或者常量,.,comment,为语句的注释,.,在,ARM,汇编语言中注释以分号,”,;,”,开头,.,注释的结尾即为一行的结尾,注释也可以单独占用一行,.,5.1.ARM,汇编语言的伪操作 、宏指令和伪指令,ARM,汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成,.,伪操作是,ARM,汇编语言程序里的一些特殊指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行,.,也就是说,这些伪操作只在汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之结束,.,5.1.ARM,汇编语言的伪操作 、宏指令和伪指令,ARM,汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成,.,宏指令是一段独立的程序代码,可插在,源程序中,它通过,伪操作来定义,.,宏在被使用前必须提前定义好,宏之间可互相调用,也可自己递归调用,.,通过直接书写宏名来使用宏,并根据,宏指令的格式设置相应的输入参数,.,这与,C,语言中子函数形参与实参的传递很相似,.,5.1.ARM,汇编语言的伪操作 、宏指令和伪指令,ARM,汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成,.,伪指令也是,ARM,汇编语言程序里的一些特殊指令助记符,它们不是真正的,ARM,指令或,Thumb,指令,也不在计算机运行期间由机器执行,而是,在源程序进行汇编时被替换成相应的,ARM,指令或,Thumb,指令序列,从而实现真正的指令操作,.,5.1.ARM,汇编语言的伪操作 、宏指令和伪指令,ARM,汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成,.,伪操作和宏指令一般与编译程序有关,在不同的编译环境下有不同的编写形式和语法规则,.,常见的,ARM,编译开发环境有,2,种,:,ARM,公司开发的,ADS/SDT IDE,开发环境,集成了,GNU,开发工具的,IDE,开发环境,ARM,汇编语言伪指令,ARM,伪指令,ARM,伪指令不属于,ARM,指令集中的指令,是为了编程方便而定义的。伪指令可以像其它,ARM,指令一样使用,但在编译时这些指令将被等效的,ARM,指令代替。,ARM,伪指令有四条,分别为,ADR,伪指令、,ADRL,伪指令、,LDR,伪指令、,NOP,伪指令。,ARM,伪指令,小范围的地址读取,ADR,伪指令将基于,PC,相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,,ADR,伪指令被编译器替换成一条合适的指令。通常,编译器用一条,ADD,指令或,SUB,指令来实现该,ADR,伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,ADRcond register,expr,ADR,伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式,expr,的取值范围:,当地址值不是字对齐时,其取值范围为,-255,255,字节;,当地址值是字对齐时,其取值范围为,-1020,1020,字节;,当地址值是,16,字节对齐时,其取值范围将更大,;,该地址必须与,ADR,伪指令在同一个代码段中,。,ARM,伪指令,中等范围的地址读取,ADRL,伪指令将基于,PC,相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比,ADR,伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,,ADRL,伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,ADRLcond register,expr,ADRL,伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式,expr,的取值范围:,当地址值不是字对齐时,其取值范围为,-64K,64K,;,当地址值是字对齐时,其取值范围为,-256K,256K,;,当地址值是,16,字节对齐时,其取值范围将更大,;,该地址必须与,ADRL,伪指令在同一个代码段中,。,ARM,伪指令,大范围的地址读取,LDR,伪指令用于加载,32,位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,,LDR,伪指令被编译器替换成一条合适的指令。若加载的常数未超出,MOV,或,MVN,的范围,则使用,MOV,或,MVN,指令代替该,LDR,伪指令,否则汇编器将常量放入文字池,(,即数据缓冲区,),,并使用一条基于,PC,相对偏移的,LDR,指令从文字池读出该常量。,LDRcond register,=expr,LDR,伪指令格式,指令执行的条件码,加载的目标寄存器,基于,PC,的地址表达式或外部表达式,ARM,伪指令,大范围的地址读取,LDR,伪指令用于加载,32,位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,,LDR,伪指令被编译器替换成一条合适的指令。若加载的常数未超出,MOV,或,MVN,的范围,则使用,MOV,或,MVN,指令代替该,LDR,伪指令,否则汇编器将常量放入文字池,并使用一条基于,PC,相对偏移的,LDR,指令从文字池读出常量。,应用示例(源程序):,.,LDR R1,=InitStack,.,InitStack,MOV R0, LR,.,使用伪指令将程序标号,InitStack,的地址存入,R1,ARM,伪指令,大范围的地址读取,LDR,伪指令用于加载,32,位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,,LDR,伪指令被编译器替换成一条合适的指令。若加载的常数未超出,MOV,或,MVN,的范围,则使用,MOV,或,MVN,指令代替该,LDR,伪指令,否则汇编器将常量放入文字池,并使用一条基于,PC,相对偏移的,LDR,指令从文字池读出常量。,应用示例(源程序):,编译后的反汇编代码:,.,LDR R1,=InitStack,.,InitStack,MOV R0, LR,.,.,0x60 LDR R1,0xb4,.,0x84 MOV R0, LR,.,0xb4 DCD 0x84,使用伪指令将程序标号,InitStack,的地址存入,R1,地址,程序代码,ARM,伪指令,大范围的地址读取,LDR,伪指令用于加载,32,位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,,LDR,伪指令被编译器替换成一条合适的指令。若加载的常数未超出,MOV,或,MVN,的范围,则使用,MOV,或,MVN,指令代替该,LDR,伪指令,否则汇编器将常量放入文字池,并使用一条基于,PC,相对偏移的,LDR,指令从文字池读出常量。,应用示例(源程序):,编译后的反汇编代码:,.,LDR R1,=InitStack,.,InitStack,MOV R0, LR,.,.,0x60 LDR R1,0xb4,.,0x84 MOV R0, LR,.,0xb4 DCD 0x84,使用伪指令将程序标号,InitStack,的地址存入,R1,LDR,伪指令被汇编成一条,LDR,指令,并在文字池中定义了一个常量,该常量为,InitStack,标号的地址,ARM,伪指令,大范围的地址读取,LDR,伪指令用于加载,32,位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,,LDR,伪指令被编译器替换成一条合适的指令。若加载的常数未超出,MOV,或,MVN,的范围,则使用,MOV,或,MVN,指令代替该,LDR,伪指令,否则汇编器将常量放入文字池,并使用一条基于,PC,相对偏移的,LDR,指令从文字池读出常量。,注意,:,1.,从指令位置到文字池的偏移量必须小于,4KB,;,2.,与,ARM,指令的,LDR,相比,伪指令的,LDR,的参数有,“,=,”,号。,ARM,伪指令,空操作伪指令,NOP,伪指令在汇编时将会被代替成,ARM,中的空操作,比如可能是,“,MOV R0,R0,”,指令等。,NOP,可用于延时操作。,NOP,NOP,伪指令格式,应用示例(延时子程序):,Delay,NOP,;,空操作,NOP,NOP,SUBS R1,R1,#1,;,循环次数减一,BNE Delay,;,如果循环没有结束,跳转,Delay,继续,MOV PC,LR,;,子程序返回,ADS,编译环境下的,ARM,伪操作和宏指令,ADS,编译环境下的伪操作有如下几种,:,1,、符号定义伪操作,4,、框架描述伪操作,2,、数据定义伪操作、信息报告伪操作,3,、汇编控制伪操作、其他伪操作,ARM,汇编语言伪,操作,-,符号定义伪操作,全局变量声明,GBLA,声明一个全局算术变量,并将其初始化为,0,GBLL,声明一个全局逻辑变量,并将其初始化为,FALSE,GBLS,声明一个全局字符串,并将其初始化为,NULL,使用示例,:,GBLA num1,GBLL logic_x,GBLS string_y,符号定义伪,操作,用于定义,ARM,汇编程序中的变量,对变量,进行赋值以及定义寄存器名称,ARM,汇编语言伪指令,-,符号定义伪操作,局部变量声明,LCLA,声明一个局部算术变量,并将其初始化为,0,LCLL,声明一个,局部,逻辑变量,并将其初始化为,FALSE,LCLS,声明一个,局部,字符串,并将其初始化为,NULL,使用示例,:,LCLA num1,LCLL logic_x,LCLS string_y,注意,:,局部变量只能在宏中进行声明和使用,.,ARM,汇编语言伪指令,-,符号定义伪操作,变量赋值,SETA,给一个全局或局部算术变量赋值,SETL,给一个全局或局部逻辑变量赋值,SETS,给一个全局或局部字符串变量赋值,使用示例,:,num1,SETA 0xff,logic_x,SETL TRUE,string_y,SETS,“,stringtest,”,注意:在向变量赋值前,必须先声明该变量,ARM,汇编语言伪指令,-,符号定义伪操作,RLIST,为通用寄存器列表定义名称,定义的名称可以在,LDM/STM,指令中使用,.,列表中的寄存器以逗号分隔,连续编号的寄存器可以用,”,-,”,包括,例如,:R7-R9,表示寄存器,R7,、,R8,、,R9,使用示例,:,Reg_list RLIST R0-R4,R6,R7-R9,STMFD SP! Reg_list ;,将,R0-R4,R6,R7-R9,的内,;,容压入满降序栈中保存,ARM,汇编语言伪指令,-,符号定义伪操作,RN,为寄存器定义名称,使用示例,:,SP RN R13 ;,将,R13,的名称定义为,SP,ARM,汇编语言伪指令,-,符号定义伪操作,CN,、,CP,CN,为协处理器的寄存器定义名称,CP,为协处理器定义名称,使用示例,:,power CN 6 ;,将协处理器寄存器,6,的名称定义为,power,dmu CP 6 ;,将协处理器,6,的名称定义为,dmu,ARM,汇编语言伪指令,-,符号定义伪操作,DN,、,SN,、,FN,DN,为一个双精度的,VFP,寄存器定义名称,SN,为一个单精度的,VFP,寄存器定义名称,FN,为一个,FPA,浮点寄存器定义名称,使用示例,:,height DN 6,;,将,VFP,双精度寄存器,6,名称定义为,height,width SN 16,;,将,VFP,单精度寄存器,16,名称定义为,width,lower FN 6,;,将浮点寄存器,6,名称定义为,lower,ARM,汇编语言伪指令,-,数据定义伪操作,LTORG,伪,操作,用于数据缓冲池(也称为文字池)的开始,在使用伪指令,LDR,时,常常需要在适当的地方加入,LTORG,声明数据缓冲池,,LDR,加载的数据暂时放于数据缓冲池,LTORG,伪,操作,通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将数据池中的数据当做指令来执行,用,LTORG,伪指令定义数据缓冲池举例,Funel ;,子程序,LDR R1, =0x8000,;,将,0x8000,加载到,R1,MOV PC, LR,LTORG,;,定义数据缓冲池,存放,0x8000,Data SPACE 40,;,从当前位置开始分配,40,字节的内存,;,单元,并初始化为,0,ARM,汇编语言伪指令,-,数据定义伪操作,MAP,MAP,用于定义一个结构化的内存表的首地址此时,内存,表的位置计数器设置成该地址值,.,该伪操作可以用,”,”,代替,.,MAP,伪操作举例,MAP fun,;fun,就是内存表的首地址,MAP 0x100 ,R9 ;,内存表的首地址为,R9,0x100,ARM,汇编语言伪指令,-,数据定义伪操作,FIELD,FIELD,用于定义一个结构化内存表中的数据域,MAP,伪操作和,FIELD,伪操作配合使用来定义结构化的内存表结构,MAP,伪操,作定义内存表的首地址,,FIELD,伪操作定义内存表中各数据域,的字节长度,并可为每一个数据域指定一个标号,其他指令可,引用该标号该伪操作可以用,”,#,”,代替,.,题目:定义一个内存表,其首地址为固定地址,8192,,该内存表中包含个数据域:,consta,长度为,4,字节,,constb,长度为,4,字节,,x,长度为,8,字节,,y,长度为,8,字节,,string,长度为,16,字节,MAP 8192,consta FIELD 4,constb FIELD 4,x FIELD 8,y FIELD 8,string FIELD 16,ARM,汇编语言伪指令,-,数据定义伪操作,SPACE,SPACE,伪,操作,常常用来分配一块连续的内存区域供程序使用,并且将这个内存区域初始化为,0,该伪操作可以用,”,%,”,代替,.,使用示例,:,dataroom SPACE 256,;,以,dataroom,为起始地址,分配,256,;,字节的内存单元,并初始化为,0,ARM,汇编语言伪指令,-,数据定义伪操作,DCB,DCB,用于定义并初始化,1,字节或多字节的内存区域,.,该伪操作可以用,”,=,”,代替,.,使用示例,:,data1 DCB 1,3,5,string DCB,“,hello!,”,(),;,构造一个以,NULL,结尾的字符串,字,;,符串的起始地址为,string,ARM,汇编语言伪指令,-,数据定义伪指令,DCD,、,DCDU,DCD,和,DCDU,用于定义并初始化一个或多个字的内存区域,其中,DCD,可以用,”,&,”,代替,.DCD,和,DCDU,的区别在于,DCD,可以保证分配的内存单元是严格的字对齐的,而,DCDU,不能保证,.,使用示例,:,data1 DCD 0,2,4,6 ;,其中,0,2,4,6,按字存储,data2 DCDU 1,3,5,ARM,汇编语言伪指令,-,数据定义伪操作,DCDO,DCDO,用于定义并初始化一个或多个字的内存区域,且保证分配的内存单元是字对齐的,.,label DCDO expr,expr,DCDO,与,DCD,的区别在于,DCDO,将字单元初始化为,expr,相对于静态基址寄存器,R9(SB),的偏移量,.,使用示例,:,IMPORT externlabel,data1 DCDO externlabel,;,将地址为,data1,的字单元初,;,始化为标号,externlabel,相对于,R9,的偏移量,ARM,汇编语言伪指令,-,数据定义伪操作,DCFD,DCFDU,DCFS,DCFSU,DCFD,用于为双精度的浮点数分配字对齐的内存单元,每个双精度浮点数占据两个字单元,.,DCFDU,与,DCFD,的不同之处在于,DCFDU,分配的内存单元不能保证是严格对齐的,.,DCFS,用于为单精度的浮点数分配字对齐的内存单元,每个单精度浮点数占据,1,个字单元,.,DCFSU,与,DCFS,的不同之处在于,DCFSU,分配的内存单元不能保证是严格字对齐的,.,ARM,汇编语言伪指令,-,数据定义伪操作,DCI,DCI,用于分配并初始化一段内存单元,且认为内存单元中的数值为指令数据当,DCI,位于,ARM,代码中的时候,分配的内存是严格字对齐的,当,DCI,位于,Thumb,代码中的时候,分配的内存是半字对齐的,注意,:,DCI,伪操作和,DCD,伪操作非常类似,不同之处在于,,DCI,分配的内存中数据被标识为指令,可用于通过宏指令来定义处理器指令系统不支持的指令,ARM,汇编语言伪指令,-,数据定义伪操作,DCQ,DCQU,DCQ,用于分配一段以双字(字节)为单位的内存,分配的内存要求必须字对齐,并用伪操作中的,64,位的整数数据初始化,DCQU,与,DCQ,的不同之处在于,,DCQU,分配的内存单元并不严格字对齐,ARM,汇编语言伪指令,-,数据定义伪操作,DCW,DCWU,DCW,用于分配一段半字对齐的半字内存单元,并用伪操作中的,expr,初始化,DCWU,与,DCW,的不同之处在于,,DCWU,分配的内存单元并不严格半字对齐,ARM,汇编语言伪指令,-,汇编控制伪操作,IF,、,ELSE,、,ENDIF,IF,ELSE及ENDIF伪操作能够根据条件把一段源代码包括在汇编语言程序内,或者将其排除在程序之外它与语言中的if语句的功能很相似,语法格式如下:,IF condition,Instruction or derectives,ELSE,Instruction or derectives,ENDIF,注意,:condition表示控制条件,可以是逻辑表达式或标识符Instruction or derectives 表示一组语句,可以是代码指令或伪指令,注意,: IF,ELSE及ENDIF可以嵌套使用,ARM,汇编语言伪指令,-,汇编控制伪操作,WHILE,及,WEND,WHILE,及,WEND,伪操作能够根据条件重复汇编相同的一段源代码,它与语言中的,while,语句很相似只要满足条件,就将重复汇编语法格式中的指令或伪指令,注意,:,WHILE,及,WEND,可以嵌套使用,ARM,汇编语言伪指令,-,汇编控制伪操作,MACRO,、,MEND,及,MEXIT,MACRO,伪操作标识宏定义的开始,,MEND,标识宏定义的结束,MEXIT,用于从宏中跳转出去用,MACRO,和,MEND,定义的一段代码,称为宏定义体,这样在程序中就可通过宏名多次调用该代码段来完成相应的功能,MACRO,$label macroname $parameter,;宏代码,MEND,局部变量定义举例,MACRO,;,声明一个宏,$ label message $ a ;,宏的原型,宏的名称为,;,message,有一个参数,$ a,LCLS string ;,声明一个局部串变量,string,String SETS “error” ;,向该变量赋值,$ label ;,代码,INFO 0,”string”:CC: : STR: $ a ;,使用该串变量,MEND ;,宏定义结束,ARM,汇编语言伪指令,-,信息报告伪操作,信息报告伪操作用于汇编报告指示,ASSERT,ASSERT,为断言错误伪操作,在汇编编译器对汇编程序的第,遍扫描中,如果,ASSERT,中的条件不成立,则,ASSERT,伪操作将,报告该错误信息,ASSERT,伪操作用于保证源程序被汇编时满足相关的条件如,果条件不满足,则,ASSERT,伪操作报告错误类型,并终止汇编,ARM,汇编语言伪指令,-,信息报告伪操作,INFO,汇编诊断信息显示伪操作在汇编处理过程的第遍扫描或者,第遍扫描时,,INFO,伪操作报告诊断信息,INFO,伪操作用于显示用户自定义的错误信息,INFO,数字表达式,字符串,表达式,(,即诊断信息,),若 数字表达式,=0,第遍扫描时,打印字符串,.,若,数字表达式,0,第,1,遍扫描时,打印字符串,终止汇编,.,OPT,设置列表选项伪操作,通过,OPT,伪操作可在源程序中设置列,表选项,ARM,汇编语言伪指令,-,信息报告伪操作,TTL,及,SUBT,TTL,伪操作在列表文件每一页的开头插入一个标题该,TTL,伪操作将作用于其后的每一页,直到遇到新的,TTL,伪操作,SUBT,伪操作在列表文件每一页的开头插入一个子标题,该,SUBT,伪操作将作用于其后的每一页,直到遇到新的,SUBT,伪操作,TTL,伪操作在列表文件的页顶部显示一个标题,SUBT,伪操作,在列表文件页标题的下面显示一个子标题如果要在列表文,件的第一页显示标题或子标题,,TTL,伪操作或,SUBT,伪操作要,放在源程序的第行当使用,TTL,或,SUBT,伪操作改变页标题,时,新的标题将在下一页开始起作用,TTL Title,;,在列表文件的第一页及后面的各页显示标题,SUBT Subtitle,;在列表文件的第一页及后面的各页显示,;,子标题,ARM,汇编语言伪指令,-,其他伪操作,CODE16,及,CODE32,CODE16,伪操作告诉汇编编译器后面的指令序列为,16,位的,Thumb,指令;,CODE32,伪操作告诉汇编编译器后面的指令序列为,32,位的,ARM,指令,注意,:只是告诉编译器后面指令的类型,该伪操作本身并不进行程序状态的切换,ARM,汇编语言伪指令,-,其他伪操作,EQU,为数字常量或标号定义一个字符名称,该伪指令可以用,”,*,”,代替,.,使用示例,:,num EQU 2,;,数字常量,num,的值为,2,label_a EQU 0x20,;,表示标号,label_a,的地址为,0x20,ARM,汇编语言伪指令,-,其他伪操作,AREA,用于定义一个代码段或数据段,一个汇编程序至少包含一个代码段,使用示例,:,AREA Example,CODE,READON,L,Y,定义了一个代码段,代码段的名称为,Example,,属性为,READONLY,ARM,汇编语言伪指令,-,其他伪操作,ENTRY,用于指定程序的入口点一个程序可含多个源文件,而一个源文件中最多只能有一个,ENTRY,(也可以没有),所以一个程序可有多个,ENTRY,,但至少要有一个,ENTRY,END,END,伪操作告诉编译器已经到了源程序结尾每一个汇,编源程序都包含,END,伪操作,表示本源程序的结束,ARM,汇编语言伪指令,-,其他伪操作,ALIGN,ALIGN,伪操作通过添加补丁字节使当前位置满足一定的对齐方式,.,ALIGN expr ,offset ,为指定对齐方式,可能的取值为的次幂,,如,1,2,4,8,如果没有指定,则默认当前位,置对齐到下一个字边界处,不指定表示将当前位置对齐到以,expr,为单位的起始位置,ARM,汇编语言伪指令,-,其他伪操作,ALIGN,ALIGN,伪操作通过添加补丁字节使当前位置满足一定的对齐方式,.,例如:,ALIGN 8,表示将当前位置以个字的方式对齐,,,ALIGN 4, 3,当原始位置在,0x0001,(字节),使用,ALIGN 4, 3,以后,当前位置会转到,0x0007(0x0004+3),ARM,汇编语言伪指令,-,其他伪操作,EXPORT,及,GLOBAL,EXPORT,声明一个符号可被其他文件引用,相当于声明了一个全局变量,GLOBAL,是,EXPORT,的同义词,注意:声明的符号名称是区分大小写的,ARM,汇编语言伪指令,-,其他伪操作,IMPORT,IMPORT,伪操作告诉编译器当前的符号不是在本源文件中,定义的,而是在其他源文件中定义的,在本源文件中可能,引用该符号,而且不论本源文件是否实际引用该符号,该,符号都将被加入到本源文件的符号表中,IMPORT symbol WEAK,指定这个选项后,如果,symbol,在所有源文件,中都没有被定义,编译器也不会产生任何错,误信息,同时编译器也不会到当前没有被,INCLUDE,进来的库中去查找该符号,Symbol,为声明的符号名称,它是区分大小写的,ARM,汇编语言伪指令,-,其他伪操作,EXTERN,EXTERN,伪操作告诉编译器当前的符号不是在本源文件中,定义的,而是在其他源文件中定义的,在本源文件中可能,引用该符号,与,IMPORT,不同之处在于,如果本源文件没有实际引用该符号,该符号将不会被加入到本源文件的符号表中,EXTERN symbol WEAK,指定这个选项后,如果,symbol,在所有源文件,中都没有被定义,编译器也不会产生任何错,误信息,同时编译器也不会到当前没有被,INCLUDE,进来的库中去查找该符号,Symbol,为声明的符号名称,它是区分大小写的,ARM,汇编语言伪指令,-,其他伪操作,GET,及,INCLUDE,GET,伪操作将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理,,INCLUDE,是同义,GET filename ;,其中,filename,为被包含的源文件的名称,,;,这里可使用路径信息,ARM,汇编语言伪指令,-,其他伪操作,INCBIN,INCBIN,伪操作将一个文件包含到当前源文件中,被包含,的文件不进行汇编处理,通常可使用,INCBIN,将一个可执行文件或者任意的数据包含到当前文件中被包含的执行文件或数据将被原封不动地放到当前文件中,编译器从,INCBIN,伪操作后面开始继续处理,INCBIN,filename ;,其中,filename,为被包含的文件名,;,称,这里可使用路径信息,INCBIN file1.dat,INCBIN c:windowsfile2.txt,注意:,这里所包含的文件名称及其路径信息中都不能有空格,ARM,汇编语言伪指令,-,其他伪操作,KEEP,KEEP,伪,操作,告诉编译器将局部符号包含在目标文件中符号表中可使调试工作更加方便,语法格式如下:,KEEP,symbol,;,其中,symbol,为要保留的局部标号,如果没有指定,symbol,,则除了基于寄存器外的所有符号将被包含在目标文件的符号表中,label CMP R0 ,R1,KEEP label ;,将标号,label,包含到目标文件,;,的符号表中,ARM,汇编语言伪指令,-,其他伪操作,NOFP,使用,NOFP,伪,操作,禁止源程序中包含浮点运算指令,当系统中没有硬件或软件仿真代码支持浮点运算指令时,使用,NOFP,伪操作禁止在源程序中使用浮点运算指令这时如果源程序中包含浮点运算指令,或者在浮点运算指令的后面使用,NOFP,伪操作,编译器将会报告错误,ARM,汇编语言伪指令,-,其他伪操作,REQUIRE,REQUIRE,伪操作用于指定段之间的相互依赖关系,格式如下:,REQUIRE label ;,其中,label,为所需要的标号的名称,当进行连接处理包含有,“,REQUIRE label,”,伪操作的源文件时,定义,label,的源文件也将被包含,ARM,汇编语言伪指令,-,其他伪操作,REQUIRE8,及,PRESERVE8,REQUIRE8,伪,操作,指示当前代码中要求数据栈字节对齐,PRESERVE8,伪,操作,表示当前代码中数据栈是字节对齐的,使用说明:,LDRD,及,STRD,指令要求内存单元地址是字节对齐的当在程序中使用这些指令在数据栈中传送数据时,要求该数据栈是字节对齐的,这时就需要用,REQUIRE8,伪操作来说明链接器要保证要求字节对齐的数据栈代码只能被数据栈是字节对齐的代码调用,ARM,汇编语言伪指令,-,其他伪操作,ROUT,ROUT,伪,操作,用于定义局部变量的有效范围,语法格式如下:,name ROUT ;,其中,name,为所定义的作用范围的名称,使用说明:当没有使用,ROUT,伪操作定义局部变量的作用范围时,局部变量的作用范围为其所在的段,ROUT,伪操作作用的范围为本,ROUT,伪操作和下一个,ROUT,(指同一个段中,ROUT,伪操作)伪操作之间若只有一个,ROUT,,则局部标号的作用范围在,ROUT,与段结束伪操作(,END,)之间,ARM,汇编语言伪指令,-,其他伪操作,ROUT,ROUT,伪,操作,举例,Routine ROUT,;,定义局部标号的有效范围,名称为,routine,.,1 routine,;routine,范围内的局部标号,.,BEQ %2 routine,;,若条件成立,则跳转到,routine,范围内的局部标号,2,.,BGE %1 routine,;,若条件成立,则跳转到,routine,范围内的局部标号,1,.,2 routine .,;routine,范围内的局部标号,2,.,otherroutine ROUT,;,定义新的局部标号的有效范围,GNU,编译环境下的,ARM,伪操作与宏指令,针对上述所讲的,ARM,伪,操作,,对应地给出了常用的,GNU,编译环境下的伪,操作,1,、常量编译控制伪操作,2,、字符编译控制伪操作,3,、汇编程序代码控制伪操作,4,、宏编译控制伪操作,5,、条件编译控制伪操作,6,、反汇编代码控制伪操作,7,、其他常用伪操作,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.byte,.byte,伪,操作,用于分配一段字节内存单元(分配的内存都,是字节对齐的),并用伪指令中的,expr,初始化,语法格式如下:,byte expr ,expr.,其中,expr,可以为数字表达式或程序中的标号,byte 21,48,89,0x13,oxFF,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.hword,及,.short,.hword,及,.short,都是作用于分配一段半字内存单元(分配的,内存都是半字对齐的),并用伪指令中的,expr,初始化,语法格式如下:,hword expr ,expr.,其中,expr,可以为数字表达式或程序中的标号,hword 21,48,89,0x1133,ox77FF,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.word,、,.long,及,.int,.word,、,.long,及,.int,伪,操作,用于分配一段字内存单元(分配,的内存都是字对齐的),并用伪指令中的,expr,初始化,语法格式如下:,word,expr ,expr.,其中,expr,可以为数字表达式或程序中的标号,word 21, 0x110033,ox77FF2255,. int 17, 0x77889933,. long 1,2,3,4,5,6,7,8,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.ascii,.ascii,伪指令用于定义字符串,expr(,非,0,结束符,),语法格式如下:,ascii expr ,expr.,ascii,“,How are you,”,/*,定义字符串,不是以“,0”,结束 *,/,.asciz,及,.string,.asciz,和,.string,伪指令都是用于定义字符串,expr,(以,“,/0,”,结束),.asciz expr ,expr.,.asciz,“,am a student,”,/*,定义字符串,以“,0”,结束*,/,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.float,及,.single,.float,和,.single,伪,操作,用于定义,32,位,IEEE,浮点数,expr,语法格式如下:,float expr ,expr.,float 0F3.14,0F359.2E11,.double,.double,伪操作用于定义,64,位,IEEE,浮点数,expr.,.double expr ,expr.,.double,0F2E1,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.fill,.fill,伪指令用于分配一段字节内存单元,语法格式如下:,fill,repeat ,size (,value),其中,size,缺省为,,value,缺省为,fill 8,4,0xFFFFFFFF,分配个字节的内存单元,并将每个内存单元内容,初始化为,0xFFFFFFFF,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.zero,.zero,伪,操作,用于分配一段字节内存单元并用来填充内存,语法格式如下:,zero size,fill 400,分配,400,字节的内存单元,并用,0,初始化,GNU,编译环境下的,ARM,伪指令,-,常量编译控制伪操作,.space,及,.skip,.space,与,.skip,伪,操作,用于分配一段内存单元用,value,将内存单元初始化若,value,缺省,则用,0,初始化内存单元,,语法格式如下:,space size ,value,skip size ,value,举例,.space 10 0XFF,/*,分配,10,字节的内存单元,并用,0XFF,初始化*,/,.skip,22,/*,分配,22,字节的内存单元,并用,0,初始化*,/,GNU,编译环境下的,ARM,伪指令,-,字符编译控制伪操作,.equ,及,.set,.equ,和,.set,伪,操作,用于为数字常量,基于寄存器的值和程序中的标号定义一个字符名称,语法格式如下:,.equ symbol ,expr,.set symbol ,expr,其中:,expr,为基于寄存器的地址值、程序中的标号,,32,位的地址常量或者,32,位的常量,,symbol,为,.equ,伪指令作为,expr,定义的字符名称,equ PLLCON ,0x01D80000,/*,对,PLL,控制器设置*,/,equ CLKCON ,0x01d80004,/*,对时钟控制器设置*,/,GNU,编译环境下的,ARM,伪指令,-,字符编译控制伪操作,.global,及,.globl,.global,和,.globl,声明一个符号可被其他文件引用,相当于声明了一个全局变量,语法格式如下:,global symbol,其中:,symbol,为声明的符号名称,它是区分大小写的,.extern,.extern,伪,操作,用于声明一个符号可被其他文件引用,相当于声明了一个全局变量,GNU,编译环境下的,ARM,伪指令,-,汇编程序代码控制伪操作,.section,.section,伪,操作,用于定义域中包含的段段可以是,.text(,只读代码区,),,,.data(,可读写数据区,),及,.bss(,为静态和全局变量保留的可读写的数据区,),语法格式如下:,.section expr,. section .bss,GNU,编译环境下的,ARM,伪指令,-,汇编程序代码控制伪操作,.text,、,.data,及,.bss,. text,伪操作将操作符开始的代码编译到代码段或代码段子段,. data,伪操作将操作符开始的数据编译到数据段或数据段子段,. bss,伪操作用于将变量存放到,.bss,段或,.bss,段的子段,举例:,.data,src:,.long 1,2,3,4,5,6,7,8,9,0,/*,定义了一个数据区,以,src,为起始地址*,/,dst:,.long 0,0,0,0,0,0,0,0,0,0,/*,定义了一个数据区,以,dst,为起始地址*,/,GNU,编译环境下的,ARM,伪指令,-,汇编程序代码控制伪操作,.code 16|32,. code,伪,操作,用于选择当前汇编指令的指令集参数,16,选择,Thumb,指令集,参数,32,选择,ARM,指令集,举例:,.code 32,/*,表明下面是,ARM,指令*,/,header:,ADR R0, start + 1,BX R0,.code 16,/*,表明下面是,Thumb,指令*,/,start:,MOV R0, #10,MOV R1, #3,BL doadd,GNU,编译环境下的,ARM,伪指令,-,汇编程序代码控制伪操作,.end,标记汇编文件的结束行,即标号后的代码不处理,.include,用于将一个源文件包含到当前源文件中,一般是将该源文件用到的库文件包含到本源文件中,.include “option.a”,.include “44b0.h”,GNU,编译环境下的,ARM,伪指令,-,汇编程序代码控制伪操作,.align,及,.balign,.align,和,.balign,伪,操作,用于表示对齐方式,通过添加填充字节使当前位置满足一定的对齐方式,语法格式如下:,.align alignment ,fill ,max,其中:,alignment,用于指定对齐方式,可能的取值为的次幂,缺省为,fill,是填充内容,缺省时用填充,max,是填充字节数最大值,如果填充字节超过,max,,就不进行对齐,GNU,编译环境下的,ARM,伪指令,-,宏编译控制伪操作,.macro,及,.endm,.macro,伪,操作,标识宏定义的开始,,.endm,标识宏定义的结束,用,.macro,和,.endm,定义一段代码,称为宏定义体,这样在程序中就可通过宏指令多次调用该代码段,语法格式如下:,.macro macronameparameter,parameter. /*,代码段*,/,.,.endm,其中:,macroname,为所定义的宏的名称,parameter,为宏指令的参数,宏参数的定义可使用逗号分隔,.exitm,用于提前退出宏,GNU,编译环境下的,ARM,伪指令,-,条件编译控制伪操作,.ifdef,、,.else,及,.endif,.ifdef,、,.else,及,.endif,伪,操作,是汇编控制伪操作,当满足某条件时,对一组语句进行编译,当条件不满足时,则编译另一组语句,其中,else,可以缺省,语法格式如下:,.ifdef condition,Instruction or derectives,.,.else,.,.endif,注意,:,condition,表示控制条件,可以是逻辑表达式或标识符,Instruction or derectives,表示一组语句,可以是代码指令或伪指令,GNU,编译环境下的,ARM,伪指令,-,反汇编代码控制伪操作,.eject,用于在汇编符号列表文件中插入一分页符,.list,用于产生汇编,列表(从,.list,到,.nolist,),.nolist,伪操作用于表示汇编列表结束处,.title,语法格式为,.title,“,heading,”,即使用,“,heading,”,作为标题(位于汇编列表文件中文件名的下一行),.sbttl,语法格式为,.sbttl “heading”,即使用“,heading”,作为子标题(位于,.title,标题的下一行),GNU,编译环境下的,ARM,伪指令,-,其他常用伪操作,.ltorg,.ltorg,伪,操作,用于在当前段,(,一般是,.text,段,),的当前地址,(,字对齐地址,),产生一个文字池,.ltorg,一般放在跳转指令的后面,.,语法格式如下:,.ltorg,使用示例,:,#exit from DRAM/SDRAM self refresh mode,LDR R0,=REFRESH,STR R3,R0,MOV PC,LR,.ltorg,GNU,编译环境下的,ARM,伪指令,-,其他常用伪操作,.req,.req,伪,操作,为一个特定的寄存器定义名称,以方便程序员记忆该寄存器的功能,.,语法格式如下:,.req name,expr,其中,expr,为某个寄存器的编码,name,为本伪指令给寄存器定义的名称,.,使用示例,:,.req COUNT,7 /*,定义寄存器,7,为,COUNT*/,GNU,编译环境下的,ARM,伪指令,-,其他常用伪操作,.err,.err,伪,操作,用于使编译时产生错误报告,.,.print,.print,伪,操作,用于打印信息到标准输出,.,例如,:,.print “Something is broken”,.fail,格式为,.fail expr,.fail,伪,操作,用于汇编文件时产生警告,.,当,expr,小于,500,时产,生错误信息,否则产生警告,.,ARM,汇编程序实例,注意,:,ADS,编译环境下的汇编代码与,GNU,编译环境下,(Embest IDE,内部集成,GNU,的开发工具,),有较多不同点,主要是符号及伪操作的不同,.,注释行以,/* */,代替,”,;,”,操作数及运算符号替换,伪操作符替换,操作数及运算符替换如下所示,ADS,下的操作数及运算符,GNU,下的操作数及运算符,LDR PC, PC,#&18,LDR PC, PC,#0x18,LDR PC, PC,#&18,LDR PC, PC,#0x18,伪操作数替换如下所示,ADS,下的伪操作符,GNU,下的伪操作符,INCLUDE,.incldue,TCLK2 EQU PB25,.equ TCLK2,PB25,EXPORT,.global,IMPORT,.extern,DCD,.long,IF:DEF:,.ifdef,ELSE,.else,ENDIF,.endif,:OR:,|,:SHL,RN,.req,GBLA,.global,伪操作数替换如下所示,ADS,下的伪操作符,GNU,下的伪操作符,BUSWIDTH SETA 16,.equ BUSEIDTH,16,MACRO,.macro,MEND,.endm,END,.end,AREA Word,CODE,READONLY,.text,AREA Block,DATA,READWRITE,.data,CODE32,.arm,CODE16,.thumb,LTORG,.ltorg,%,.fill,Entry,Entry:,5.2 ARM,汇编语言语句格式,ARM,汇编中的文件格式,:,ARM,源程序文件可由任意一种文件编辑器来编写程序代码,它一般为文件格式。在,ARM,程序设计中,常用的源文件可简单分为以下几种,不同种类的文件有不同的后缀名。,源程序文件,文件名,说明,汇编程序文件,*.S,用,ARM,汇编语言编写的,ARM,程序或,Thumb,程序,C,程序文件,*.C,用,C,语言编写的程序代码,头文件,*.H,为了简化源程序,把程序中常用到的常量命名,宏定义,数据结构定义等单独放在一个文件中,一般称为头文件,5.2 ARM,汇编语言语句格式,ARM,汇编语言语句格式,:,symbolinstruction|directive|pseudo-instruction;comment,为符号。 在,ARM,汇编语言中,符号必须从一行的行头开始,并且,符号中不能包含空格,在指令和伪指令中符号用作地址标号,在有些伪操作中,符号用作变量或者常量,.,为指令。在,ARM,汇编语言中,指令不能从一行的行头,开始,.,在一行语句中,指令的前面
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!