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

下载本文档

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

文档简介

ARM汇编语言的语法知识 ARM汇编语言语句格式 ARM汇编语言的语句格式 symbol instruction directive pseudo instruction comment 其中 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 SDTIDE开发环境集成了GNU开发工具的IDE开发环境 ARM汇编语言伪指令 ARM伪指令 ARM伪指令不属于ARM指令集中的指令 是为了编程方便而定义的 伪指令可以像其它ARM指令一样使用 但在编译时这些指令将被等效的ARM指令代替 ARM伪指令有四条 分别为ADR伪指令 ADRL伪指令 LDR伪指令 NOP伪指令 ARM伪指令 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 在汇编编译器编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能 若不能用一条指令实现 则产生错误 编译失败 ADR cond register expr ADR伪指令格式 指令执行的条件码 加载的目标寄存器 地址表达式 地址表达式expr的取值范围 当地址值不是字对齐时 其取值范围为 255 255字节 当地址值是字对齐时 其取值范围为 1020 1020字节 当地址值是16字节对齐时 其取值范围将更大 该地址必须与ADR伪指令在同一个代码段中 ARM伪指令 中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 比ADR伪指令可以读取更大范围的地址 在汇编编译器编译源程序时 ADRL伪指令被编译器替换成两条合适的指令 若不能用两条指令实现 则产生错误 编译失败 ADRL cond register expr ADRL伪指令格式 指令执行的条件码 加载的目标寄存器 地址表达式 地址表达式expr的取值范围 当地址值不是字对齐时 其取值范围为 64K 64K 当地址值是字对齐时 其取值范围为 256K 256K 当地址值是16字节对齐时 其取值范围将更大 该地址必须与ADRL伪指令在同一个代码段中 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 即数据缓冲区 并使用一条基于PC相对偏移的LDR指令从文字池读出该常量 LDR cond register expr LDR伪指令格式 指令执行的条件码 加载的目标寄存器 基于PC的地址表达式或外部表达式 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条基于PC相对偏移的LDR指令从文字池读出常量 应用示例 源程序 LDRR1 InitStack InitStackMOVR0 LR 使用伪指令将程序标号InitStack的地址存入R1 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 地址 程序代码 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标号的地址 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条基于PC相对偏移的LDR指令从文字池读出常量 注意 1 从指令位置到文字池的偏移量必须小于4KB 2 与ARM指令的LDR相比 伪指令的LDR的参数有 号 ARM伪指令 空操作伪指令 NOP伪指令在汇编时将会被代替成ARM中的空操作 比如可能是 MOVR0 R0 指令等 NOP可用于延时操作 NOP NOP伪指令格式 应用示例 延时子程序 DelayNOP 空操作NOPNOPSUBSR1 R1 1 循环次数减一BNEDelay 如果循环没有结束 跳转Delay继续MOVPC LR 子程序返回 ADS编译环境下的ARM伪操作和宏指令 ADS编译环境下的伪操作有如下几种 1 符号定义伪操作4 框架描述伪操作2 数据定义伪操作 信息报告伪操作3 汇编控制伪操作 其他伪操作 ARM汇编语言伪操作 符号定义伪操作 全局变量声明 GBLA声明一个全局算术变量 并将其初始化为0GBLL声明一个全局逻辑变量 并将其初始化为 FALSE GBLS声明一个全局字符串 并将其初始化为NULL 使用示例 GBLAnum1GBLLlogic xGBLSstring y 符号定义伪操作用于定义ARM汇编程序中的变量 对变量进行赋值以及定义寄存器名称 ARM汇编语言伪指令 符号定义伪操作 局部变量声明 LCLA声明一个局部算术变量 并将其初始化为0LCLL声明一个局部逻辑变量 并将其初始化为 FALSE LCLS声明一个局部字符串 并将其初始化为NULL 使用示例 LCLAnum1LCLLlogic xLCLSstring y 注意 局部变量只能在宏中进行声明和使用 ARM汇编语言伪指令 符号定义伪操作 变量赋值 SETA给一个全局或局部算术变量赋值SETL给一个全局或局部逻辑变量赋值SETS给一个全局或局部字符串变量赋值 使用示例 num1SETA0 xfflogic xSETL TRUE string ySETS stringtest 注意 在向变量赋值前 必须先声明该变量 ARM汇编语言伪指令 符号定义伪操作 RLIST 为通用寄存器列表定义名称 定义的名称可以在LDM STM指令中使用 列表中的寄存器以逗号分隔 连续编号的寄存器可以用 包括 例如 R7 R9表示寄存器R7 R8 R9 使用示例 Reg listRLIST R0 R4 R6 R7 R9 STMFDSP Reg list 将R0 R4 R6 R7 R9的内 容压入满降序栈中保存 ARM汇编语言伪指令 符号定义伪操作 RN 为寄存器定义名称 使用示例 SPRNR13 将R13的名称定义为SP ARM汇编语言伪指令 符号定义伪操作 CN CP CN为协处理器的寄存器定义名称CP为协处理器定义名称 使用示例 powerCN6 将协处理器寄存器6的名称定义为powerdmuCP6 将协处理器6的名称定义为dmu ARM汇编语言伪指令 符号定义伪操作 DN SN FN DN为一个双精度的VFP寄存器定义名称SN为一个单精度的VFP寄存器定义名称FN为一个FPA浮点寄存器定义名称 使用示例 heightDN6 将VFP双精度寄存器6名称定义为heightwidthSN16 将VFP单精度寄存器16名称定义为widthlowerFN6 将浮点寄存器6名称定义为lower ARM汇编语言伪指令 数据定义伪操作 LTORG伪操作用于数据缓冲池 也称为文字池 的开始 在使用伪指令LDR时 常常需要在适当的地方加入LTORG声明数据缓冲池 LDR加载的数据暂时放于数据缓冲池 LTORG伪操作通常放在无条件跳转指令之后 或者子程序返回指令之后 这样处理器就不会错误地将数据池中的数据当做指令来执行 用LTORG伪指令定义数据缓冲池举例Funel 子程序LDRR1 0 x8000 将0 x8000加载到R1MOVPC LRLTORG 定义数据缓冲池 存放0 x8000DataSPACE40 从当前位置开始分配40字节的内存 单元 并初始化为0 ARM汇编语言伪指令 数据定义伪操作 MAP MAP用于定义一个结构化的内存表的首地址 此时 内存表的位置计数器设置成该地址值 该伪操作可以用 代替 MAP伪操作举例MAPfun fun就是内存表的首地址MAP0 x100 R9 内存表的首地址为R9 0 x100 ARM汇编语言伪指令 数据定义伪操作 FIELD FIELD用于定义一个结构化内存表中的数据域 MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构 MAP伪操作定义内存表的首地址 FIELD伪操作定义内存表中各数据域的字节长度 并可为每一个数据域指定一个标号 其他指令可引用该标号 该伪操作可以用 代替 题目 定义一个内存表 其首地址为固定地址8192 该内存表中包含 个数据域 consta长度为4字节 constb长度为4字节 x长度为8字节 y长度为8字节 string长度为16字节 MAP8192constaFIELD4constbFIELD4xFIELD8yFIELD8stringFIELD16 ARM汇编语言伪指令 数据定义伪操作 SPACE SPACE伪操作常常用来分配一块连续的内存区域供程序使用 并且将这个内存区域初始化为0 该伪操作可以用 代替 使用示例 dataroomSPACE256 以dataroom为起始地址 分配256 字节的内存单元 并初始化为0 ARM汇编语言伪指令 数据定义伪操作 DCB DCB用于定义并初始化1字节或多字节的内存区域 该伪操作可以用 代替 使用示例 data1DCB1 3 5stringDCB hello 构造一个以NULL结尾的字符串 字 符串的起始地址为string ARM汇编语言伪指令 数据定义伪指令 DCD DCDU DCD和DCDU用于定义并初始化一个或多个字的内存区域 其中DCD可以用 代替 DCD和DCDU的区别在于DCD可以保证分配的内存单元是严格的字对齐的 而DCDU不能保证 使用示例 data1DCD0 2 4 6 其中0 2 4 6按字存储data2DCDU1 3 5 ARM汇编语言伪指令 数据定义伪操作 DCDO DCDO用于定义并初始化一个或多个字的内存区域 且保证分配的内存单元是字对齐的 label DCDOexpr expr DCDO与DCD的区别在于DCDO将字单元初始化为expr相对于静态基址寄存器R9 SB 的偏移量 使用示例 IMPORTexternlabeldata1DCDOexternlabel 将地址为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语句的功能很相似 语法格式如下 IFconditionInstructionorderectivesELSEInstructionorderectivesENDIF注意 condition表示控制条件 可以是逻辑表达式或标识符 Instructionorderectives表示一组语句 可以是代码指令或伪指令 注意 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 声明一个宏 labelmessage a 宏的原型 宏的名称为 message 有一个参数 aLCLSstring 声明一个局部串变量stringStringSETS error 向该变量赋值 label 代码INFO0 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伪操作改变页标题时 新的标题将在下一页开始起作用 TTLTitle 在列表文件的第一页及后面的各页显示标题SUBTSubtitle 在列表文件的第一页及后面的各页显示 子标题 ARM汇编语言伪指令 其他伪操作 CODE16及CODE32 CODE16伪操作告诉汇编编译器后面的指令序列为16位的Thumb指令 CODE32伪操作告诉汇编编译器后面的指令序列为32位的ARM指令 注意 只是告诉编译器后面指令的类型 该伪操作本身并不进行程序状态的切换 ARM汇编语言伪指令 其他伪操作 EQU 为数字常量或标号定义一个字符名称 该伪指令可以用 代替 使用示例 numEQU2 数字常量num的值为2label aEQU0 x20 表示标号label a的地址为0 x20 ARM汇编语言伪指令 其他伪操作 AREA 用于定义一个代码段或数据段 一个汇编程序至少包含一个代码段 使用示例 AREAExample 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伪操作通过添加补丁字节使当前位置满足一定的对齐方式 例如 ALIGN8表示将当前位置以 个字的方式对齐 ALIGN4 3当原始位置在0 x0001 字节 使用ALIGN4 3以后 当前位置会转到0 x0007 0 x0004 3 ARM汇编语言伪指令 其他伪操作 EXPORT及GLOBAL EXPORT声明一个符号可被其他文件引用 相当于声明了一个全局变量 GLOBAL是EXPORT的同义词 注意 声明的符号名称是区分大小写的 ARM汇编语言伪指令 其他伪操作 IMPORT IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的 而是在其他源文件中定义的 在本源文件中可能引用该符号 而且不论本源文件是否实际引用该符号 该符号都将被加入到本源文件的符号表中 IMPORTsymbol WEAK 指定这个选项后 如果symbol在所有源文件中都没有被定义 编译器也不会产生任何错误信息 同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号 Symbol为声明的符号名称 它是区分大小写的 ARM汇编语言伪指令 其他伪操作 EXTERN EXTERN伪操作告诉编译器当前的符号不是在本源文件中定义的 而是在其他源文件中定义的 在本源文件中可能引用该符号 与IMPORT不同之处在于 如果本源文件没有实际引用该符号 该符号将不会被加入到本源文件的符号表中 EXTERNsymbol WEAK 指定这个选项后 如果symbol在所有源文件中都没有被定义 编译器也不会产生任何错误信息 同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号 Symbol为声明的符号名称 它是区分大小写的 ARM汇编语言伪指令 其他伪操作 GET及INCLUDE GET伪操作将一个源文件包含到当前源文件中 并将被包含的文件在其当前位置进行汇编处理 INCLUDE是同义 GETfilename 其中filename为被包含的源文件的名称 这里可使用路径信息 ARM汇编语言伪指令 其他伪操作 INCBIN INCBIN伪操作将一个文件包含到当前源文件中 被包含的文件不进行汇编处理 通常可使用INCBIN将一个可执行文件或者任意的数据包含到当前文件中 被包含的执行文件或数据将被原封不动地放到当前文件中 编译器从INCBIN伪操作后面开始继续处理 INCBINfilename 其中filename为被包含的文件名 称 这里可使用路径信息 INCBINfile1 datINCBINc windows file2 txt注意 这里所包含的文件名称及其路径信息中都不能有空格 ARM汇编语言伪指令 其他伪操作 KEEP KEEP伪操作告诉编译器将局部符号包含在目标文件中符号表中 可使调试工作更加方便 语法格式如下 KEEP symbol 其中symbol为要保留的局部标号 如果没有指定symbol 则除了基于寄存器外的所有符号将被包含在目标文件的符号表中 labelCMPR0 R1KEEPlabel 将标号label包含到目标文件 的符号表中 ARM汇编语言伪指令 其他伪操作 NOFP 使用NOFP伪操作禁止源程序中包含浮点运算指令 当系统中没有硬件或软件仿真代码支持浮点运算指令时 使用NOFP伪操作禁止在源程序中使用浮点运算指令 这时如果源程序中包含浮点运算指令 或者在浮点运算指令的后面使用NOFP伪操作 编译器将会报告错误 ARM汇编语言伪指令 其他伪操作 REQUIRE REQUIRE伪操作用于指定段之间的相互依赖关系 格式如下 REQUIRElabel 其中label为所需要的标号的名称 当进行连接处理包含有 REQUIRElabel 伪操作的源文件时 定义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伪操作举例 RoutineROUT 定义局部标号的有效范围 名称为routine 1routine routine范围内的局部标号 BEQ 2routine 若条件成立 则跳转到routine范围内的局部标号2 BGE 1routine 若条件成立 则跳转到routine范围内的局部标号1 2routine routine范围内的局部标号2 otherroutineROUT 定义新的局部标号的有效范围 GNU编译环境下的ARM伪操作与宏指令 针对上述所讲的ARM伪操作 对应地给出了常用的GNU编译环境下的伪操作 1 常量编译控制伪操作2 字符编译控制伪操作3 汇编程序代码控制伪操作4 宏编译控制伪操作5 条件编译控制伪操作6 反汇编代码控制伪操作7 其他常用伪操作 GNU编译环境下的ARM伪指令 常量编译控制伪操作 byte byte伪操作用于分配一段字节内存单元 分配的内存都是字节对齐的 并用伪指令中的expr初始化 语法格式如下 byteexpr expr 其中expr可以为数字表达式或程序中的标号 byte21 48 89 0 x13 oxFF GNU编译环境下的ARM伪指令 常量编译控制伪操作 hword及 short hword及 short都是作用于分配一段半字内存单元 分配的内存都是半字对齐的 并用伪指令中的expr初始化 语法格式如下 hwordexpr expr 其中expr可以为数字表达式或程序中的标号 hword21 48 89 0 x1133 ox77FF 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 GNU编译环境下的ARM伪指令 常量编译控制伪操作 ascii ascii伪指令用于定义字符串expr 非0结束符 语法格式如下 asciiexpr expr ascii Howareyou 定义字符串 不是以 0 结束 asciz及 string asciz和 string伪指令都是用于定义字符串expr 以 0 结束 ascizexpr expr asciz amastudent 定义字符串 以 0 结束 GNU编译环境下的ARM伪指令 常量编译控制伪操作 float及 single float和 single伪操作用于定义32位IEEE浮点数expr 语法格式如下 floatexpr expr float0F3 14 0F359 2E11 double double伪操作用于定义64位IEEE浮点数expr doubleexpr expr double0F2E1 GNU编译环境下的ARM伪指令 常量编译控制伪操作 fill fill伪指令用于分配一段字节内存单元 语法格式如下 fillrepeat size value 其中size缺省为 value缺省为 fill8 4 0 xFFFFFFFF分配 个 字节的内存单元 并将每个内存单元内容初始化为0 xFFFFFFFF GNU编译环境下的ARM伪指令 常量编译控制伪操作 zero zero伪操作用于分配一段字节内存单元 并用 来填充内存 语法格式如下 zerosize fill400分配400字节的内存单元 并用0初始化 GNU编译环境下的ARM伪指令 常量编译控制伪操作 space及 skip space与 skip伪操作用于分配一段内存单元 用value将内存单元初始化 若value缺省 则用0初始化内存单元 语法格式如下 spacesize value skipsize value 举例 space100XFF 分配10字节的内存单元 并用0XFF初始化 skip22 分配22字节的内存单元 并用0初始化 GNU编译环境下的ARM伪指令 字符编译控制伪操作 equ及 set equ和 set伪操作用于为数字常量 基于寄存器的值和程序中的标号定义一个字符名称 语法格式如下 equsymbol expr setsymbol expr其中 expr为基于寄存器的地址值 程序中的标号 32位的地址常量或者32位的常量 symbol为 equ伪指令作为expr定义的字符名称 equPLLCON 0 x01D80000 对PLL控制器设置 equCLKCON 0 x01d80004 对时钟控制器设置 GNU编译环境下的ARM伪指令 字符编译控制伪操作 global及 globl global和 globl声明一个符号可被其他文件引用 相当于声明了一个全局变量 语法格式如下 globalsymbol其中 symbol为声明的符号名称 它是区分大小写的 extern extern伪操作用于声明一个符号可被其他文件引用 相当于声明了一个全局变量 GNU编译环境下的ARM伪指令 汇编程序代码控制伪操作 section section伪操作用于定义域中包含的段 段可以是 text 只读代码区 data 可读 写数据区 及 bss 为静态和全局变量保留的可读 写的数据区 语法格式如下 sectionexpr section bss 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为起始地址 GNU编译环境下的ARM伪指令 汇编程序代码控制伪操作 code16 32 code伪操作用于选择当前汇编指令的指令集 参数16选择Thumb指令集 参数32选择ARM指令集 举例 code32 表明下面是ARM指令 header ADRR0 start 1BXR0 code16 表明下面是Thumb指令 start MOVR0 10MOVR1 3BLdoadd 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定义一段代码 称为宏定义体 这样在程序中就可通过宏指令多次调用该代码段 语法格式如下 macromacroname parameter parameter 代码段 endm其中 macroname为所定义的宏的名称 parameter为宏指令的参数 宏参数的定义可使用逗号分隔 exitm 用于提前退出宏 GNU编译环境下的ARM伪指令 条件编译控制伪操作 ifdef else及 endif ifdef else及 endif伪操作是汇编控制伪操作 当满足某条件时 对一组语句进行编译 当条件不满足时 则编译另一组语句 其中else可以缺省 语法格式如下 ifdefconditionInstructionorderectives else endif注意 condition表示控制条件 可以是逻辑表达式或标识符 Instructionorderectives表示一组语句 可以是代码指令或伪指令 GNU编译环境下的ARM伪指令 反汇编代码控制伪操作 eject用于在汇编符号列表文件中插入一分页符 list用于产生汇编列表 从 list到 nolist nolist伪操作用于表示汇编列表结束处 title语法格式为 title heading 即使用 heading 作为标题 位于汇编列表文件中文件名的下一行 sbttl语法格式为 sbttl heading 即使用 heading 作为子标题 位于 title标题的下一行 GNU编译环境下的ARM伪指令 其他常用伪操作 ltorg ltorg伪操作用于在当前段 一般是 text段 的当前地址 字对齐地址 产生一个文字池 ltorg一般放在跳转指令的后面 语法格式如下 ltorg使用示例 exitfromDRAM SDRAMselfrefreshmodeLDRR0 REFRESHSTRR3 R0 MOVPC LR ltorg GNU编译环境下的ARM伪指令 其他常用伪操作 req req伪操作为一个特定的寄存器定义名称 以方便程序员记忆该寄存器的功能 语法格式如下 reqname expr其中expr为某个寄存器的编码 name为本伪指令给寄存器定义的名称 使用示例 reqCOUNT 7 定义寄存器7为COUNT GNU编译环境下的ARM伪指令 其他常用伪操作 err err伪操作用于使编译时产生错误报告 print print伪操作用于打印信息到标准输出 例如 print Somethingisbroken fail 格式为 failexpr fail伪操作用于汇编文件时产生警告 当expr小于500时产生错误信息 否则产生警告 ARM汇编程序实例 注意 ADS编译环境下的汇编代码与GNU编译环境下 EmbestIDE内部集成GNU的开发工具 有较多不同点 主要是符号及伪操作的不同 注释行以 代替 操作数及运算符号替换 伪操作符替换 操作数及运算符替换如下所示 伪操作数替换如下所示 伪操作数替换如下所示 5 2ARM汇编语言语句格式 ARM汇编中的文件格式 ARM源程序文件可由任意一种文件编辑器来编写程序代码 它一般为文件格式 在ARM程序设计中 常用的源文件可简单分为以下几种 不同种类的文件有不同的后缀名 5 2ARM汇编语言语句格式 ARM汇编语言语句格式 symbol instruction directive pseudo instruction comment 为符号 在ARM汇编语言中 符号必须从一行的行头开始 并且符号中不能包含空格 在指令和伪指令中符号用作地址标号 在有些伪操作中 符号用作变量或者常量 为指令 在ARM汇编语言中 指令不能从一行的行头开始 在一行语句中 指令的前面必须有空格或符号 为伪操作 伪指令 为语句的注释 在ARM汇编语言中注释以分号 开头 注释的结尾即为一行的结尾 注释也可以单独占用一行 5 2ARM汇编语言语句格式 ARM汇编语言的语句格式 注意 在ARM汇编语言中 各个指令 伪指令及伪操作的助记符可全部用大写字母 也可全部用小写字母 但不能在一个助记符中既有大写字母又有小写字母 源程序中 在语句之间适当地插入空行 可提高源代码的可读性 如果一条语句很长 为了提高可读性 可使用 将该长语句分成若干行来写 在 之后不能再有其他字符 包括空格和制表符 5 2ARM汇编语言语句格式 ARM汇编语言中的符号 在ARM汇编语言中 符号可代表地址 变量和数字常量 当符号代表地址时又称为标号 符号包括变量 数字常量 标号和局部标号 符号的命名规则如下 符号由大小写字母 数字以及下划线组成 局部标号以数字开头 其他符号都不能以数字开头 符号是区分大小写的 符号在其作用范围内必须惟一 即在其作用范围内不可有同名的符号 程序中的符号不能与系统内部变量或者系统预定义的符号同名 程序中的符号通常不要与指令助记符或者伪操作同名 5 2ARM汇编语言语句格式 ARM汇编语言中的符号 变量 在ARM汇编语言中 变量有数字变量 逻辑变量和串变量3种类型 变量的类型在程序中是不能改变的 数字变量的取值范围为数字常量和数字表达式所能表示的数值范围逻辑变量的取值为 true 和 false 串变量的取值范围为串表达式可表示的范围 说明 在ARM汇编语言中 使用GBLA GBLL GBLS伪操作声明全局变量 使用LCLA LCLL LCLS伪操作声明局部变量 使用SETA SETL SETS伪操作为这些变量赋值 5 2ARM汇编语言语句格式 ARM汇编语言中的符号 数字常量 数字常量一般有3种表达方式 十进制数 如43 6 112等十六进制数 如0 x3214 0 xFE 0 x1等n进制数 表示为n XXX 其中n为2 9 如8 123即十进制数83 若数字常量是32位整数 当作为无符号整数时 其取值范围为0 232 1 当作为有符号整数时 其取值范围为 231 231 1 5 2ARM汇编语言语句格式 ARM汇编语言中的符号 标号 在ARM汇编语言中 标号是表示程序中的指令或数据地址的符号 一般它代表一个地址 根据地址值的生成方式可有3种 基于PC的标号 是位于 将要跳转到的 目标指令前或程序中数据定义伪操作前的标号 在汇编时将被处理成PC值加上 或减去 一个数字常量 它常用于表示跳转指令的目标地址 或者代码段中所嵌入的少量数据 基于寄存器的标号 通常用MAP和FILED伪操作定义该标号 也可用EQU伪操作定义 这种标号在汇编时将被处理成寄存器的值加上 或减去 一个数字常量 它常用于访问位于数据段中的数据 绝对地址 是一个32位的数字量 寻址的范围为0 231 1 即直接可寻址整个内存空间 5 2ARM汇编语言语句格式 ARM汇编语言中的符号 局部标号 局部标号主要用于局部范围代码 它由一个0 99数字和一个通常表示该局部标号作用范围的符号组成 可重复定义 局部标号的作用范围通常为当前段 也可用伪操作ROUT来定义局部标号的作用范围 其引用的语法格式 F B A T N routname F 向前搜索B 向后搜索A 搜索宏的所有嵌套层T 搜索宏的当前层 ARM汇编语言伪指令 其他伪操作 ROUT ROUT伪操作举例 routineROUT 定义局部标号的有效范围 名称为routine 1routine routine范围内的局部标号 BEQ 2routine 若条件成立 则跳转到routine范围内的局部标号2 BGE 1routine 若条件成立 则跳转到routine范围内的局部标号1 2routine routine范围内的局部标号2 otherroutineROUT 定义新的局部标号的有效范围 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式 表达式是由符号 数值 单目或多目操作符以及括号组成的 在一个表达式中各种元素的优先级如下 括号内的表达式由字符串 字符串变量 操作符以及括号组成 其优先级最高 各种操作符有一定的优先级 相邻的单目操作符的执行顺序为由右到左 单目操作符优先级高于其他操作符 优先级相同的双目操作符执行顺序为由左到右 高 低 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式 字符串表达式 字符串表达式由字符串 字符串变量 操作符以及括号组成 1 字符串由包含在双引号内的一系列字符组成 字符串的长度受到ARM汇编语言语句长度的限制 最大512字节 当在字符串中包含美元符号 或者引号 时 用 表示一个 用 表示一个 2 字符串变量用伪操作GBLS或者LCLS声明 用SETS赋值 3 操作符 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式 字符串表达式 下面介绍与字符串表达式相关的操作符 LEN LEN操作符返回字符串的长度 其语法格式如下 LEN A 其中A为字符串变量 示例 GBLSSTRSTRSETS AAA LEN STR LEN 3 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式 字符串表达式 CHR CHR可将0 255之间的整数作为含一个ASCII字符的字符串 当有些ASCII字符不方便放在字符串中时 比如由于输入的限制 可使用CHR将其放在字符串表达式中 其语法格式如下 CHR A其中A为某一字符的ASCII值 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式 字符串表达式 CHR CHR可将0 255之间的整数作为含一个ASCII字符的字符串 当有些ASCII字符不方便放在字符串中时 比如由于输入的限制 可使用CHR将其放在字符串表达式中 其语法格式如下 CHR A其中A为某一字符的ASCII值 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式 字符串表达式 STR STR将一个数字量或者逻辑表达式转换成串 对于32位的数字量而言 STR将其转换成8个十六进制数组成的串 对于逻辑表达式而言 STR将其转换成字符串T True 或F False 语法格式如下 STR A 其中A为数字量或逻辑表达式 举例 GLBAA1A1SETA15 STR A1 将A1转换为 0000000F 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式 字符串表达式 LEFT LEFT返回一个字符串最左端一定长度的子串 其语法格式如下 A LEFT B 其中A为源字符串 B为数字量 表示LEFT将返回的字符个数 举例 GBLSSTR1GBLSSTR2STR1SETS AAABBB STR2SETSSTR1 LEFT 3程序运行完后 STR2为 AAA 5 2ARM汇编语言语句格式 ARM汇编语言中的表达式

温馨提示

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

评论

0/150

提交评论