第4章ARM汇编语言特性与编程基础_第1页
第4章ARM汇编语言特性与编程基础_第2页
第4章ARM汇编语言特性与编程基础_第3页
第4章ARM汇编语言特性与编程基础_第4页
第4章ARM汇编语言特性与编程基础_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

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

文档简介

第4章ARM汇编语言特性与编程基础 2 本章重点 ARM汇编器提供的汇编语言特性 包括行格式 预定义名和内建变量 伪指令 符号 指示符 表达式和操作符等 以及它们的使用 ARM汇编语言编程基础 包括调用子程序 条件执行 装入常数和地址到寄存器 装入和存储多个寄存器 多路分支等内容 以及对应的程序代码 补充知识 ADSIDE 集成开发环境 1ADS工具包的组成2ADS开发工具集3ARM映像文件 3 4 补充知识 ADSIDE 集成开发环境 ARM应用软件的开发工具根据功能的不同 可以分为编辑软件 编译软件 汇编软件 链接软件 调试软件 嵌入式实时操作系统 函数库 评估板 JTAG仿真器以及在线仿真器等 选择合适的开发工具可以加快开发进度 节省开发成本 5 1ADS工具包的组成 ADS是ARM公司推出的集成开发工具包 是专门用于ARM相关应用开发和调试的综合性软件 目前常用的版本是1 2 在功能和易用性上比早期的SDT都有提高 是一款功能强大又易于使用的开发工具 ARMADS包含有CodeWarriorIDE 编译器 链接器 调试器 指令集模拟器 ARM开发包和应用库等部分 可以用ADS来开发 编译 调试采用包括C C 和ARM汇编语言编写的程序 6 ADS工具包的组成 一 1 CodeWarriorIDECodeWarriorIDE 集成开发环境 包括工程管理器 代码生成接口 语法敏感编辑器 源文件和类浏览器 源代码版本控制系统接口以及文本搜索引擎等 ADS仅在其PC机版本中集成了该IDE CodeWarriorIDE为管理和开发项目提供了简单多样化的图形用户界面 用户可以使用ADS的CodeWarriorIDE为ARM和Thumb处理器开发用C C 或者ARM汇编语言编写的程序代码 7 ADS工具包的组成 二 2 编译器ADS提供多种编译器 以支持ARM和Thumb指令的编译 3 链接器Armlink ARM链接器 可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接 生成一个可执行文件 也可以将多个目标文件部分链接成一个目标文件 以供进一步的链接 8 ADS工具包的组成 三 4 调试器 Debuggers 1 调试器类型调试器部分包括两个调试器 ARM扩展调试器AXD ARMeXtendedDebugger ARM符号调试器armsd ARMsymbolicdebugger AXD基于WindowsXX NT风格 具有一般意义上调试器的所有功能 包括简单和复杂断点设置 栈显示 寄存器和存储区显示 命令行接口等 Armsd作为一个命令行工具辅助调试或者用在其他操作系统平台上 9 ADS工具包的组成 四 AXD调试器本身是一个软件 用户通过这个软件可以对包含有调试信息的 正在运行的可执行代码进行变量的查看 断点的设置 单步执行等调试操作 在ARM体系中 它有Multi ICE ARMulator和Angel等几种方式 AXD可以在Windows和UNIX下进行程序的调试 它为用C C 和汇编语言的源代码提供了一个全面的Windows和UNIX环境 10 ADS工具包的组成 五 2 调试方式在ARM体系中 可以选择Multi ICE Multi processorin circuitemulator ARMulator或Angel多种调试方式 ARMulator指令集模拟器 InstructionSetSimulators 用户使用指令集模拟器无需任何硬件即可在PC机上完成一部分调试工作 11 ADS工具包的组成 六 5 ARM开发包和函数库ARM开发包由一些底层的例程和库组成 可以帮助用户快速开发基于ARM的应用程序和操作系统 ADS的ARM应用库完善并增强了SDT中的函数库 同时还包括一些非常有用的源码例程 具体包括系统启动代码 串行口驱动程序 时钟例程 中断处理程序等 12 2ADS开发工具集 2 1ADS命令行开发工具2 2GUI开发工具2 3ADS实用工具 2 1ADS命令行开发工具 1 armccarmcc是ARMC编译器 在命令控制台环境下 输入命令 C armcc help可以查看armcc的语法格式以及最常用的一些操作选项 2 armcpparmcpp是ARMC 编译器 它将ISOC 或EC 编译成32位ARM指令代码 3 tcctcc是ThumbC编译器 该编译器通过了PlumHallCValidationSuite为ANSI一致性的测试 tcc将ANSIC源代码编译成16位的Thumb指令代码 13 14 4 tcpptcpp是ThumbC 编译器 它将ISOC 和EC 源码编译成16位Thumb指令代码 5 armasmarmasm是ARM和Thumb的汇编器 它对用ARM汇编语言和Thumb汇编语言写的源代码进行汇编 6 armlinkarmlink是ARM连接器 7 armsdarmsd是ARM和Thumb的符号调试器 15 A ARM编译器 ADS提供四种编译器 下表给出了这4种编译器的总结 16 B ARM汇编器 ADS包含一个独立的ARM汇编器armasm和一个内置在C C 编译器中的内联汇编器 inlineassembler 这两个汇编器能够处理基本相同的汇编代码 17 C ARM连接器 ARM连接器armlink可以有如下功能 将一组目标文件或库连接产生一个可执行的ELF映像文件 将一组目标文件部分连接产生一个新的目标文件 用于以后的连接 指定代码和数据在内存中的位置 为连接产生的文件产生调试和引用信息 18 连接操作的输出结果 目标文件由输入段 inputsection 组成 输入段可以是RO 只读 Read Only 段 RW 读写 Read Write 段 ZI 零初始化 Zero Initialized 段 armlink可以利用这些属性把输入段分组归并为更大的生成块 分别是输出段 outputsection 域 region 和映像 image 输出段大致相当于ELF的段 segment 19 连接器的输入和输出 连接器的输入是 一个或多个ELF目标格式的目标文件 或 可选的 一个或多个由armar工具产生的库 缺省情况下 连接器的输出是非可重定位映像 代码从内存地址0 x30000000开始 数据段紧随其后 可以通过连接器选项或一个配置文件来指定代码段和数据段存放在什么内存地址 20 连接正确的输出 一个ELF可执行格式的可执行映像 一个ELF目标格式的部分连接的目标文件 通过fromELF工具 一个ELF的可执行映像也可以转化为其他的文件格式 21 2 2GUI开发工具 ADS的GUI开发工具主要包括两个独立的工具 CodeWarriorIDE CodeWarrior集成开发环境 和AXD ARMeXecutorDebugger 22 1 CodeWarrior集成开发环境 CodeWarrior集成开发环境为管理和开发工程项目提供了简单一致的图形用户界面 可以加速并简化嵌入式开发过程中的每个环节 缩短用户项目周期 可以在CodeWarrior中为ARM配置前面介绍的各种命令行工具 实现对项目代码的编译 汇编和连接 CodeWarrior以工程项目的方式组织源代码文件 库文件和其他文件 让用户将这些文件及配置设置放在一个工程项目中 每个工程项目可以创建和管理多个生成选项的配置 23 CodeWarriorIDE主要提供以下功能 1 按照工程项目 Project 的方式来组织源代码文件 库文件和其他文件 2 设置各种生成选项 Buildoptions 以生成不同配置的映像文件 3 一个源代码编辑器 4 一个文件浏览器 5 在文本文件中进行字符串搜索和替换 6 文本文件比较功能 7 用户自定义界面 24 CodeWarrior中常用的两个术语 目标系统 Targetsystem 目标系统是指应用程序运行的环境 可以是基于ARM的硬件系统 也可以是ARM仿真运行环境 比如 当应用程序运行在ARM评估板上时 目标系统就是该评估板 生成目标 Buildtarget 生成目标是指生成特定目标文件的选项设置 包括汇编选项 编译选项 连接选项以及连接后的处理选项等 和所用的所有文件的集合 通常一个生成目标对应一个目标映像文件 25 CodeWarrior工程项目通常包括3个生成目标 Debug 该生成目标对应的映像文件包含所有调试信息 在开发过程中使用 Release 该生成目标对应的映像文件不包含调试信息 用于生成实际发行的软件版本 DebugRel 该生成目标对应的映像文件包含基本的调试信息 26 7种可选的ADS工程项目模板 ARMExecutablImage ARM可执行映像文件模板 用于由ARM指令的代码生成一个ELF格式的可执行映像文件 ARMObjectLibrary ARM目标文件库模板 用于由ARM指令的代码生成一个armar格式的目标文件库 EmptyProject 空工程模板 用于创建一个不包含任何库或源文件的工程 MakefileImporterWizard Makefile导入向导模板 用于将VisualC的nmake或GNUmake文件转入到CodeWarriorIDE工程文件 27 7种可选的ADS工程项目模板 续 ThumbARMExecutableImage ARM Thumb混合使用的映像文件模板 用于由ARM指令和Thumb指令的混和代码生成一个可执行的ELF格式的映像文件 ThumbExecutableimage Thumb可执行映像文件模板 用于由Thumb指令创建一个可执行的ELF格式的映像文件 ThumbObjectLibrary Thumb目标文件库模板 用于由Thumb指令的代码生成一个armar格式的目标文件库 28 7个ADS工程模板的截图 29 2 AXD AXD ARM扩展调试器 ARMeXtendedDebugger 是ADS的图形化调试工具 AXD是一个功能强大的调试工具 提供了多种辅助调试手段用来对用户程序进行调试 包括断点 观测点和观测项等 其他两个调试器 armsd ARM符号调试器 ARMSymbolicDebugger 和ADW ADU ApplicationDebuggerWindows UNIX 也是ADS的调试工具 前者在命令行工具里已简单介绍 后者是ADS老版本的图形化调试工具 30 调试目标和调试代理 英文术语分别是debugtarget和debugagent调试目标 被调试程序运行所在的目标设备或仿真软件 调试代理 运行在调试目标上 接受并执行主机上调试器发来的命令 例如 在目标程序中设置断点 单步执行 读内存 写内存等 31 ARM体系中的三种调试代理 在ARM体系中主要有以下三种调试代理 ARMulator 打开AXD软件时默认打开的目标是ARMulator 基于JTAG的调试代理Multi ICEAngel调试监控程序 32 调试代理与调试器的关系 调试代理与调试器的关系是前者执行后者请求的操作 调试代理既不是被调试的程序 也不是调试器本身 用户可以通过AXD使用调试代理 对运行在调试目标上的包含调试信息的程序进行变量查看 断点控制等操作 33 2 3ADS实用工具 ARM映像文件转换工具 fromelfARM函数库管理工具 armar 34 1 fromelf 这是ARM映像文件转换工具 该命令将ELF格式的文件作为输入文件 将该格式转换为各种输出格式的文件 包括plainbinary BIN格式映像文件 Motorola32 bitS recordformat Motorola公司32位S格式映像文件 IntelHex32format Intel公司32位格式映像文件 和Verilog likehexformat Verilog类型16进制文件 fromelf命令也能够为输入映像文件产生文本信息 例如代码和数据长度 35 2 armar armar是ARM库管理工具 armar将一系列ELF格式的目标文件集合在一起 组成一个库 这样的库可以传递给连接器armlink以代替多个目标文件 不过 连接一个库文件并不意味着库中的所有目标文件都被连接 armlink连接目标文件和连接库有如下不同 作为输入的每个目标文件都无条件地被连接在输出文件中 尽管如果armlink带 remove选项 未用到的区段会被剪裁掉 库文件中的成员仅当它被一个目标文件或其他已被包含的库文件引用时才被包含在输出文件中 36 3ARM映像文件 什么是映像文件映像文件 image 是一个计算机上的可执行文件 在执行之前被加载到计算机的存储器中 通常 一个映像文件中包含多个线程 37 ELF目标文件 ARM集成开发环境中的各种源文件 包括汇编程序 C程序以及C 程序 经过ARM编译器编译之后 生成ELF格式的目标文件 ELF目标文件的文件名后缀是 o 38 ARM映像文件 axf 目标文件 o和相应的C C 运行时库 a经过ARM连接器连接后 生成 axf映像文件 axf映像文件也是ELF格式的 只是包含特定格式的调试信息 可在开发板上调试运行 39 不含调试信息的映像文件 映像文件调试结束之后 可以使用fromelf工具将映像文件中的调试信息和注释过滤掉 生成二进制的可加载映像文件 通常带后缀 bin 也可以无后缀 可加载映像文件可写入嵌入式设备的ROM中 在加电启动过程执行 40 ARM映像文件的组成 ARM处理器的映像文件是 axf文件或者 bin文件 axf文件和 bin文件的区别之处在于前者包含有调试信息和注释信息 后者没有 编译器输出的ARM映像文件以 axf文件为主 通过fromelf工具 可以把AXF文件转换成 bin文件 实际下载到系统板的映像文件多数是 bin格式文件 41 映像文件的加载视图和执行视图 映像文件域在加载时被映射存放到系统存储区 在执行映像时 往往需要移动一些域到执行地址并且产生ZI输出段 例如 初始化的RW数据也许要被迫从ROM区的加载地址拷贝到RAM区的执行地址 加载视图 根据映像文件装载到存储器时的地址描述每一个域和段 该视图是映像文件开始执行前它的域和段的位置视图 执行视图 该视图根据映像文件在执行时每一个域和段的地址描述映像的各个组成部分 42 加载视图与执行视图的比较 43 图中带有 符号的含义 说明如下 Image RO baseRO输出段运行时起始地址Image RO limitRO输出段运行时存储区界限Image RW baseRW输出段运行时起始地址Image RW limitRW输出段运行时存储区界限Image ZI baseZI输出段运行时起始地址Image ZI limitZI输出段运行时存储区界限 44 三个段空间计算公式 RO段大小 Image RO limit Image RO baseRW段大小 Image RW limit Image RW baseZI段大小 Image ZI limit Image ZI base 45 段大小计算小结 段大小的设置 加载时 RO段 RW段 整个程序大小 运行时 RO段 RW段 整个程序大小注意 ZI段被包含在RW段中间 这些符号具体取值可以在ADS或者SDT中设置 ro base选项对应设置Image RO base rw base选项对应设置Image RW base 46 使用配置文件定义映像文件的地址映像 在生成映像文件时 ARM连接器需要知道下列信息 分组信息决定如何将各个输入段组织成相应的输出段和域 定位信息决定各个域在存储空间中的起始地址 47 ADS编译成功后输出的映像文件内部成分统计表举例 48 映像文件统计报告 在ADS集成开发环境下 对工程文件进行编译之后 会输出一个映像文件的统计报告 该报告中会分别给出目标文件 o 文件和库 a 文件中5种组成成分的占空间大小 这5种组成成分是 代码 RO数据 RW数据 ZI数据和Debug数据 如图6 7所示 此外 还会分别给出总RO空间 代码 RO数据 总RW空间 RW数据 ZI数据 和总ROM空间 代码 RO数据 RW数据 的大小 4 1ARM汇编语言特性 4 1 1行格式 预定义名和内建变量 行格式在ARM汇编语言模块中 源代码行的一般格式是 symbol instruction directive pseudo instruction comment 也就是 符号 指令 指示符 伪指令 注释 49 上述行格式中用大括号括起来的三部分是可选的 如果一行中没有symbol 指令 指示符 伪指令不能从第1列位置开始 指令 指示符 伪指令前面必须放置空格或Tab 制表符 字符 50 每一条指令的助记符可以使用全部大写或全部小写字符 但不能在同一条指令的助记符中大 小写混用 指示符必须大写 指令中每一个寄存器名能够全部大写或全部小写 但不能大 小写混用 行格式中symbol通常是标号 label 在指令或伪指令前它总是标号 在某些指示符前它是表示变量或常量的符号 symbol 行格式中symbol必须从第一列开始 不能含任何如空格或Tab的字符 详见本节符号命名规则部分 51 预定义寄存器和协处理器名 ARM汇编器对ARM的寄存器进行了预定义 所有的寄存器和协处理器名都是大小写敏感的 预定义寄存器名 预定义程序状态寄存器名 预定义浮点寄存器名 预定义协处理器名和协处理器寄存器名 52 预定义变量1 预定义的寄存器如下 R0 R15和r0 r15 a1 a4 参数 结果或临时寄存器 与r0 r3同义 v1 v8 变量寄存器 与r4 r11同义 sb和SB 静态基址寄存器 与r9同义 sl和SL 堆栈限制寄存器 与r10同义 fp和FP 帧指针 与r11同义 ip和IP 过程调用中间临时寄存器 与r12同义 预定义变量2 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 内建变量 内建变量 builtinvariables 见表4 1 它们是由ARM汇编器定义过的 内建变量不能用SETA SETL或SETS指示符设置 它们能被用在表达式或条件中 如 IF ENDIAN big IF ARCHITECTURE 4T 内置变量2 内置变量3 4 1 2ARM伪指令与Thumb伪指令 ARM汇编器支持ARM伪指令和Thumb伪指令 在汇编时把它们翻译成适当的ARM或Thumb指令组合 全部ARM和Thumb伪指令见表4 2 Thumb伪指令在表中用 Thumb 标出 虽然表4 2中Thumb伪指令ADR LDR和NOP与ARM伪指令ADR LDR和NOP格式完全相同 但相同的伪指令出现在程序中Thumb代码区 汇编器识别为Thumb伪指令 出现在ARM代码区汇编器识别为ARM伪指令 58 ADRARM伪指令 ADR伪指令装入一个相对程序或相对寄存器的地址到一个寄存器 格式ADR condition register expression 59 使用使用中 ADR总是被汇编成一条指令 汇编器试图产生一条ADD或SUB指令 装入地址 如果不能用一条指令构造出地址 则产生错误信息 汇编失败 如果expression是相对程序的 计算产生的地址必须与ADR伪指令在同一个代码区域 使用举例Test1MOVr1 0ADRr2 Test1 产生指令SUBr2 pc 0 xC 60 ADRLARM伪指令 ADRL伪指令装入一个相对程序或相对寄存器的地址到一个寄存器 与ADR伪指令功能相似 但ADRL比ADR能装入更大的地址范围 原因是ADRL产生两条数据处理指令 格式ADRL condition register expression 61 使用使用中 ADRL总是被汇编成2条指令 如果汇编器不能以2条指令构造出地址 则产生错误信息 汇编失败 如果expression是相对程序的 它必须计算产生一个与ADRL伪指令在同一个代码区域的地址 否则在随后的连接时 地址可能出了范围 使用举例startMOVr0 10ADRLr4 start 60000 产生指令ADDr4 pc 0 xe800 ADDr4 r4 0 x254 62 3 LDRARM伪指令 LDR伪指令装入一个32位常数值或一个地址到一个寄存器 格式LDR condition register expression label expression 使用使用LDR伪指令有两个主要目的 一是当一个立即数的值由于超了范围 不能用MOV和MVN指令装入到一个寄存器时 用LDR伪指令产生一个文字池常数 二是装入一个相对程序或外部的地址到一个寄存器 使用举例LDRr0 0 x1ff 装入0 x1ff到r0LDRr1 label 装入label地址到r1 63 4 NOPARM伪指令 对NOP伪指令 汇编器产生什么也不操作的ARM指令 MOVr0 r0 格式NOP 64 5 ADRThumb伪指令ADR伪指令装入一个相对程序或相对寄存器的地址到一个寄存器 格式ADRregister expression 使用使用中 在Thumb状态 ADR只能产生字对齐的地址 要使用ALIGN指示符去确认expression是字对齐的 若表达式是相对程序的 必须计算产生一个与ADR伪指令在同一个代码区域的地址 65 使用举例ADRr3 testexml 产生指令ADDr3 pc nn codeALIGNtestexm1DCW1 2 3 4 66 6 LDRThumb伪指令LDR伪指令装入一个32位常数值或一个地址到一个低寄存器中 格式LDRregister expression label expression 使用使用LDR伪指令有两个主要目的 一是当一个立即数的值由于超出MOV指令的范围 不能装入一个寄存器时 产生文字池常数 二是装入一个相对程序或外部的地址到一个寄存器 使用举例LDRr0 0 x0ffe 装入0 x0ffe到r0LDRr1 labeladdr 装入labeladdr地址到r1 67 7 MOVThumb伪指令MOV伪指令传送一个低寄存器的值到另一个低寄存器 r0 r7 而MOV指令不能传送一个低寄存器的值到另一个低寄存器 格式MOVRd Rs 使用在使用中 汇编器将MOV伪指令变成带立即数的ADD指令 指令中立即数的值为0 使用举例MOVRd Rs 产生指令ADDRd Rs 0 68 8 NOPThumb伪指令对NOP伪指令 汇编器产生什么也不操作的Thumb指令 MOVr8 r8 格式NOP 69 4 1 3符号 symbols 与指示符 directives 使用符号能够代表变量 地址和数值常数 符号代表地址时 也称为标号 符号命名规则符号命名遵守以下规则 在符号名中可以使用大写字母 小写字母 数字字符或下划线字符 除了局部标号外 不允许在符号名的第一个字符位置使用数字字符 符号名中对大 小写字母是敏感的 在符号名中所有的字符是有意义的 70 在它们的作用范围内 符号名必须是唯一的 符号名必须不使用内建变量名 预定义寄存器名和预定义协处理器名 符号名应该不使用与指令助记符或指示符相同的名字 如果需要在符号名中使用更大范围的字符 使用如下举例的格式为符号名划界线 C code 其中两边的两条竖线不是符号的一部分 只用于为符号名划界线 它们之间不允许使用竖线 分号和换行符 71 变量 variables 变量有三种类型 数值 逻辑 串变量的类型不能被改变 变量的值可以被改变 72 汇编时串变量的替换可以使用串变量作为汇编语言的一整行或一行的一部分 如果在某一位置使用的串变量带有 作为前缀 则汇编器用串变量的值替换串变量 字符通知汇编器 在检查一行的语法前替换源代码行的串 使用 标记变量名结束 如果变量名后有跟随的字符 替换后跟随在串变量的值后 标号 labels 相对程序的标号 相对寄存器的标号 绝对地址 73 局部标号 locallabels 局部标号使用0 99范围内的一个数 可以有选择地在其后跟随一个表示当前范围的名字 局部标号用在指令中 指出分支的目标处 局部标号格式为 n routname 74 常量常量由数值常量 串常量 布尔常量和字符常量组成 数值常量数值常量在汇编语言中采用以下三种形式 十进制数 例如234 十六进制数 例如0 x7b或0 x7B n进制数 格式为n xxx n是2 9之间的一个基数 xxx是这个基数下的数值 例如8 375 表示基数为8 八进制数 数值为375 串常量 布尔常量 字符常量 75 使用举例 anumSETA3500 假定anum在以前声明过addrDCD0 x00ff 十六进制数DCD0 x00FF 十六进制数DCD2 11000011 二进制数bnumSETA8 74007 假定bnum在以前声明过 八进制数LDRr1 A 字符 76 7 指示符 directives 汇编器提供指示符用来支持 定义数据结构和为数据分配空间 文件分隔成逻辑上的一个或多个区域 错误报告和汇编列表控制 符号定义 条件汇编和重复汇编 以及在一个文件中包含辅助文件 77 指示符1 符号定义指示符 1 78 指示符1 符号定义指示符 2 79 指示符2 数据定义指示符 1 80 指示符2 数据定义指示符 2 81 指示符3 报告指示符 82 指示符4 汇编控制指示符 1 83 指示符4 汇编控制指示符 2 84 指示符5 杂项指示符 1 85 指示符5 杂项指示符 2 86 指示符5 杂项指示符 3 87 指示符5 杂项指示符 4 88 汇编指令与指示符应用实例 2440init代码分析 4 1 4与代码有关的指示符 AREA ENTRY和END指示符使用程序举例 例4 1 用ARM汇编语言编写的汇编语言模块举例 程序见参考书 定义区域的AREA指示符 声明汇编程序入口点的ENTRY指示符 应用程序执行 应用程序终止 源程序结束的END指示符 89 CODE32 CODE16指示符使用程序举例用于选择指令集的CODE16和CODE32指示符 格式格式分别是 CODE16CODE32 使用在ARM状态当使用BX指令分支到Thumb指令时 使用CODE16 CODE16放置在分支目标处代码的前面 当从Thumb状态分支到ARM指令时 使用CODE32 CODE32放置在分支目标处代码的前面 90 使用举例使用举例1 这个例子给出如何从ARM指令分支到Thumb指令 AREAARMtoThumb CODE READONLY 这个区域开始于ARM状态ADRr1 test1 1 装入地址 设置最低位为1BXr1 分支并且改变指令集CODE16 跟随指令为Thumb指令test1MOVr0 20 Thumb指令 91 3 禁止浮点运算的NOFP指示符NOFP指示符表明在一个汇编语言源文件中不接受浮点指令 格式NOFP 使用使用NOFP指示符确认在软件或目标硬件不支持浮点指令的情况下 程序中没有使用浮点指令 92 4 定义局部标号使用范围的ROUT指示符ROUT指示符标记局部标号使用范围的界线 格式 name ROUT 使用在使用中 ROUT指示符限制了局部标号的使用范围 这使得程序员容易避免偶然引用一个错误的标号这种情况的发生 如果不存在ROUT指示符 局部标号的使用范围是整个AOF区域 如果存在ROUT指示符 局部标号的使用范围在两个ROUT之间 使用name选项用于保证每次引用正确的标号 如果标号名或引用标号名与ROUT指示符前面的名字不匹配 汇编器产生错误信息 汇编失败 93 使用举例 见参考书 94 4 1 5与数据定义有关的指示符 在代码中使用数据的DATA指示符DATA指示符通知汇编器 这个标号是在代码中的数据标号 这意味着标号是在代码段中的数据的地址 格式labelDATA 使用使用时 如果需要在Thumb代码区域用到某一个数据定义指示符 如DCD DCB和DCW 定义数据时 必须使用DATA指示符 95 使用举例AREAtest CODEThumb Code code codeMOVpc lrThumb DataDATADCB2 5 8 96 分配存储器字节的DCB指示符DCB也可以用 指示符代替 DCB指示符分配一个或多个存储器中的字节 并且定义初始运行时的存储器内容 格式 label DCBexpression expression 使用如果需要在Thumb代码中用DCB定义带标号的数据 必须使用DATA指示符 如果DCB后跟随着指令 应该使用ALIGN指示符去确认指令存放是边界对齐的 使用举例 见参考书 97 分配存储器半字的DCW和DCWU指示符DCW指示符分配一个或多个存储器中的半字 以2字节边界对齐 定义初始运行时的存储器内容 DCWU与DCW的区别是 DCWU不要求以2字节边界对齐 格式格式分别是 label DCWexpression expression label DCWUexpression expression 98 使用使用时 如果需要在Thumb代码中用DCW DCWU 定义一个带标号的数据 必须使用DATA指示符 如果DCW DCWU 后跟随着指令 要使用ALIGN指示符 确认指令是字边界对齐的 使用举例 见参考书 99 分配存储器字的DCD和DCDU指示符DCD也可以用 指示符代替 DCD指示符分配1个或多个存储器中的字 4字节边界对齐 并且定义初始运行时的存储器内容 DCDU与DCD的区别是 DCDU不要求4字节边界对齐 格式格式分别是 label DCDexpression expression label DCDUexpression expression 100 使用使用时 如果需要在Thumb代码中用DCD DCDU 定义一个带标号的数据 必须使用DATA指示符 如果DCDU后面跟随着代码 需要使用ALIGN指示符 确认指令是字边界对齐的 为了获得4字节边界对齐 如果需要 DCD指示符在第1个定义的字前 会插入最多3字节作为填充字节 DCDU不插入填充字节 使用举例 见参考书 101 5 分配数据区并使其初值为0的SPACE指示符SPACE也可以用 指示符代替 指示符保留存储器的一块内容设置为0的数据区 格式 label numeric expression 使用使用中 如果用 定义了标号的数据在Thumb代码中 必须使用DATA指示符 可以使用ALIGN指示符去对齐跟在 指示符后的代码的存放地址 102 使用举例AREATestData DATA READWRITEdata1 127 分配127字节内容为0的存储区 103 6 边界对齐的ALIGN指示符用ALIGN指示符在代码中对齐当前的位置到确定的边界 格式ALIGN expression offset expression 使用在使用中 用ALIGN去确认代码地址被正确地对齐 当需要时 可以使用ALIGN去确认Thumb代码地址按字对齐 例如 ADRThumb伪指令只能装入字对齐的地址 使用举例 见参考书 104 7 声明文字池的LTORG指示符LTORG指示符通知汇编器 立即汇编当前的文字池 格式LTORG 使用由AREA指示符定义开始的每个区域 在代码区域结尾处或汇编结尾处 即使不写出LTORG 汇编器也执行LTORG指示符 105 使用LTORG确认在LDR LDFD和LDFS伪指令范围内 文字池被汇编 大一些的程序可能要求几个文字池 放LTORG指示符应该在无条件分支或子程序返回指令之后 使得处理器不会试图把常数当作指令去执行 在文字池中 汇编器以字边界对齐数据 使用举例 见参考书 106 8 定义结构化内存表的MAP和FIELD指示符MAP也可以用 指示符代替 FIELD也可以用 指示符代替 MAP和FIELD指示符用于描述结构化内存表 107 MAP指示符MAP指示符设置结构化内存表首地址在指定位置 结构化内存表定位计数器用 表示 被设置成相同地址 格式MAPexpression base register 使用MAP指示符可以多次使用 定义多个结构化内存表 计数器在第一个MAP指示符被使用前设置为0 使用举例 见参考书 108 FIELD指示符FIELD指示符描述已经由MAP定义的结构化内存表中的数据域 格式 label FIELDexpression 使用使用 指示符与 指示符的组合来描述结构化内存表 使用举例 见参考书 109 4 1 6符号定义指示符 声明并初始化全局变量的GBLA GBLL和GBLS指示符GBLA指示符声明并初始化一个全局算术变量 取值范围与数值表达式相同 GBLL指示符声明并初始化一个全局逻辑变量 取值范围为 TRUE 或 FALSE GBLS指示符声明并初始化一个全局串变量 取值范围与串表达式相同 110 格式格式分别是 GBLAvariable nameGBLLvariable nameGBLSvariable name 使用 使用举例 见参考书 111 局部变量仅仅能在一个宏内声明 LCLA指示符声明并初始化一个局部算术变量 取值范围与数值表达式相同 LCLL指示符声明并初始化一个局部逻辑变量 取值范围为 TRUE 或 FALSE LCLS指示符声明并初始化一个局部串变量 取值范围与串表达式相同 112 声明并初始化局部变量的LCLA LCLL和LCLS指示符 格式格式分别是 LCLAvariable nameLCLLvariable nameLCLSvariable name 使用 使用举例 见参考书 113 设置变量值的SETA SETL和SETS指示符 SETA指示符设置局部或全局算术变量的值 SETL指示符设置局部或全局逻辑变量的值 SETS指示符设置局部或全局串变量的值 格式格式分别是 variable nameSETAexpressionvariable nameSETLexpressionvariable nameSETSexpression 114 使用使用SETA SETL和SETS之前 必须先声明全局变量或局部变量 后设置它们的值 使用举例 见参考书 115 为协处理器寄存器定义一个名字的CN指示符 为指定的协处理器定义一个名字的CP指示符 和 具体内容见参考书 给符号名一个数值常数的EQU指示符EQU也可以用 指示符代替 格式nameEQUexpression 使用使用EQU来定义常数 与C语言中 define类似 使用举例num2EQU25 给符号num2指定值为25 116 声明全局符号的EXPORT或GLOBAL指示符 GLOBAL与EXPORT有相同的功能 格式EXPORTsymbol qualifier qualifier qualifier 使用使用EXPORT指示符 允许别的文件中的代码引用当前文件中的符号 使用举例AREATestSub CODE READONLYEXPORTDoSub 函数名能被外部模块使用 DoSubSUBr1 r2 r1 117 为指定的浮点寄存器定义一个名字的FN指示符 声明其他文件定义的符号的IMPORT或EXTERN指示符 保留局部符号的KEEP指示符 定义寄存器列表名的RLIST指示符 定义寄存器名的RN指示符 具体内容见参考书 118 4 1 7汇编控制指示符 条件汇编IF ELSE和ENDIF指示符IF指示符可以用 代替 ELSE指示符可以用 代替 ENDIF指示符可以用 代替 IF指示符引入一个条件 由这个条件决定是否汇编指令和 或指示符代码1 ELSE指示符标记指令和 或指示符代码2的开始 当IF后的条件为假 则汇编指令和 或指示符代码2 ENDIF指示符标记条件汇编结束 119 格式IFlogical expression指令和 或指示符代码1 ELSE指令和 或指示符代码2 ENDIF 使用汇编器根据条件决定是否汇编某一段代码 120 使用举例GBLLTest 声明一个全局逻辑变量 Test TRUE IF 指令和 或指示符代码1 ELSE 指令和 或指示符代码2 ENDIF 121 重复汇编WHILE和WEND指示符 WHILE指示符测试一个条件 由这个条件决定是否汇编指令和 或指示符代码 WEND指示符表示指令和 或指示符代码结束 由WHILE再次测试条件 决定是否重复进行汇编 直到条件不成立 格式WHILElogical expression指令和 或指示符代码WEND 122 使用在使用中 WHILE和WEND配对使用 对指令和 或指示符代码重复汇编 重复次数可以是0 在WHILE WEND内可以使用IF ENDIF WHILE WEND能被嵌套使用 使用举例GBLAcount countSETA3WHILEcount 5countSETAcount 1 指令和 或指示符代码 重复汇编3次WEND 123 宏定义MACRO MEND和退出宏MEXIT指示符 MACRO指示符标记一个宏定义的开始 MEND指示符标记这个宏定义的结束 而MEXIT指示符通知汇编器 从宏中退出 124 MACRO和MEND指示符 格式MACROmacro prototype codeMEND在MACRO指示符后 下一行必须跟着宏原型 macro prototype 语句 宏原型语句格式是 label macroname parameter1 parameter2 125 使用使用时 在宏的内部 像 label parameter这些参数 能够像其他的变量那样 以同样的方法被使用 每次宏调用 macroinvocation 时 都要给它们一个新的值 参数必须使用 用来与其他符号区别 label是可选参数 如果宏内定义一个内部标号 label是有用的 它被看作宏的一个参数 如果使用符号 作为变量 用于表示一个参数的缺省值 如果变量被省略 用空串替换 如果一个参数后面紧跟着文本或另一个参数 在扩展时它们之间无空格时 用 放在它们中间 如果前面是文本后面是参数 不能使用 宏定义了局部变量的使用范围 宏能够被嵌套 使用举例 见参考书 126 MEXIT指示符MEXIT用于在宏定义结束前退出 格式MEXIT 使用在汇编期间 当需要从一个宏中退出时 使用MEXIT指示符 使用举例 见参考书 127 包含文件的INCLUDE和INCBIN指示符 见参考书 128 4 1 8报告指示符 报告指示符的共同之处是使用它们能够产生一些报告信息 报告指示符包括 ASSERT INFO OPT SUBT和TTL指示符 129 表4 7报告指示符 130 4 1 9表达式和操作符 表达式是符号 值 一元或二元操作符以及括号的组合 在它们计算时 有严格的优先级 在括号中的表达式先计算 按操作符的优先级进行计算 相邻的一元操作符从右到左计算 同优先级的二元操作符从左到右计算 131 串表达式由串文字 串常量 串变量和对串处理的操作符及括号的组合组成 串文字由包含在双引号内的字符串组成 串文字的长度由输入行的长度限制 对于不能被放在串文字中的字符 能够用一元操作符 CHR 放在串表达式中 其后允许放置整数0 255 ASCII字符编码 串表达式的长度值不能超过512个字符 长度可以为0 如果串文字中包含一个 或一个双引号时 可以用 表示 用两个双引号表示一个双引号 132 串表达式 数值表达式由表示数值常量的符号 数值变量 数值常量 二元操作符和括号的组合组成 如果整个表达式计算产生的值不包含寄存器和程序计数器 数值表达式可以包含相对寄存器或相对程序的表达式 数值表达式计算产生32位整数 程序员可以把它们看作0 2 1的无符号数 或看作 2 2 1的带符号数 然而汇编器对 n和2 n不作区别 关系操作符 像 等 使用无符号数的解释 因此0 1结果为 FALSE 133 数值表达式 相对寄存器和相对程序的表达式 一个相对寄存器的表达式计算产生指定寄存器加或减一个数值常数 一个相对程序的表达式计算产生程序计数器 p

温馨提示

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

评论

0/150

提交评论