




已阅读5页,还剩110页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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的取值范围: 当地址值不是字对齐时,其取值范围为-255255字节; 当地址值是字对齐时,其取值范围为-10201020字节; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADR伪指令在同一个代码段中。 ARM伪指令中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地 址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编 译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能 用两条指令实现,则产生错误,编译失败。 ADRLcond register,expr ADRL伪指令格式 指令执行的条件码加载的目标寄存器地址表达式 地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-64K64K; 当地址值是字对齐时,其取值范围为-256K256K; 当地址值是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可以用”其中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,READONLY 定义了一个代码段,代码段的名称为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 ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳动的发言稿300字
- 时间管理课件-哈佛
- 车床操作规程培训
- 少先队大队委培训
- 二零二五年电商代运营品牌形象授权使用合同
- 二零二五年度变电工程高空作业安全防护合同
- 二零二五年度互联网+农业服务平台建设合同
- 二零二五年度材料代购及绿色环保验收合同范本
- 二零二五年度船舶抵押贷款合同规范文本
- 二零二五年新型电商代运营服务合同示范文本
- 2025至2031年中国石榴果汁行业投资前景及策略咨询研究报告
- JG/T 475-2015建筑幕墙用硅酮结构密封胶
- 投资学(汪昌云第五版)习题及参考答案
- 森林消防考试题库及答案
- 外墙高空蜘蛛人作业施工方案
- 2025年工业锅炉G1证理论考试笔试试题6(200题)附答案
- CNAS-CC105-2016 《确定管理体系审核时间》(2018年第一次修订)
- 2025年初中语文教师招聘面试八年级下册逐字稿第25课马说
- 《船舶导航系统》课件
- 2019-2025年初级银行从业资格之初级风险管理模拟题库及答案下载
- 网络安全产品代理销售合同
评论
0/150
提交评论