版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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
6、伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。,ADRLcond register,expr,ADRL伪指令格式,指令执行的条件码,加载的目标寄存器,地址表达式,地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-64K64K; 当地址值是字对齐时,其取值范围为-256K256K; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADRL伪指令在同一个代码段中 。,ARM伪指令大范围的地
7、址读取,LDR伪指令用于加载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伪指令,否则汇编器将常量放入文字
9、池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。,应用示例(源程序):,编译后的反汇编代码:,. LDR R1,=InitStack . InitStack MOV R0, LR .,. 0 x60 LDR R1,0 xb4 . 0 x84 MOV R0, LR . 0 xb4 DCD 0 x84,使用伪指令将程序标号InitStack的地址存入R1,地址,程序代码,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代
10、替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。,应用示例(源程序):,编译后的反汇编代码:,. LDR R1,=InitStack . InitStack MOV R0, LR .,. 0 x60 LDR R1,0 xb4 . 0 x84 MOV R0, LR . 0 xb4 DCD 0 x84,使用伪指令将程序标号InitStack的地址存入R1,LDR伪指令被汇编成一条LDR指令,并在文字池中定义了一个常量,该常量为InitStack标号的地址,ARM伪指令大范围的地址读取,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。
11、在汇编编译源程序时,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 R
12、1,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
13、_y,符号定义伪操作用于定义ARM汇编程序中的变量,对变量 进行赋值以及定义寄存器名称,ARM汇编语言伪指令-符号定义伪操作,局部变量声明,LCLA 声明一个局部算术变量,并将其初始化为0 LCLL 声明一个局部逻辑变量,并将其初始化为FALSE LCLS 声明一个局部字符串,并将其初始化为NULL,使用示例:,LCLA num1 LCLL logic_x LCLS string_y,注意:局部变量只能在宏中进行声明和使用.,ARM汇编语言伪指令-符号定义伪操作,变量赋值,SETA 给一个全局或局部算术变量赋值 SETL 给一个全局或局部逻辑变量赋值 SETS 给一个全局或局部字符串变量赋值,
14、使用示例:,num1 SETA 0 xff 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汇编语言伪指令-符号定义伪
15、操作,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、16 ;将VFP单精度寄存器16名称定义为width lower FN 6 ;将浮点寄存器6名称定义为lower,ARM汇编语言伪指令-数据定义伪操作,LTORG伪操作用于数据缓冲池(也称为文字池)的开始 在使用伪指令LDR时,常常需要在适当的地方加入LTORG 声明数据缓冲池,LDR加载的数据暂时放于数据缓冲池,LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将数据池中的数据当做指令来执行,用LTORG伪指令定义数据缓冲池举例 Funel ;子程序 LDR R1, =0 x8000;将0 x8000加载到R1 MOV PC, LR LTORG ;定义
17、数据缓冲池,存放0 x8000 Data SPACE 40 ;从当前位置开始分配40字节的内存 ;单元,并初始化为0,ARM汇编语言伪指令-数据定义伪操作,MAP,MAP用于定义一个结构化的内存表的首地址此时,内存 表的位置计数器设置成该地址值.该伪操作可以用”代替.,MAP伪操作举例 MAP fun ;fun就是内存表的首地址 MAP 0 x100 ,R9 ;内存表的首地址为R9 0 x100,ARM汇编语言伪指令-数据定义伪操作,FIELD,FIELD用于定义一个结构化内存表中的数据域MAP伪操作和 FIELD伪操作配合使用来定义结构化的内存表结构 MAP伪操 作定义内存表的首地址, FI
18、ELD伪操作定义内存表中各数据域 的字节长度,并可为每一个数据域指定一个标号,其他指令可 引用该标号该伪操作可以用”#”代替.,题目:定义一个内存表,其首地址为固定地址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
19、,该伪操作可以用”%”代替.,使用示例:,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可以用”其中0,2,4,6按字存储 d
20、ata2 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用于为双精度的浮点数分
21、配字对齐的内存单元,每个双精度浮点数占据两个字单元. DCFDU与DCFD的不同之处在于DCFDU分配的内存单元不能保证是严格对齐的. DCFS用于为单精度的浮点数分配字对齐的内存单元,每个单精度浮点数占据1个字单元. DCFSU与DCFS的不同之处在于DCFSU分配的内存单元不能保证是严格字对齐的.,ARM汇编语言伪指令-数据定义伪操作,DCI,DCI用于分配并初始化一段内存单元,且认为内存单元中的数值为指令数据当DCI位于ARM代码中的时候,分配的内存是严格字对齐的,当DCI位于Thumb代码中的时候,分配的内存是半字对齐的 注意:DCI伪操作和DCD伪操作非常类似,不同之处在于,DCI分
22、配的内存中数据被标识为指令,可用于通过宏指令来定义处理器指令系统不支持的指令,ARM汇编语言伪指令-数据定义伪操作,DCQ,DCQU,DCQ用于分配一段以双字(字节)为单位的内存,分配的内存要求必须字对齐,并用伪操作中的64位的整数数据初始化DCQU与DCQ的不同之处在于,DCQU分配的内存单元并不严格字对齐,ARM汇编语言伪指令-数据定义伪操作,DCW,DCWU,DCW用于分配一段半字对齐的半字内存单元,并用伪操作中的expr初始化DCWU与DCW的不同之处在于,DCWU分配的内存单元并不严格半字对齐,ARM汇编语言伪指令-汇编控制伪操作,IF、ELSE、ENDIF,IF,ELSE及ENDI
23、F伪操作能够根据条件把一段源代码包括在汇编语言程序内,或者将其排除在程序之外它与语言中的if语句的功能很相似 语法格式如下: IF condition Instruction or derectives ELSE Instruction or derectives ENDIF 注意: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 ;宏的原型,宏的名称为 ;mess
25、age,有一个参数$ a LCLS string ;声明一个局部串变量string String SETS “error” ;向该变量赋值 $ label ;代码 INFO 0,”string”:CC: : STR: $ a ;使用该串变量 MEND ;宏定义结束,ARM汇编语言伪指令-信息报告伪操作,信息报告伪操作用于汇编报告指示,ASSERT,ASSERT为断言错误伪操作,在汇编编译器对汇编程序的第 遍扫描中,如果ASSERT中的条件不成立,则ASSERT伪操作将 报告该错误信息 ASSERT伪操作用于保证源程序被汇编时满足相关的条件如 果条件不满足,则ASSERT伪操作报告错误类型,并终
26、止汇编,ARM汇编语言伪指令-信息报告伪操作,INFO,汇编诊断信息显示伪操作在汇编处理过程的第遍扫描或者 第遍扫描时,INFO伪操作报告诊断信息 INFO伪操作用于显示用户自定义的错误信息 INFO 数字表达式,字符串表达式(即诊断信息) 若 数字表达式=0,第遍扫描时,打印字符串. 若数字表达式0,第1遍扫描时,打印字符串,终止汇编.,OPT,设置列表选项伪操作,通过OPT伪操作可在源程序中设置列 表选项,ARM汇编语言伪指令-信息报告伪操作,TTL及SUBT,TTL伪操作在列表文件每一页的开头插入一个标题该TTL 伪操作将作用于其后的每一页,直到遇到新的TTL伪操作 SUBT伪操作在列表
27、文件每一页的开头插入一个子标题,该 SUBT伪操作将作用于其后的每一页,直到遇到新的SUBT 伪操作 TTL伪操作在列表文件的页顶部显示一个标题SUBT伪操作 在列表文件页标题的下面显示一个子标题如果要在列表文 件的第一页显示标题或子标题,TTL伪操作或SUBT伪操作要 放在源程序的第行当使用TTL或SUBT伪操作改变页标题 时,新的标题将在下一页开始起作用,TTL Title;在列表文件的第一页及后面的各页显示标题 SUBT Subtitle;在列表文件的第一页及后面的各页显示 ;子标题,ARM汇编语言伪指令-其他伪操作,CODE16及CODE32,CODE16伪操作告诉汇编编译器后面的指令
28、序列为16位的Thumb指令; CODE32伪操作告诉汇编编译器后面的指令序列为32位的ARM指令 注意:只是告诉编译器后面指令的类型,该伪操作本身并不进行程序状态的切换,ARM汇编语言伪指令-其他伪操作,EQU,为数字常量或标号定义一个字符名称,该伪指令可以用”*”代替.,使用示例:,num EQU 2 ;数字常量num的值为2 label_a EQU 0 x20 ;表示标号label_a的地址为0 x20,ARM汇编语言伪指令-其他伪操作,AREA,用于定义一个代码段或数据段,一个汇编程序至少包含一个代码段,使用示例:,AREA Example,CODE,READONLY 定义了一个代码段
29、,代码段的名称为Example,属性为READONLY,ARM汇编语言伪指令-其他伪操作,ENTRY,用于指定程序的入口点一个程序可含多个源文件,而一个源文件中最多只能有一个ENTRY(也可以没有),所以一个程序可有多个ENTRY ,但至少要有一个ENTRY,END,END伪操作告诉编译器已经到了源程序结尾每一个汇 编源程序都包含END伪操作,表示本源程序的结束,ARM汇编语言伪指令-其他伪操作,ALIGN,ALIGN伪操作通过添加补丁字节使当前位置满足一定的对齐方式.,ALIGN expr ,offset ,为指定对齐方式,可能的取值为的次幂 ,如1,2,4,8如果没有指定,则默认当前位 置
30、对齐到下一个字边界处,不指定表示将当前位置对齐到以expr 为单位的起始位置,ARM汇编语言伪指令-其他伪操作,ALIGN,ALIGN伪操作通过添加补丁字节使当前位置满足一定的对齐方式.,例如: ALIGN 8 表示将当前位置以个字的方式对齐, ALIGN 4, 3 当原始位置在0 x0001(字节),使用 ALIGN 4, 3以后,当前位置会转到 0 x0007(0 x0004+3),ARM汇编语言伪指令-其他伪操作,EXPORT及GLOBAL,EXPORT声明一个符号可被其他文件引用,相当于声明了一个全局变量GLOBAL 是EXPORT的同义词,注意:声明的符号名称是区分大小写的,ARM汇
31、编语言伪指令-其他伪操作,IMPORT,IMPORT伪操作告诉编译器当前的符号不是在本源文件中 定义的,而是在其他源文件中定义的,在本源文件中可能 引用该符号,而且不论本源文件是否实际引用该符号,该 符号都将被加入到本源文件的符号表中,IMPORT symbol WEAK,指定这个选项后,如果symbol在所有源文件 中都没有被定义,编译器也不会产生任何错 误信息,同时编译器也不会到当前没有被 INCLUDE进来的库中去查找该符号,Symbol为声明的符号名称,它是区分大小写的,ARM汇编语言伪指令-其他伪操作,EXTERN,EXTERN伪操作告诉编译器当前的符号不是在本源文件中 定义的,而是
32、在其他源文件中定义的,在本源文件中可能 引用该符号,与IMPORT不同之处在于,如果本源文件没有实际引用该符号,该符号将不会被加入到本源文件的符号表中,EXTERN symbol WEAK,指定这个选项后,如果symbol在所有源文件 中都没有被定义,编译器也不会产生任何错 误信息,同时编译器也不会到当前没有被 INCLUDE进来的库中去查找该符号,Symbol为声明的符号名称,它是区分大小写的,ARM汇编语言伪指令-其他伪操作,GET及INCLUDE,GET伪操作将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理,INCLUDE是同义 GET filename ;其中f
33、ilename为被包含的源文件的名称, ;这里可使用路径信息,ARM汇编语言伪指令-其他伪操作,INCBIN,INCBIN伪操作将一个文件包含到当前源文件中,被包含 的文件不进行汇编处理 通常可使用INCBIN将一个可执行文件或者任意的数据包含到当前文件中被包含的执行文件或数据将被原封不动地放到当前文件中,编译器从INCBIN伪操作后面开始继续处理 INCBIN filename ;其中filename为被包含的文件名 ;称,这里可使用路径信息,INCBIN file1.dat INCBIN c:windowsfile2.txt 注意:这里所包含的文件名称及其路径信息中都不能有空格,ARM汇编
34、语言伪指令-其他伪操作,KEEP,KEEP伪操作告诉编译器将局部符号包含在目标文件中符号表中可使调试工作更加方便 语法格式如下: KEEP symbol ;其中symbol为要保留的局部标号,如果没有指定symbol,则除了基于寄存器外的所有符号将被包含在目标文件的符号表中,label CMP R0 ,R1 KEEP label ;将标号label包含到目标文件 ;的符号表中,ARM汇编语言伪指令-其他伪操作,NOFP,使用NOFP伪操作禁止源程序中包含浮点运算指令 当系统中没有硬件或软件仿真代码支持浮点运算指令时,使用NOFP伪操作禁止在源程序中使用浮点运算指令这时如果源程序中包含浮点运算指
35、令,或者在浮点运算指令的后面使用NOFP伪操作,编译器将会报告错误,ARM汇编语言伪指令-其他伪操作,REQUIRE,REQUIRE伪操作用于指定段之间的相互依赖关系 格式如下: REQUIRE label ;其中label为所需要的标号的名称 当进行连接处理包含有“REQUIRE label”伪操作的源文件时,定义label的源文件也将被包含,ARM汇编语言伪指令-其他伪操作,REQUIRE8及PRESERVE8,REQUIRE8伪操作指示当前代码中要求数据栈字节对齐 PRESERVE8伪操作表示当前代码中数据栈是字节对齐的 使用说明: LDRD及STRD指令要求内存单元地址是字节对齐的当在
36、程序中使用这些指令在数据栈中传送数据时,要求该数据栈是字节对齐的,这时就需要用REQUIRE8伪操作来说明链接器要保证要求字节对齐的数据栈代码只能被数据栈是字节对齐的代码调用,ARM汇编语言伪指令-其他伪操作,ROUT,ROUT伪操作用于定义局部变量的有效范围 语法格式如下: name ROUT ;其中name为所定义的作用范围的名称 使用说明:当没有使用ROUT伪操作定义局部变量的作用范围时,局部变量的作用范围为其所在的段ROUT伪操作作用的范围为本ROUT 伪操作和下一个ROUT(指同一个段中ROUT伪操作)伪操作之间若只有一个ROUT,则局部标号的作用范围在ROUT与段结束伪操作(END
37、)之间,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伪操作,对应地给出了常用
38、的GNU编译环境下的伪操作 1、常量编译控制伪操作 2、字符编译控制伪操作 3、汇编程序代码控制伪操作 4、宏编译控制伪操作 5、条件编译控制伪操作 6、反汇编代码控制伪操作 7、其他常用伪操作,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.byte,.byte伪操作用于分配一段字节内存单元(分配的内存都 是字节对齐的),并用伪指令中的expr初始化,语法格式如下: byte expr ,expr. 其中expr可以为数字表达式或程序中的标号 byte 21,48,89,0 x13,oxFF,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.hword及.short,.hword及
39、.short都是作用于分配一段半字内存单元(分配的 内存都是半字对齐的),并用伪指令中的expr初始化,语法格式如下: hword expr ,expr. 其中expr可以为数字表达式或程序中的标号 hword 21,48,89,0 x1133,ox77FF,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.word、.long及.int,.word、 .long 及.int伪操作用于分配一段字内存单元(分配 的内存都是字对齐的),并用伪指令中的expr初始化,语法格式如下: word expr ,expr. 其中expr可以为数字表达式或程序中的标号 word 21, 0 x110033
40、,ox77FF2255 . int 17, 0 x77889933 . 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编
41、译环境下的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缺
42、省为 fill 8,4,0 xFFFFFFFF 分配个字节的内存单元,并将每个内存单元内容 初始化为0 xFFFFFFFF,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.zero,.zero伪操作用于分配一段字节内存单元并用来填充内存,语法格式如下: zero size fill 400 分配400字节的内存单元,并用0初始化,GNU编译环境下的ARM伪指令-常量编译控制伪操作,.space及.skip,.space与.skip伪操作用于分配一段内存单元用value将内存单元初始化若value缺省,则用0初始化内存单元,,语法格式如下: space size ,value skip s
43、ize ,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 ,0 x01D800
44、00 /*对PLL控制器设置*/ equ CLKCON ,0 x01d80004 /*对时钟控制器设置*/,GNU编译环境下的ARM伪指令-字符编译控制伪操作,.global及.globl,.global和.globl声明一个符号可被其他文件引用,相当于声明了一个全局变量,语法格式如下: global symbol 其中:symbol为声明的符号名称,它是区分大小写的,.extern,.extern伪操作用于声明一个符号可被其他文件引用,相当于声明了一个全局变量,GNU编译环境下的ARM伪指令-汇编程序代码控制伪操作,.section,.section伪操作用于定义域中包含的段段可以是.tex
45、t(只读代码区),.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,
46、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,标记汇编文件的结束行,
47、即标号后的代码不处理,.include,用于将一个源文件包含到当前源文件中,一般是将该源文件用到的库文件包含到本源文件中,.include “option.a” .include “44b0.h”,GNU编译环境下的ARM伪指令-汇编程序代码控制伪操作,.align及.balign,.align和.balign伪操作用于表示对齐方式,通过添加填充字节使当前位置满足一定的对齐方式,语法格式如下: .align alignment ,fill ,max 其中:alignment用于指定对齐方式,可能的取值为的次幂,缺省为fill是填充内容,缺省时用填充max是填充字节数最大值,如果填充字节超过ma
48、x,就不进行对齐,GNU编译环境下的ARM伪指令-宏编译控制伪操作,.macro及.endm,.macro伪操作标识宏定义的开始,.endm标识宏定义的结束,用.macro 和.endm定义一段代码,称为宏定义体,这样在程序中就可通过宏指令多次调用该代码段,语法格式如下: .macro macronameparameter,parameter. /*代码段*/ . .endm 其中:macroname为所定义的宏的名称 parameter为宏指令的参数,宏参数的定义可使用逗号分隔,.exitm,用于提前退出宏,GNU编译环境下的ARM伪指令-条件编译控制伪操作,.ifdef、.else及.en
49、dif,.ifdef、.else及.endif伪操作是汇编控制伪操作,当满足某条件时,对一组语句进行编译,当条件不满足时,则编译另一组语句,其中else可以缺省,语法格式如下: .ifdef condition Instruction or derectives . .else . .endif 注意:condition表示控制条件,可以是逻辑表达式或标识符Instruction or derectives 表示一组语句,可以是代码指令或伪指令,GNU编译环境下的ARM伪指令-反汇编代码控制伪操作,.eject 用于在汇编符号列表文件中插入一分页符 .list 用于产生汇编列表(从.list到
50、.nolist ) .nolist 伪操作用于表示汇编列表结束处 .title 语法格式为.title “heading” 即使用“heading”作为标题(位于汇编列表文件中文件名的下一行) .sbttl 语法格式为.sbttl “heading” 即使用“heading”作为子标题(位于.title标题的下一行),GNU编译环境下的ARM伪指令-其他常用伪操作,.ltorg,.ltorg伪操作用于在当前段(一般是.text段)的当前地址(字对齐地址)产生一个文字池.ltorg一般放在跳转指令的后面.,语法格式如下: .ltorg 使用示例: #exit from DRAM/SDRAM se
51、lf 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伪操作用于打印信息到标准输出.,
52、例如: .print “Something is broken”,.fail,格式为.fail expr .fail伪操作用于汇编文件时产生警告.当expr小于500时产 生错误信息,否则产生警告.,ARM汇编程序实例,注意:ADS编译环境下的汇编代码与GNU编译环境下(Embest IDE内部集成GNU的开发工具)有较多不同点,主要是符号及伪操作的不同.,注释行以/* */代替”;” 操作数及运算符号替换 伪操作符替换,操作数及运算符替换如下所示,伪操作数替换如下所示,伪操作数替换如下所示,5.2 ARM汇编语言语句格式,ARM汇编中的文件格式:,ARM源程序文件可由任意一种文件编辑器来编写
53、程序代码,它一般为文件格式。在ARM程序设计中,常用的源文件可简单分为以下几种,不同种类的文件有不同的后缀名。,5.2 ARM汇编语言语句格式,ARM汇编语言语句格式:,symbolinstruction|directive|pseudo-instruction;comment,为符号。 在ARM汇编语言中,符号必须从一行的行头开始,并且 符号中不能包含空格,在指令和伪指令中符号用作地址标号, 在有些伪操作中,符号用作变量或者常量.,为指令。在ARM汇编语言中,指令不能从一行的行头 开始.在一行语句中,指令的前面必须有空格或符号.,为伪操作,伪指令,为语句的注释.在ARM汇编语 言中注释以分号
54、”;”开头.注 释的结尾即为一行的结尾, 注释也可以单独占用一行.,5.2 ARM汇编语言语句格式,ARM汇编语言的语句格式: 注意: 在ARM 汇编语言中,各个指令、伪指令及伪操作的助记符可全部用大写字母,也可全部用小写字母,但不能在一个助记符中既有大写字母又有小写字母. 源程序中,在语句之间适当地插入空行,可提高源代码的可读性. 如果一条语句很长,为了提高可读性,可使用”将该长语句分成若干行来写,在”之后不能再有其他字符,包括空格和制表符.,5.2 ARM汇编语言语句格式,ARM汇编语言中的符号,在ARM汇编语言中,符号可代表地址,变量和数字常量.当符号代表地址时又称为标号.符号包括变量,
55、数字常量,标号和局部标号.符号的命名规则如下:,符号由大小写字母,数字以及下划线组成. 局部标号以数字开头,其他符号都不能以数字开头. 符号是区分大小写的 符号在其作用范围内必须惟一,即在其作用范围内不可有同名的符号 程序中的符号不能与系统内部变量或者系统预定义的符号同名. 程序中的符号通常不要与指令助记符或者伪操作同名.,5.2 ARM汇编语言语句格式,ARM汇编语言中的符号-变量,在ARM汇编语言中,变量有数字变量、逻辑变量和串变量3种 类型.变量的类型在程序中是不能改变的. 数字变量的取值范围为数字常量和数字表达式所能表示的数值范围 逻辑变量的取值为true和false. 串变量的取值范
56、围为串表达式可表示的范围.,说明:在ARM汇编语言中,使用GBLA、GBLL、GBLS伪操作声明 全局变量,使用LCLA、LCLL、LCLS伪操作声明局部变量,使用 SETA,SETL,SETS伪操作为这些变量赋值.,5.2 ARM汇编语言语句格式,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.,
57、5.2 ARM汇编语言语句格式,ARM汇编语言中的符号-标号,在ARM汇编语言中,标号是表示程序中的指令或数据地址的符号,一般它代表一个地址.根据地址值的生成方式可有3种:,基于PC的标号:是位于(将要跳转到的)目标指令前或程序中数据定义伪操作前的标号,在汇编时将被处理成PC值加上(或减去)一个数字常量.它常用于表示跳转指令的目标地址,或者代码段中所嵌入的少量数据. 基于寄存器的标号:通常用MAP和FILED伪操作定义该标号,也可用EQU伪操作定义.这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数字常量.它常用于访问位于数据段中的数据. 绝对地址:是一个32位的数字量,寻址的范围为0231-1,即直接可寻址整个内存空间.,5.2 ARM汇编语言语句格式,ARM汇编语言中的符号-局部标号,局部标号主要用于局部范围代码.它由一个099数字和一个通常表示该局部标号作用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CPIA 0064-2024光伏封装胶膜表面粗糙度测试方法
- T/TIC 004-2023生态环境监测机构综合能力评价通用规范
- T/FSHW 05-2025道路保洁质量与作业规范
- T/CI 1481-2026农民用水合作组织运行制度设计规程
- T/CAAMTB 191-2024车用70MPa加氢口性能试验方法
- T/CPF 0114-2025温室气体 产品碳足迹量化方法与要求 成型纸盒
- 2025~2026学年安徽省阜阳市临泉县校联考北师大版六年级上册11月期中数学试卷【附答案】
- 2025-2026学年陕西省咸阳市初中政治八年级期末下册自测专项攻坚题附答案
- 人工智能在生物多样性监测中的应用
- Photoshop基础技能考核试题(含详细答案)
- 2026年中国太平洋保险集团股份有限公司人员招聘笔试参考题库及详细答案解析
- 2026云南省综合评标专家库专家考试历年参考题库含答案详解
- 云南省西双版纳傣族自治州景洪市2026年公务员遴选试题题库及答案
- 临床检验标准化实验室完整SOP程序文件
- 劳动用工风险防控手册
- 2026年大数据工程师笔试试卷(附答案)
- 林下种植林地协议
- 第7课《社会主义好》第一课时(教学课件)
- 面料染色工艺质量控制细则
- 衰弱老年住院患者护理专家共识(2026完整版)
- 交通运输部所属事业单位统一招聘笔试真题2025
评论
0/150
提交评论