




已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章ARM汇编伪指令与伪操作 2 伪操作 为完成汇编程序做各种准备工作 只在汇编过程中起作用 一旦汇编结束 它的作用也随之结束 3 宏指令 是一段独立的程序代码 可插在源程序中 与子程序相似 但有本质不同 1 伪指令 在汇编时将被合适的指令代替 伪操作 宏指令一般与编译器有关 常用ARM编译开发环境有2种 GNU 基于EmbestIDE环境 和ADS ARM 目前常用的编译环境有2种 1 ADS SDT RealViewMDK等ARM公司推出的开发工具2 GNUARM开发工具 1 ADS SDT RealViewMDK等ARM公司推出的开发工具ADS由ARM公司推出 使用了CodeWarrior公司的编译器 针对ARM资源配置为用户提供了在CodeWarriorIDE集成环境下配置各种ARM开发工具的能力 以ARM为目标平台的工程创建向导 可以使用户以此为基础 快速创建ARM和Thumb工程 ARM将Keil公司收购之后 正式推出了针对ARM微控制器的开发工具RealViewMicrocontrollerDevelopmentKit 简称RealViewMDK或者MDK 它将ARM开发工具RealViewDevelopmentSuite 简称RVDS 的编译器RVCT与Keil的工程管理 调试仿真工具集成在一起 是一款非常强大的ARM微控制器开发工具 2 GNUARM开发工具GNU是 GNU sNotUnix 的递归缩写 在1983年9月27日由RichardStallman公开发起GNU计划 它的目标是创建一套完全自由的操作系统 GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统 GNU组织开发的基于ARM平台的编译工具有主要由GNU的汇编器as 交叉汇编器gcc和连接器ld组成 6 1汇编语言伪指令 伪指令是ARM处理器支持的汇编语言程序里的特殊助记符 它不在处理器运行期间由机器执行 只是在汇编时将被合适的机器指令代替成ARM或Thumb指令 从而实现真正的指令操作 ARM伪指令有四条 分别为ADR伪指令 ADRL伪指令 LDR伪指令 NOP伪指令 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条程序相对偏移的LDR指令从文字池读出常量 LDR cond register expr label expr LDR伪指令格式 指令执行的条件码 加载的目标寄存器 基于PC的地址表达式或外部表达式 注意 1 从指令位置到文字池的偏移量必须小于4KB 2 与ARM指令的LDR相比 伪指令的LDR的参数有 号 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条程序相对偏移的LDR指令从文字池读出常量 应用示例 加载常量 LDRR2 0 xFF0 MOVR2 0 xFF0LDRR0 0 xFF000000 MOVR0 0 xFF000000LDRR1 0 xFFFFFFFE MVNR1 0 x1 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条程序相对偏移的LDR指令从文字池读出常量 应用示例 加载地址 LDRR1 InitStack InitStackMOVR0 LR 使用伪指令将程序标号InitStack的地址存入R1 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条程序相对偏移的LDR指令从文字池读出常量 应用示例 加载地址 编译后的反汇编代码 LDRR1 InitStack InitStackMOVR0 LR 0 x60LDRR1 0 xb4 0 x64MOVR0 LR 0 xb4DCD0 x64 使用伪指令将程序标号InitStack的地址存入R1 地址 程序代码 ARM伪指令 大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超出MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条程序相对偏移的LDR指令从文字池读出常量 应用示例 加载地址 编译后的反汇编代码 LDRR1 InitStack InitStackMOVR0 LR 0 x60LDRR1 0 xb4 0 x64MOVR0 LR 0 xb4DCD0 x64 使用伪指令将程序标号InitStack的地址存入R1 LDR伪指令被汇编成一条LDR指令 并在文字池中定义了一个常量 该常量为InitStack标号的地址 ARM伪指令 中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 比ADR伪指令可以读取更大范围的地址 在汇编编译器编译源程序时 ADRL伪指令被编译器替换成两条合适的指令 若不能用两条指令实现 则产生错误 编译失败 ADRL cond register expr ADRL伪指令格式 指令执行的条件码 加载的目标寄存器 地址表达式 地址表达式expr的取指范围 当地址值是字节对齐时 其取指范围为 64K 64K 当地址值是字对齐时 其取指范围为 256K 256K ARM伪指令 中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 比ADR伪指令可以读取更大范围的地址 在汇编编译器编译源程序时 ADRL伪指令被编译器替换成两条合适的指令 若不能用两条指令实现 则产生错误 编译失败 ADRLR0 Delay DelayMOVR0 r14 应用示例 源程序 使用伪指令将程序标号Delay的地址存入R0 ARM伪指令 中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 比ADR伪指令可以读取更大范围的地址 在汇编编译器编译源程序时 ADRL伪指令被编译器替换成两条合适的指令 若不能用两条指令实现 则产生错误 编译失败 ADRLR0 Delay DelayMOVR0 r14 应用示例 源程序 0 x20ADDr1 pc 400 x24ADDr1 r1 FF00 0 xFF68MOVr0 r14 编译后的反汇编代码 使用伪指令将程序标号Delay的地址存入R0 地址 程序代码 ARM伪指令 中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 比ADR伪指令可以读取更大范围的地址 在汇编编译器编译源程序时 ADRL伪指令被编译器替换成两条合适的指令 若不能用两条指令实现 则产生错误 编译失败 ADRLR0 Delay DelayMOVR0 r14 应用示例 源程序 0 x20ADDr1 pc 400 x24ADDr1 r1 FF00 0 xFF68MOVr0 r14 编译后的反汇编代码 使用伪指令将程序标号Delay的地址存入R0 ADRL伪指令被汇编成两条指令 ARM伪指令 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 在汇编编译器编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能 若不能用一条指令实现 则产生错误 编译失败 ADR cond register expr ADR伪指令格式 指令执行的条件码 加载的目标寄存器 地址表达式 地址表达式expr的取指范围 当地址值是字节对齐时 其取指范围为 255 255 当地址值是字对齐时 其取指范围为 1020 1020 ARM伪指令 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 在汇编编译器编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能 若不能用一条指令实现 则产生错误 编译失败 ADRR0 Delay DelayMOVR0 r14 应用示例 源程序 使用伪指令将程序标号Delay的地址存入R0 0 x20ADDr1 pc 0 x3c 0 x64MOVr0 r14 ARM伪指令 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 在汇编编译器编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能 若不能用一条指令实现 则产生错误 编译失败 ADRR1 Delay DelayMOVR0 r14 应用示例 源程序 编译后的反汇编代码 使用伪指令将程序标号Delay的地址存入R0 地址 程序代码 ARM伪指令 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 在汇编编译器编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能 若不能用一条指令实现 则产生错误 编译失败 ADRR0 Delay DelayMOVR0 r14 应用示例 源程序 0 x20ADDr1 pc 0 x3c 0 x64MOVr0 r14 编译后的反汇编代码 使用伪指令将程序标号Delay的地址存入R0 ADR伪指令被汇编成一条指令 ARM伪指令 小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 在汇编编译器编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能 若不能用一条指令实现 则产生错误 编译失败 应用示例2 查表 ADRR0 DISP TAB 加载转换表地址LDRBR1 R0 R2 使用R2作为参数 进行查表 DISP TABDCB0 xC0 0 xF9 0 xA4 0 xB0 0 x99 0 x92 0 x82 0 xF8 ARM伪指令 空操作伪指令 NOP伪指令在汇编时将会被代替成ARM中的空操作 比如可能是 MOVR0 R0 指令等 NOP可用于延时操作 NOP NOP伪指令格式 应用示例 延时子程序 movR1 0 x1234DelayNOP 空操作NOPNOPSUBSR1 R1 1 循环次数减一BNEDelay 如果循环没有结束 跳转Delay继续MOVPC LR 子程序返回 6 2ARM汇编语言伪操作 伪操作 Directive 是ARM汇编语言程序里的一些特殊的指令助记符 其作用主要是为完成汇编程序做各种准备工作 对源程序运行汇编程序处理 而不是在计算机运行期间由处理器执行 伪操作只是汇编过程中起作用 一旦汇编结束 伪操作也就随之消失 6 3ARM汇编伪操作 ARM公司推出的开发工具所支持的汇编伪操作 符号定义伪操作数据定义伪操作汇编信息报告控制伪操作汇编代码控制伪操作文件包含伪操作指令集类型标识伪操作其他功能伪操作 符号定义伪操作 举例如下 GBLATest1 定义一个全局的数字变量Test1SETA0 xaa 将该变量赋值为0 xaaGBLLTest2 定义一个全局的逻辑变量Test2SETL TRUE 将该变量赋值为真GBLSTest3 定义一个全局的字符串变量Test3SETS Testing 将该变量赋值为 Testing 举例如下 LCLATest4 声明一个局部的数字变量Test4SETA0 xaa 将该变量赋值为0 xaaLCLLTest5 声明一个局部的逻辑变量Test5SETL TRUE 将该变量赋值为真LCLSTest6 定义一个局部的字符串变量Test6SETS Testing 将该变量赋值为 Testing 符号定义伪操作 符号定义伪操作注意事项 用伪操作声明的全局或局部变量名必须在整个程序范围内是唯一的 用伪操作对变量赋值前必须先声明变量 用RLIST定义的寄存器列表名 可以在LDM STM中使用 在使用DN伪操作时 双精度VFP寄存器D0 D15是汇编器预先定义的 用户不能再使用 在使用SN伪操作时 单精度VFP寄存器S0 S31是汇编器预先定义的 用户不能再使用 在使用FN伪操作时 FPA浮点寄存器F0 F7是汇编器预先定义的 用户不能再使用 在使用CP伪操作时 协处理器P0 P15是汇编器预先定义的 用户不能再使用 在使用CN伪操作时 协处理器的寄存器C0 C15是汇编器预先定义的 用户不能再使用 ARM汇编器对ARM的寄存器进行了预定义 所有的寄存器和协处理器名都是大小写敏感的 预定义的寄存器如下 预定义变量1R0 R15和r0 r15 a1 a4 参数 结果或临时寄存器 与r0 r3同义 v1 v8 变量寄存器 与r4 r11同义 sb和SB 静态基址寄存器 与r9同义 sl和SL 堆栈限制寄存器 与r10同义 fp和FP 帧指针 与r11同义 预定义变量2ip和IP 过程调用中间临时寄存器 与r12同义 sp和SP 堆栈指针 与r13同义 lr和LR 链接寄存器 与r14同义 pc和PC 程序计数器 与r15同义 cpsr和CPSR 程序状态寄存器 spsr和SPSR 程序状态寄存器 f0 f7和F0 F7 FPA寄存器 s0 s31和S0 S31 VFP单精度寄存器 d0 d15和D0 D15 VFP双精度寄存器 p0 p15 协处理器0 15 c0 c15 协处理器寄存器0 15 内置变量ARM汇编器所定义的内置变量如下表1所示 值得注意的是内置变量的设置不能用SETA SETL或SETS等指示符来设置 只能用于表达式或条件语句 例如 IF ARCHITECTURE 4T 表1内置变量 表1内置变量 续 数据定义伪操作 数据定义伪操作一般用于为特定的数据分配存储单元 也可以完成已分配存储单元的初始化 数据定义伪操作 以上三条中的label 是可选的程序标号 数据定义伪操作 以上三条中的label 是可选的程序标号 数据定义伪操作 以上三条中的label 是可选的程序标号 数据定义伪操作 以上三条中的label 是可选的程序标号 数据定义伪操作 以上三条中的label 是可选的程序标号 声明数据缓冲池LTORG功能 在使用LDR伪指令时 要在适当的位置加入LTROG声明数据缓冲池 这样就会把要加载的数据保存到缓存池中 再使用ARM加载指令读出 如果没有使用LTROG声明数据缓冲池 则汇编器会在程序末尾自动声明 语法格式 LTROG 分配存储空间SPACE功能 用于分配一片连续的存储区域并初始化为0 其中 表达式为要分配的字节数 SPACE也可用 代替 语法格式 label SPACEexpr其中 label为可选的程序标号 expr为分配的字节数 使用示例 AREAExample CODE READONLYstartBLfunc1func1 codeLDRr1 0 x55555555 codeMOVpc lrLTORGdataSPACE4200 从当前位置开始分配连续4200字节的存储单元并初始化为0END 定义结构化内存表首地址MAP功能 用于定义一个结构化的内存表的首地址 MAP也可用 代替 表达式可以为程序中的标号或数学表达式 基址寄存器为可选项 当基址寄存器选项不存在时 表达式的值即为内存表的首地址 当该选项存在时 内存表的首地址为表达式的值与基址寄存器的和 语法格式 MAPexpr base register 其中 结构化内存表的首址为expr与base register之和MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表 定义结构化内存表数据域FIELD功能 用于定义一个结构化内存表中的数据域 FILED也可用 代替 语法格式 label FIELDexpr其中 label为可选的程序标号 当指定这一选项时 label的值为当前内存表的位置计数器的值 expr为当前数据域在内存表中所占的字节数 FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表 注意 MAP和FIELD伪指令仅用于定义数据结构 并不实际分配存储单元 MAP伪指令定义内存表的首地址 FIELD伪指令定义内存表中的各个数据域 并可以为每个数据域指定一个标号供其他的指令引用 举例如下 MAP0 x100 定义结构化内存表首地址的值为0 x100 AFIELD16 定义A的长度为16字节 位置为0 x100BFIELD32 定义B的长度为32字节 位置为0 x110SFIELD256 定义S的长度为256字节 位置为0 x130 汇编代码控制伪操作 汇编控制伪操作用于控制汇编程序的执行流程 常用的汇编控制伪指令包括以下几条 IF ELSE ENDIF WHILE WEND MACRO MEND MEXIT IF条件编译伪操作语法格式 IFlogical expression程序代码段A ELSE程序代码段B ENDIF 当IF后面的逻辑表达式为真 则执行指令序列1 否则执行指令序列2 其中 ELSE及指令序列2可以没有 此时 当IF后面的逻辑表达式为真 则执行指令序列1 否则继续执行后面的指令 IF ELSE ENDIF伪指令可以嵌套使用 举例如下 GBLLTest IFTest TRUE指令序列1ELSE指令序列2ENDIF WHILE条件编译伪操作语法格式 WHILElogical expression程序代码段WEND 当WHILE后面的逻辑表达式为真 则执行指令序列 该指令序列执行完毕后 再判断逻辑表达式的值 若为真则继续执行 一直到逻辑表达式的值为假 WHILE WEND伪指令可以嵌套使用 GBLACounterCounterSETA3 WHILECounter 10指令序列WEND MACRO宏定义伪操作语法格式 MACRO label macroname parameter parameter 程序代码段MEND MACRO MEND伪指令可以将一段代码定义为一个整体 称为宏指令 宏指令可以使用一个或多个参数 当宏指令被展开时 这些参数被相应的值替换 MACRO MEND伪指令可以嵌套使用 macrodefinitionMACRO startmacrodefinition labelxmac p1 p2 code label loop1 code codeBGE label loop1 label loop2 codeBL p1BGT label loop2 codeADR p2 codeMEND endmacrodefinition macrodefinitionMACRO startmacrodefinition labelxmac p1 p2 code label loop1 code codeBGE label loop1 label loop2 codeBL p1BGT label loop2 codeADR p2 codeMEND endmacrodefinition macroinvocationabcxmacsubr1 de invokemacro codeabcloop1 code codeBGEabcloop1abcloop2 codeBLsubr1BGTabcloop2 codeADRde code 其他常用的伪指令 AREA指令指示汇编器汇编新的代码段或数据段 段是不可分的已命名独立代码或数据块 由链接器处理 AREAsectionname attr attr sectionname段指定的名称 以非字母字符开头的名称必须包含在竖杠内 否则会生成缺失段名的错误 attr 表示该段的相关属性 多个属性用逗号分隔 常用属性如下 AREAInit CODE READONLY 定义Init为代码段 属性为只读AREARamData DATA READWRITE 定义RamData为数据段 属性为可读写 attr 表示的常用属性如下 CODE 用于定义代码段 READONLY是缺省值 指示不应向此段写入 DATA 用于定义数据段 READWRITE是缺省值 指示可以读写此段 ALIGN 使用方式为ALIGN表达式 表达式的取值范围为0 31 相应的对齐方式为2的次方 在默认时 可执行连接文件的代码段和数据段是按字对齐的 AREAcacheable CODE ALIGN 3 表示按8by
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版智慧城市建设用水泵采购及安装合同
- 2025年度汽车零部件供应链合作协议书
- 2025年房地产销售大数据分析服务购销合同
- 2025年度定制家具线上线下销售合作协议
- 2025年企业车辆租赁合同范本
- 2025版重大工程保密协议书汇编及实施细则
- 2025年定制加工合同范本:服装定制加工合作协议书
- 2025版水暖管道安装与维修一体化服务合同规范
- 2025年度城市观光包车服务合同
- 2025地产销售居间合同针对高端市场拓展的协议范本
- 学校购买文具用品的供货合同2025年
- 工程项目全过程造价管理课件
- 物业保安各岗位培训
- 小学二年级下安全课件
- 《安全管理体系》课件
- 树立正确的人生价值观课件
- 防腐保温工程监理实施细则
- 园林绿化工知识考试题库及答案
- 法律事务所信息安全管理制度
- 论高校思政教育宏大叙事的有效性建构
- 塔吊拆卸安全专项施工方案
评论
0/150
提交评论