1、ARM汇编语言的语法知识,ARM汇编语言语句格式,ARM汇编语言的语句格式:symbolinstruction|directive|pseudo-instructioncomment,其中:instruction为指令。在ARM汇编语言中,指令不能从一行的行头开始.在一行语句中,指令的前面必须有空格或符号. directive为伪操作。 pseudo-instruction为伪指令。 symbol为符号。 在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格,在指令和伪指令中符号用作地址标号,在有些伪操作中,符号用作变量或者常量.comment为语句的注释.在 ARM 汇编语言
2、中注释以分号”;”开头.注释的结尾即为一行的结尾,注释也可以单独占用一行.,5.1.ARM汇编语言的伪操作 、宏指令和伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成. 伪操作是ARM汇编语言程序里的一些特殊指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行.也就是说,这些伪操作只在汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之结束.,5.1.ARM汇编语言的伪操作 、宏指令和伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成. 宏指令是一段独立的程序代码,可插在源程序中,
3、它通过伪操作来定义.宏在被使用前必须提前定义好,宏之间可互相调用,也可自己递归调用.通过直接书写宏名来使用宏,并根据宏指令的格式设置相应的输入参数.这与C语言中子函数形参与实参的传递很相似.,5.1.ARM汇编语言的伪操作 、宏指令和伪指令,ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成. 伪指令也是ARM汇编语言程序里的一些特殊指令助记符,它们不是真正的ARM指令或Thumb指令,也不在计算机运行期间由机器执行,而是在源程序进行汇编时被替换成相应的ARM指令或Thumb指令序列,从而实现真正的指令操作.,5.1.ARM汇编语言的伪操作 、宏指令和伪指令,ARM汇编语言源程序
4、中语句一般由指令、伪操作、宏指令和伪指令组成. 伪操作和宏指令一般与编译程序有关,在不同的编译环境下有不同的编写形式和语法规则.常见的ARM编译开发环境有2种: ARM公司开发的ADS/SDT IDE开发环境 集成了GNU开发工具的IDE开发环境,ARM汇编语言伪指令,ARM伪指令,ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令将被等效的ARM指令代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。,ARM伪指令小范围的地址读取,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏
5、移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。,ADRcond register,expr,ADR伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式expr的取值范围:当地址值不是字对齐时,其取值范围为-255255字节;当地址值是字对齐时,其取值范围为-10201020字节;当地址值是16字节对齐时,其取值范围将更大;该地址必须与ADR伪指令在同一个代码段中。,ARM伪指令中等范围的地址读取,ADRL伪指令将基于P
6、C相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,ADRLcond register,expr,ADRL伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式expr的取值范围:当地址值不是字对齐时,其取值范围为-64K64K;当地址值是字对齐时,其取值范围为-256K256K;当地址值是16字节对齐时,其取值范围将更大;该地址必须与ADRL伪指令在同一个代码段中 。,ARM伪指令大范围的地址读取,LDR伪指令用
7、于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池(即数据缓冲区),并使用一条基于PC相对偏移的LDR指令从文字池读出该常量。,LDRcond register,=expr,LDR伪指令格式,指令执行的条件码,加载的目标寄存器,基于PC的地址表达式或外部表达式,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出
8、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相
9、对偏移的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伪指令,否则汇编器将常量放入文字
10、池,并使用一条基于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伪指令被编译器替换成一条合适的指令
11、。若加载的常数未超出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;如果循环没有结
12、束,跳转Delay继续 MOV PC,LR;子程序返回,ADS编译环境下的ARM伪操作和宏指令,ADS编译环境下的伪操作有如下几种:1、符号定义伪操作 4、框架描述伪操作2、数据定义伪操作、信息报告伪操作3、汇编控制伪操作、其他伪操作,ARM汇编语言伪操作-符号定义伪操作,全局变量声明,GBLA 声明一个全局算术变量,并将其初始化为0GBLL 声明一个全局逻辑变量,并将其初始化为FALSEGBLS 声明一个全局字符串,并将其初始化为NULL,使用示例:,GBLA num1GBLL logic_xGBLS string_y,符号定义伪操作用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存
13、器名称,ARM汇编语言伪指令-符号定义伪操作,局部变量声明,LCLA 声明一个局部算术变量,并将其初始化为0LCLL 声明一个局部逻辑变量,并将其初始化为FALSELCLS 声明一个局部字符串,并将其初始化为NULL,使用示例:,LCLA num1LCLL logic_xLCLS string_y,注意:局部变量只能在宏中进行声明和使用.,ARM汇编语言伪指令-符号定义伪操作,变量赋值,SETA 给一个全局或局部算术变量赋值SETL 给一个全局或局部逻辑变量赋值SETS 给一个全局或局部字符串变量赋值,使用示例:,num1 SETA 0xfflogic_x SETL TRUEstring_y
14、SETS “stringtest”,注意:在向变量赋值前,必须先声明该变量,ARM汇编语言伪指令-符号定义伪操作,RLIST,为通用寄存器列表定义名称,定义的名称可以在LDM/STM指令中使用.列表中的寄存器以逗号分隔,连续编号的寄存器可以用”-”包括,例如:R7-R9表示寄存器R7、R8、R9,使用示例:,Reg_list RLIST R0-R4,R6,R7-R9STMFD SP! Reg_list ;将R0-R4,R6,R7-R9的内 ;容压入满降序栈中保存,ARM汇编语言伪指令-符号定义伪操作,RN,为寄存器定义名称,使用示例:,SP RN R13 ;将R13的名称定义为SP,ARM汇编
15、语言伪指令-符号定义伪操作,CN、CP,CN为协处理器的寄存器定义名称 CP为协处理器定义名称,使用示例:,power CN 6 ;将协处理器寄存器6的名称定义为powerdmu 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名称定义为widthlower FN 6 ;将浮点寄存器6名称定义为l
16、ower,ARM汇编语言伪指令-数据定义伪操作,LTORG伪操作用于数据缓冲池(也称为文字池)的开始在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池,LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将数据池中的数据当做指令来执行,用LTORG伪指令定义数据缓冲池举例Funel ;子程序LDR R1, =0x8000;将0x8000加载到R1MOV PC, LR LTORG ;定义数据缓冲池,存放0x8000Data SPACE 40 ;从当前位置开始分配40字节的内存 ;单元,并初始化为0,AR
17、M汇编语言伪指令-数据定义伪操作,MAP,MAP用于定义一个结构化的内存表的首地址此时,内存表的位置计数器设置成该地址值.该伪操作可以用”代替.,MAP伪操作举例MAP fun ;fun就是内存表的首地址MAP 0x100 ,R9 ;内存表的首地址为R9 0x100,ARM汇编语言伪指令-数据定义伪操作,FIELD,FIELD用于定义一个结构化内存表中的数据域MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构 MAP伪操作定义内存表的首地址, FIELD伪操作定义内存表中各数据域的字节长度,并可为每一个数据域指定一个标号,其他指令可引用该标号该伪操作可以用”#”代替.,题目:定义一
18、个内存表,其首地址为固定地址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 ;字节的内存单
19、元,并初始化为0,ARM汇编语言伪指令-数据定义伪操作,DCB,DCB用于定义并初始化1字节或多字节的内存区域.该伪操作可以用”=”代替.,使用示例:,data1 DCB 1,3,5string DCB “hello!”,() ;构造一个以NULL结尾的字符串,字 ;符串的起始地址为string,ARM汇编语言伪指令-数据定义伪指令,DCD、DCDU,DCD和DCDU用于定义并初始化一个或多个字的内存区域,其中DCD可以用”&”代替.DCD和DCDU的区别在于DCD可以保证分配的内存单元是严格的字对齐的,而DCDU不能保证.,使用示例:,data1 DCD 0,2,4,6 ;其中0,2,4,6
20、按字存储data2 DCDU 1,3,5,ARM汇编语言伪指令-数据定义伪操作,DCDO,DCDO用于定义并初始化一个或多个字的内存区域,且保证分配的内存单元是字对齐的. label DCDO expr,expr DCDO与DCD的区别在于DCDO将字单元初始化为expr相对于静态基址寄存器R9(SB)的偏移量.,使用示例:,IMPORT externlabeldata1 DCDO externlabel ;将地址为data1的字单元初 ;始化为标号externlabel相对于R9的偏移量,ARM汇编语言伪指令-数据定义伪操作,DCFD,DCFDU,DCFS,DCFSU,DCFD用于为双精度的
21、浮点数分配字对齐的内存单元,每个双精度浮点数占据两个字单元. DCFDU与DCFD的不同之处在于DCFDU分配的内存单元不能保证是严格对齐的. DCFS用于为单精度的浮点数分配字对齐的内存单元,每个单精度浮点数占据1个字单元. DCFSU与DCFS的不同之处在于DCFSU分配的内存单元不能保证是严格字对齐的.,ARM汇编语言伪指令-数据定义伪操作,DCI,DCI用于分配并初始化一段内存单元,且认为内存单元中的数值为指令数据当DCI位于ARM代码中的时候,分配的内存是严格字对齐的,当DCI位于Thumb代码中的时候,分配的内存是半字对齐的注意:DCI伪操作和DCD伪操作非常类似,不同之处在于,D
22、CI分配的内存中数据被标识为指令,可用于通过宏指令来定义处理器指令系统不支持的指令,ARM汇编语言伪指令-数据定义伪操作,DCQ,DCQU,DCQ用于分配一段以双字(字节)为单位的内存,分配的内存要求必须字对齐,并用伪操作中的64位的整数数据初始化DCQU与DCQ的不同之处在于,DCQU分配的内存单元并不严格字对齐,ARM汇编语言伪指令-数据定义伪操作,DCW,DCWU,DCW用于分配一段半字对齐的半字内存单元,并用伪操作中的expr初始化DCWU与DCW的不同之处在于,DCWU分配的内存单元并不严格半字对齐,ARM汇编语言伪指令-汇编控制伪操作,IF、ELSE、ENDIF,IF,ELSE及E
23、NDIF伪操作能够根据条件把一段源代码包括在汇编语言程序内,或者将其排除在程序之外它与语言中的if语句的功能很相似语法格式如下:IF conditionInstruction or derectivesELSEInstruction or derectivesENDIF注意:condition表示控制条件,可以是逻辑表达式或标识符Instruction or derectives 表示一组语句,可以是代码指令或伪指令注意: IF,ELSE及ENDIF可以嵌套使用,ARM汇编语言伪指令-汇编控制伪操作,WHILE及WEND,WHILE及WEND伪操作能够根据条件重复汇编相同的一段源代码,它与语言
24、中的while语句很相似只要满足条件,就将重复汇编语法格式中的指令或伪指令注意: WHILE及WEND可以嵌套使用,ARM汇编语言伪指令-汇编控制伪操作,MACRO、MEND及MEXIT,MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束MEXIT用于从宏中跳转出去用MACRO和MEND定义的一段代码,称为宏定义体,这样在程序中就可通过宏名多次调用该代码段来完成相应的功能,MACRO$label macroname $parameter ;宏代码 MEND,局部变量定义举例MACRO;声明一个宏$ label message $ a ;宏的原型,宏的名称为 ;message,有一个参数
25、$ aLCLS string ;声明一个局部串变量stringString SETS “error” ;向该变量赋值$ label ;代码INFO 0,”string”:CC: : STR: $ a ;使用该串变量MEND ;宏定义结束,ARM汇编语言伪指令-信息报告伪操作,信息报告伪操作用于汇编报告指示,ASSERT,ASSERT为断言错误伪操作,在汇编编译器对汇编程序的第遍扫描中,如果ASSERT中的条件不成立,则ASSERT伪操作将报告该错误信息ASSERT伪操作用于保证源程序被汇编时满足相关的条件如果条件不满足,则ASSERT伪操作报告错误类型,并终止汇编,ARM汇编语言伪指令-信息报
26、告伪操作,INFO,汇编诊断信息显示伪操作在汇编处理过程的第遍扫描或者第遍扫描时,INFO伪操作报告诊断信息INFO伪操作用于显示用户自定义的错误信息 INFO 数字表达式,字符串表达式(即诊断信息) 若 数字表达式=0,第遍扫描时,打印字符串. 若数字表达式0,第1遍扫描时,打印字符串,终止汇编.,OPT,设置列表选项伪操作,通过OPT伪操作可在源程序中设置列表选项,ARM汇编语言伪指令-信息报告伪操作,TTL及SUBT,TTL伪操作在列表文件每一页的开头插入一个标题该TTL伪操作将作用于其后的每一页,直到遇到新的TTL伪操作SUBT伪操作在列表文件每一页的开头插入一个子标题,该SUBT伪操
27、作将作用于其后的每一页,直到遇到新的SUBT伪操作TTL伪操作在列表文件的页顶部显示一个标题SUBT伪操作在列表文件页标题的下面显示一个子标题如果要在列表文件的第一页显示标题或子标题,TTL伪操作或SUBT伪操作要放在源程序的第行当使用TTL或SUBT伪操作改变页标题时,新的标题将在下一页开始起作用,TTL Title;在列表文件的第一页及后面的各页显示标题SUBT Subtitle;在列表文件的第一页及后面的各页显示 ;子标题,ARM汇编语言伪指令-其他伪操作,CODE16及CODE32,CODE16伪操作告诉汇编编译器后面的指令序列为16位的Thumb指令; CODE32伪操作告诉汇编编译
28、器后面的指令序列为32位的ARM指令注意:只是告诉编译器后面指令的类型,该伪操作本身并不进行程序状态的切换,ARM汇编语言伪指令-其他伪操作,EQU,为数字常量或标号定义一个字符名称,该伪指令可以用”*”代替.,使用示例:,num EQU 2 ;数字常量num的值为2label_a EQU 0x20 ;表示标号label_a的地址为0x20,ARM汇编语言伪指令-其他伪操作,AREA,用于定义一个代码段或数据段,一个汇编程序至少包含一个代码段,使用示例:,AREA Example,CODE,READONLY定义了一个代码段,代码段的名称为Example,属性为READONLY,ARM汇编语言伪
29、指令-其他伪操作,ENTRY,用于指定程序的入口点一个程序可含多个源文件,而一个源文件中最多只能有一个ENTRY(也可以没有),所以一个程序可有多个ENTRY ,但至少要有一个ENTRY,END,END伪操作告诉编译器已经到了源程序结尾每一个汇编源程序都包含END伪操作,表示本源程序的结束,ARM汇编语言伪指令-其他伪操作,ALIGN,ALIGN伪操作通过添加补丁字节使当前位置满足一定的对齐方式.,ALIGN expr ,offset ,为指定对齐方式,可能的取值为的次幂,如1,2,4,8如果没有指定,则默认当前位置对齐到下一个字边界处,不指定表示将当前位置对齐到以expr为单位的起始位置,A
30、RM汇编语言伪指令-其他伪操作,ALIGN,ALIGN伪操作通过添加补丁字节使当前位置满足一定的对齐方式.,例如:ALIGN 8 表示将当前位置以个字的方式对齐,ALIGN 4, 3 当原始位置在0x0001(字节),使用 ALIGN 4, 3以后,当前位置会转到 0x0007(0x0004+3),ARM汇编语言伪指令-其他伪操作,EXPORT及GLOBAL,EXPORT声明一个符号可被其他文件引用,相当于声明了一个全局变量GLOBAL 是EXPORT的同义词,注意:声明的符号名称是区分大小写的,ARM汇编语言伪指令-其他伪操作,IMPORT,IMPORT伪操作告诉编译器当前的符号不是在本源文
31、件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中,IMPORT symbol WEAK,指定这个选项后,如果symbol在所有源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号,Symbol为声明的符号名称,它是区分大小写的,ARM汇编语言伪指令-其他伪操作,EXTERN,EXTERN伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,与IMPORT不同之处在于,如果本源文件没有实际引用该
32、符号,该符号将不会被加入到本源文件的符号表中,EXTERN symbol WEAK,指定这个选项后,如果symbol在所有源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号,Symbol为声明的符号名称,它是区分大小写的,ARM汇编语言伪指令-其他伪操作,GET及INCLUDE,GET伪操作将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理,INCLUDE是同义GET filename ;其中filename为被包含的源文件的名称, ;这里可使用路径信息,ARM汇编语言伪指令-其他伪操作,INCBIN,IN
33、CBIN伪操作将一个文件包含到当前源文件中,被包含的文件不进行汇编处理通常可使用INCBIN将一个可执行文件或者任意的数据包含到当前文件中被包含的执行文件或数据将被原封不动地放到当前文件中,编译器从INCBIN伪操作后面开始继续处理INCBIN filename ;其中filename为被包含的文件名 ;称,这里可使用路径信息,INCBIN file1.datINCBIN c:windowsfile2.txt注意:这里所包含的文件名称及其路径信息中都不能有空格,ARM汇编语言伪指令-其他伪操作,KEEP,KEEP伪操作告诉编译器将局部符号包含在目标文件中符号表中可使调试工作更加方便语法格式如下
34、:KEEP symbol ;其中symbol为要保留的局部标号,如果没有指定symbol,则除了基于寄存器外的所有符号将被包含在目标文件的符号表中,label CMP R0 ,R1KEEP label ;将标号label包含到目标文件;的符号表中,ARM汇编语言伪指令-其他伪操作,NOFP,ARM汇编语言伪指令-其他伪操作,REQUIRE,REQUIRE伪操作用于指定段之间的相互依赖关系格式如下:REQUIRE label ;其中label为所需要的标号的名称当进行连接处理包含有“REQUIRE label”伪操作的源文件时,定义label的源文件也将被包含,ARM汇编语言伪指令-其他伪操作,
35、REQUIRE8及PRESERVE8,REQUIRE8伪操作指示当前代码中要求数据栈字节对齐PRESERVE8伪操作表示当前代码中数据栈是字节对齐的使用说明:LDRD及STRD指令要求内存单元地址是字节对齐的当在程序中使用这些指令在数据栈中传送数据时,要求该数据栈是字节对齐的,这时就需要用REQUIRE8伪操作来说明链接器要保证要求字节对齐的数据栈代码只能被数据栈是字节对齐的代码调用,ARM汇编语言伪指令-其他伪操作,ROUT,ROUT伪操作用于定义局部变量的有效范围语法格式如下:name ROUT ;其中name为所定义的作用范围的名称使用说明:当没有使用ROUT伪操作定义局部变量的作用范围
36、时,局部变量的作用范围为其所在的段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 rout
37、ine . ;routine范围内的局部标号2 .otherroutine ROUT ;定义新的局部标号的有效范围,GNU编译环境下的ARM伪操作与宏指令,针对上述所讲的ARM伪操作,对应地给出了常用的GNU编译环境下的伪操作1、常量编译控制伪操作2、字符编译控制伪操作3、汇编程序代码控制伪操作4、宏编译控制伪操作5、条件编译控制伪操作6、反汇编代码控制伪操作7、其他常用伪操作,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.byte,.byte伪操作用于分配一段字节内存单元(分配的内存都是字节对齐的),并用伪指令中的expr初始化,语法格式如下:byte expr ,expr. 其中e
38、xpr可以为数字表达式或程序中的标号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伪操作用于分配一段字内存单元(分配的内存都是
39、字对齐的),并用伪指令中的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伪指令都是
40、用于定义字符串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伪指令-常量编译控制伪
41、操作,.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伪
42、操作用于分配一段内存单元用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定义的字符名称,