RealView Compilation Tools Assembler Guide

Size: px
Start display at page:

Download "RealView Compilation Tools Assembler Guide"

Transcription

1 RealView 编译工具 2.0 版 汇编程序指南 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

2 RealView 编译工具汇编程序指南 ARM Limited 版权所有 保留所有权利 发行版信息 已对本书做出了下列更改 更改历史 日期问题更改 2002 年 8 月 A 发行版 年 1 月 B 发行版 2.0 所有权声明 带有 或 标记的单词和徽标是 ARM Limited 拥有的注册商标或商标 此处提到的其它品牌和名称可能是其各自拥有者的商标 未经版权拥有者的事先书面允许, 不得以任何材料形式改编或复制本文档所含信息或所述产品的部分或全部内容 本文档中描述的产品可能会进行不断的开发和改进 文档中包含的本产品的所有细节及其使用说明, 都是由 ARM 精诚提供的 但是, 我们将不做出所有隐含的或明示的保证, 包括但不限于对可销售性或适合特定用途的保证 本文档仅旨在帮助读者使用本产品 ARM Limited 将不对因使用本文档中的任何信息而造成的损失或损害负责, 也不对这些信息中的任何错误或遗漏或对本产品的任何不正确使用负责 机密性状态 本文档是供开放访问的 对其没有发行限制 产品状态 本文档中的信息是最终信息 ( 即为已开发好的产品提供的信息 ) 网址 ii ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

3 目录 RealView 编译工具汇编程序指南 序言 关于本书... viii 反馈...xi 第 1 章 第 2 章 第 3 章 简介 1.1 关于 RealView 编译工具汇编程序 编写 ARM 和 Thumb 汇编语言 2.1 简介 ARM 体系结构概述 汇编语言模块的结构 使用 C 预处理程序 条件执行 将常数装载到寄存器中 将地址装载到寄存器中 装载和存储多个寄存器指令 使用宏 用 MAP 和 FIELD 命令描述数据结构 使用框架命令 汇编程序参考 3.1 命令语法 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 iii

4 3.2 源语句行格式 预定义的寄存器和协处理器名称 内置变量 符号 表达式 文本和运算符 第 4 章第 5 章第 6 章第 7 章 ARM 指令参考 4.1 条件执行 ARM 存储器访问指令 ARM 通用数据处理指令 ARM 乘法指令 ARM 饱和指令 ARM 并行指令 ARM 组合和分离指令 ARM 跳转指令 协处理器指令 其它 ARM 指令 ARM 伪指令 Thumb 指令参考 5.1 Thumb 存储器访问指令 Thumb 算术指令 Thumb 通用数据处理指令 Thumb 跳转指令 其它 Thumb 指令 Thumb 伪指令 向量浮点编程 6.1 向量浮点协处理器 浮点寄存器 向量和标量运算 VFP 和条件码 VFP 系统寄存器 清零模式 VFP 指令 VFP 伪指令 VFP 命令和向量记号 命令参考 7.1 按字母顺序排列的命令表 符号定义命令 数据定义命令 汇编控制命令 结构描述命令 报告命令 其它命令 iv ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

5 词汇表 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 v

6 vi ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

7 序言 本序言介绍有关 RealView 编译工具 (RVCT) 汇编程序和汇编语言的文档 其中包含下列各部分 : 第 viii 页的关于本书 第 xi 页的反馈 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 vii

8 序言 关于本书 本书提供 RVCT 汇编程序 ( 独立的汇编程序 armasm, 以及 C 和 C++ 编译程序中的内联汇编程序 ) 的指南和参考信息 书中描述了汇编程序的命令行选项, 为汇编语言程序员提供的伪指令和命令, 以及 ARM Thumb 和向量浮点 (VFP) 指令集 适合的读者 本书是为使用 RVCT 创作应用程序的所有开发人员编写的 它假定读者是有经验的软件开发人员, 并且熟悉 RealView 编译工具 2.0 版入门指南中描述的 ARM 开发工具 使用本书 本书按下列各章组织 : 第 1 章简介 阅读此章了解对 RVCT 2.0 版汇编程序和汇编语言的简介 第 2 章编写 ARM 和 Thumb 汇编语言阅读此章获得指南信息, 以帮助读者使用 ARM 汇编程序和汇编语言 第 3 章汇编程序参考阅读此章获得由 ARM 汇编程序提供的有关语言语法和结构的参考材料 第 4 章 ARM 指令参考阅读此章获得 ARM 指令集的参考材料 第 5 章 Thumb 指令参考阅读此章获得 Thumb 指令集的参考材料 第 6 章向量浮点编程 阅读此章获得 VFP 指令集的参考材料以及其它与 VFP 相关的汇编语言信息 viii ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

9 序言 第 7 章命令参考阅读此章获得可在 ARM 汇编程序 armasm 中使用的汇编程序命令的参考材料 印刷约定 本书中使用了下列印刷约定 : 等宽字体等宽字体等宽斜体等宽粗体斜体粗体 表示可在键盘上输入的文本, 例如命令 文件和程序名称及源代码 表示命令或选项所允许的缩写词 可以输入带下划线文本来代替整个命令或选项名称 表示命令和函数的自变量, 其中函数中的自变量将由指定的值代替 表示在示例代码外使用的语言关键字 突出显示重要的备注, 介绍特殊术语, 表示内部交叉引用, 以及引用 突出显示界面元素 ( 如菜单名称 ) 有时候也用于在描述性的列表中进行强调, 以及表示 ARM 处理器信号名称 更深入的读物 本节列出 ARM Limited 和第三方的出版物, 其中提供了为 ARM 系列处理器开发代码的附加信息 ARM 定期对其文档进行更新和修正 有关当前勘误表和增补以及 ARM 常见问题的信息, 请访问 ARM 出版物 本书包含与随 RVCT 提供的开发工具相关的参考信息 该套件中包含的其它出版物有 : RealView 编译工具 2.0 版入门指南 (ARM DUI 0202) RealView 编译工具 2.0 版开发人员指南 (ARM DUI 0203) ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 ix

10 序言 RealView 编译工具 2.0 版编译程序和程序库指南 (ARM DUI 0205) RealView 编译工具 2.0 版链接程序和实用程序指南 (ARM DUI 0206) 随 RealView 编译工具提供了下列附加文档 : ARM FLEXlm 许可证管理指南 (ARM DUI 0209) 此指南以 DynaText 和 PDF 格式提供 ARM 体系结构参考手册 (ARM DDI 0100) 该手册作为联机图书的组成部分以 DynaText 格式提供, 并以 PDF 文件 DDI0100E_ARM_ARM.pdf 形式提供, 该文件位于 install_directory\documentation\armarm\5.0\release\windows\pdf 中 ARM ELF 规范 (SWS ESPC 0003) 这是以 PDF 文件格式提供的, 文件名为 ARMELF.pdf, 位于 install_directory\documentation\specifications\1.0\release\platform\pdf 下 TIS DWARF 2 规范 这是以 PDF 文件格式提供的, 文件名为 TIS-DWARF2.pdf, 位于 install_directory\documentation\specifications\1.0\release\platform\pdf 下 ARM-Thumb 过程调用标准规范 这是以 PDF 文件格式提供的, 文件名为 ATPCS.pdf, 位于 install_directory\documentation\specifications\1.0\release\platform\pdf 下 此外, 可参考下列文档来了解与 ARM 产品相关的特定信息 : RealView ARMulator ISS v1.3 用户指南 (ARM DUI 0207) ; ARM 参考外设规范 (ARM DDI 0062) ; 您的硬件设备的 ARM 数据表或技术参考手册 其它出版物 下面这本书提供了关于 ARM 体系结构的通用信息 : ARM 芯片系统体系结构, Furber, S.,(2000 年第 2 版 ) Addison Wesley Longman, Harlow, England. ISBN x ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

11 序言 反馈 ARM 欢迎您提出关于 RealView 编译工具和文档的反馈信息 对 RealView 编译工具的反馈信息 如果您有关于 RealView 编译工具的任何问题, 请与您的供货商联系 为了帮助他们提供快速而有益的响应, 请提供 : 您的姓名和公司 ; 产品的序列号 ; 您正在使用版本的详细信息 ; 您正在运行的平台的详细信息, 例如硬件平台 操作系统类型和版本 ; 能复现问题的一小段独立的示例代码 ; 清晰地解释您期望发生的和实际发生的操作 ; 您使用的命令, 包括任何命令行选项 ; 说明问题的输出样例 ; 工具的版本字符串, 包括版本号和编译号 对本书的反馈 如果您注意到本书中有任何错误或遗漏, 请发送电子邮件到 errata@arm.com, 并提供 : 文档标题 ; 文档编号 ; 您的意见所适用的页码 ; 问题的简要说明 也欢迎对增补和改进提出一般性建议 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 xi

12 序言 xii ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

13 第 1 章简介 本章介绍随 RealView 编译工具 2.0 版提供的汇编程序 其中包含下面部分 : 第 1-2 页的关于 RealView 编译工具汇编程序 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 1-1

14 简介 1.1 关于 RealView 编译工具汇编程序 RealView 编译工具 (RVCT) 拥有 : 独立的汇编程序 armasm ; 内嵌到 C 和 C++ 编译程序中的优化内联汇编程序 这些汇编程序所用的输入语言基本相同 但是, 对可以在内联汇编程序中使用的语言特性有一些限制 有关内嵌汇编程序的详细信息, 请参阅 RealView 编译工具 2.0 版开发人员指南中的混合使用 C C++ 和汇编语言一章 本书的其余内容主要介绍 armasm ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

15 第 2 章编写 ARM 和 Thumb 汇编语言 本章简单介绍编写 ARM 和 Thumb 汇编语言的一般原则 其中包含下列各部分 : 第 2-2 页的简介 ; 第 2-3 页的 ARM 体系结构概述 ; 第 2-13 页的汇编语言模块的结构 ; 第 2-21 页的使用 C 预处理程序 ; 第 2-22 页的条件执行 ; 第 2-27 页的将常数装载到寄存器中 ; 第 2-32 页的将地址装载到寄存器中 ; 第 2-41 页的装载和存储多个寄存器指令 ; 第 2-50 页的使用宏 ; 第 2-53 页的用 MAP 和 FIELD 命令描述数据结构 ; 第 2-68 页的使用框架命令 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-1

16 编写 ARM 和 Thumb 汇编语言 2.1 简介 本章提供对如何编写 ARM 和 Thumb 汇编语言模块的基本的 实用的了解 其中也给出由 ARM 汇编程序 (armasm) 提供的工具的相关信息 本章不提供 ARM Thumb 或 VFP 指令集的详细描述 有关这些信息请参阅第 4 章 ARM 指令参考, 第 5 章 Thumb 指令参考和第 6 章向量浮点编程 详细信息请参阅 ARM 体系结构参考手册 代码示例 本章有很多代码示例 其中很多示例可在 RVCT 的 examples\asm 目录中找到 请遵照下面这些步骤来建立和链接汇编语言文件 : 1. 在命令提示行键入 armasm -g filename.s 来汇编文件和生成调试表 2. 键入 armlink filename.o -o filename 来链接目标文件和生成一个 ELF 可执行映像 要执行和调试映像, 根据适合的调试目标, 将其装载到一个 ELF/DWARF2 兼容的调试器中 要查看汇编程序是如何转换源代码的, 可输入 : fromelf -c filename.o 有关 armlink 和 fromelf 的详细信息, 请参阅 RealView 编译工具 2.0 版链接程序和实用程序指南 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

17 编写 ARM 和 Thumb 汇编语言 2.2 ARM 体系结构概述 本节简要概述 ARM 体系结构 ARM 系列处理器是典型的 RISC 处理器, 因为它们实现的是装载 / 存储体系结构 只有装载和存储指令才能访问存储器 数据处理指令只操作寄存器的内容 体系结构的版本 本书中的信息和示例假定您使用的是实现了 v3 或以上版本 ARM 体系结构的处理器 有关各个体系结构版本的详细信息, 请参阅 ARM 体系结构参考手册 所有这些处理器都具有 32 位寻址范围 ARM 和 Thumb 状态 ARM 体系结构 v4t 及以上版本定义了一个 16 位指令集, 称之为 Thumb 指令集 Thumb 指令集的功能是 32 位 ARM 指令集功能的一个子集 有关详细信息请参阅第 2-10 页的 Thumb 指令集概述 正在执行 Thumb 指令的处理器工作在 Thumb 状态 正在执行 ARM 指令的处理器工作在 ARM 状态 ARM 状态下的处理器不能执行 Thumb 指令, 而 Thumb 状态下的处理器不能执行 ARM 指令 用户必须确保处理器永远不会收到对于当前状态是错误指令集的指令 每种指令集都包含转变处理器状态的指令 用户也必须使用 CODE16 和 CODE32 命令切换汇编程序模式, 以生成正确的运行代码 详细信息请参阅第 7-57 页的 CODE16 和 CODE32 ARM 处理器总是在 ARM 状态下开始执行代码 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-3

18 编写 ARM 和 Thumb 汇编语言 处理器模式 ARM 处理器支持多达七个处理器模式, 具体要取决于体系结构的版本 这些模 式是 : 0b10000 User ; 0b10001 FIQ 快速中断请求 ; 0b10010 IRQ 中断请求 ; 0b10011 Supervisor ; 0b10111 Abort ; 0b11011 Undefined ; 0b11111 System (ARM 体系结构 v4 及以上版本 ) 除 User 模式外的所有模式称为特权模式 要求任务保护的应用程序通常在 [User] 模式下执行 有些嵌入式应用程序可能完全运行在 [Supervisor] 或 [System] 模式下 进入除 [User] 模式外的所有模式是为了处理异常或访问特许的资源 有关详细信息, 请参阅 RealView 编译工具 2.0 版开发人员指南中的处理处理器异常一章, 以及 ARM 体系结构参考手册 寄存器 ARM 处理器拥有 37 个寄存器 这些寄存器按部分重叠的编组加以排列 每种处理器模式有一个不同的寄存器组 编组的寄存器为处理处理器异常和特许操作提供了快速的环境切换 有关寄存器如何编组的详细信息, 请参阅 ARM 体系结构参考手册 下列寄存器可用在 ARM 体系结构 v3 及以上版本中 : 30 个通用的 32 位寄存器 ; 第 2-5 页的程序计数器 (pc) ; 第 2-5 页的当前程序状态寄存器 (CPSR) ; 第 2-6 页的五个保存的程序状态寄存器 (SPSR) 30 个通用的 32 位寄存器 具体取决于当前处理器模式, 任一时刻, 可将十五个通用寄存器看作 r0, r1,..., r13, r14 按照惯例, 在 ARM 汇编语言中, r13 用作栈指针 (sp) C 和 C++ 编译程序总是将 r13 用作栈指针 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

19 编写 ARM 和 Thumb 汇编语言 在 [User] 模式下, r14 被用作链接寄存器 (lr), 用于存储子例程调用时的返回地址 如果返回地址存储在栈上, 也可将其用作一个通用寄存器 在异常处理模式中,r14 存放异常的返回地址, 或者如果在一个异常内执行子程序调用, 则存放子程序返回地址 如果返回地址存储在栈上, 也可将 r14 用作一个通用寄存器 程序计数器 (pc) 程序计数器被当作 r15 ( 或 pc) 来加以访问 对于 ARM 状态下的每条指令, 其以一个字 ( 四字节 ) 为增量, 在 Thumb 状态下则以两个字节为增量 跳转指令将目的地址装载到程序计数器中 也可以使用数据操作指令来直接装载程序计数器 例如, 为了从一个子程序中返回, 可以将链接寄存器复制到程序计数器中, 使用下列方法 : MOV pc,lr 在执行时, r15 不包含当前正在执行指令的地址 在 ARM 状态下, 当前执行指令的地址一般是 pc 8, 而在 Thumb 状态下一般是 pc 4 当前程序状态寄存器 (CPSR) CPSR 存放 : 算术逻辑单元 (ALU) 状态标志的副本 ; 当前处理器模式 ; 中断禁止标志 CPSR 中的 ALU 状态标志用于确定是否执行了条件指令 有关详细信息请参阅第 2-22 页的条件执行 在能支持 Thumb 或能支持 Jazelle 的处理器上, CPSR 也存放当前处理器状态 (ARM Thumb 或 Jazelle) 在 ARM 体系结构的 v5te 和 v6 及以上版本中, CPSR 也存放 Q 标志 ( 请参阅第 2-22 页的 ALU 状态标志 ) 在 ARM 体系结构的 v6 及以上版本中, CPSR 也存放 GE 标志 ( 请参阅第 4-83 页的并行加法和减法 ) 和端序位 ( 请参阅第 页的 SETEND) ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-5

20 编写 ARM 和 Thumb 汇编语言 五个保存的程序状态寄存器 (SPSR) 当发生一个异常时, SPSR 用于存储 CPSR 在每个异常处理模式下, 可访问一个 SPSR [User] 模式和 [System] 模式不拥有 SPSR, 因为它们不是异常处理模式 有关详细信息, 请参阅 RealView 编译工具 2.0 版开发人员指南中的处理处理器异常一章 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

21 编写 ARM 和 Thumb 汇编语言 ARM 指令集概述 所有 ARM 指令的长度都是 32 位 指令是按字对齐方式存储的, 因此, 在 ARM 状态下, 指令地址的两个最低有效位总是 0 有些指令使用最低有效位来确定跳转的目标地址上是 Thumb 代码还是 ARM 代码 有关 ARM 指令集的详细信息, 请参阅第 4 章 ARM 指令参考 ARM 指令可以划分成多个功能组 : 跳转指令 ; 数据处理指令 ; 单个寄存器装载和存储指令 ; 第 2-8 页的多个寄存器装载和存储指令 ; 第 2-8 页的状态寄存器访问指令 ; 第 2-8 页的协处理器指令 跳转指令 这些指令用于 : 向后跳转以构成循环 ; 在条件结构中向前跳转 ; 跳转到子程序 ; 将处理器从 ARM 状态转换到 Thumb 状态 数据处理指令 这些指令操作通用寄存器 它们对两个寄存器的值执行一些运算, 例如加法 减法或按位逻辑运算, 并将结果放到第三个寄存器中 它们也操作单个寄存器中的值, 或者操作一个寄存器中的值以及在指令内提供的一个常数 ( 立即值 ) 长整数乘法指令 ( 在有些体系结构中不可用 ) 在两个寄存器中给出一个 64 位结果 单个寄存器装载和存储指令 这些指令从存储器装载或存储单个寄存器的值, 或存储到存储器中 它们可以装载或存储 32 位字或 8 位无符号字节 在 ARM 体系结构的 v4 及以上版本中, 它们也可以装载或存储 16 位无符号半字, 或者装载和符号扩展 16 位半字或 8 位字节 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-7

22 编写 ARM 和 Thumb 汇编语言 信号量指令装载和改变存储器信号量 多个寄存器装载和存储指令 这些指令从存储器装载或存储通用寄存器的任何子集, 或存储到存储器中 有关这些指令的详细描述, 请参阅第 2-41 页的装载和存储多个寄存器指令 状态寄存器访问指令 这些指令将 CPSR 或 SPSR 的内容移到或移出通用寄存器 协处理器指令 这些指令支持扩展 ARM 体系结构的一种通用方式 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

23 编写 ARM 和 Thumb 汇编语言 ARM 指令能力 下列特征适用于 ARM 指令 : 条件执行 ; 寄存器访问 ; 访问内联的滚筒式移位器 条件执行 几乎所有 ARM 指令都可根据 CPSR 中的 ALU 状态标志的值, 来有条件地加以执行 不需要使用跳转来跳过条件指令, 尽管当一系列指令依赖于相同的条件时, 这样做的效果会更好 可以指定一个数据处理指令是否设置这些标志的状态 可以使用由一个指令设置的标志来控制其它指令的执行, 即使在它们之间有很多指令 详细描述请参阅第 2-22 页的条件执行 寄存器访问 在 ARM 状态下, 所有指令都可访问 r0 到 r14, 而且大多数指令也允许访问 r15 (pc) MRS 和 MSR 指令可将 CPSR 和 SPSR 的内容移动到通用寄存器中, 在此可按普通的数据处理操作来处理它们 有关详细信息请参阅第 页的 MRS 和第 页的 MSR 访问内联的滚筒式移位器 ARM 算术逻辑单元含有一个 32 位滚筒式移位器, 能执行移位和循环操作 对于所有 ARM 数据处理指令和单寄存器数据传送指令的第二个操作数, 在执行数据处理或数据传送之前, 作为指令的一部分, 可以对其执行移位操作 这种操作支持 ( 但不限于 ): 比例寻址 ; 乘以一个常数 ; 构造常数 有关使用滚筒式移位器生成常数的详细信息, 请参阅第 2-27 页的将常数装载到寄存器中 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-9

24 编写 ARM 和 Thumb 汇编语言 Thumb 指令集概述 Thumb 指令集的功能几乎完全是 32 位 ARM 指令集功能的一个子集 该指令集为用 C 或 C++ 编译程序生成代码进行了优化 所有 Thumb 指令的长度为 16 位, 并以半字对齐方式存储在存储器中 因此, 在 Thumb 状态下, 指令地址的最低有效位总是 0 有些指令使用最低有效位来确定跳转的目标地址上是 Thumb 代码还是 ARM 代码 所有 Thumb 数据处理指令 : 操作寄存器中的全 32 位值 ; 使用全 32 位地址进行数据访问和指令获取 有关 Thumb 指令集的语法, 以及 Thumb 指令与其对等的 ARM 指令的差别的详细信息, 请参阅第 5 章 Thumb 指令参考 Thumb 指令功能 下列特征适用于 Thumb 指令 : 条件执行 ; 寄存器访问 ; 第 2-11 页的访问滚筒式移位器 条件执行 在 Thumb 指令集中, 条件跳转指令是唯一可根据 CPSR 中的 ALU 状态标志的值而有条件地执行的指令 所有数据处理指令更新这些标志, 但当一个或多个高位寄存器被指定为 MOV 或 ADD 指令的操作数时除外 在这些情况下, 标志不能更新 在设置一个条件的指令和依赖于该条件的条件跳转之间, 不能包含任何数据处理指令 在希望进行条件执行的地方使用条件跳转指令 寄存器访问 在 Thumb 状态中, 大多数指令只能访问 r0 到 r7 这些寄存器被称为低位寄存器 寄存器 r8 到 r15 是有访问限制的寄存器 在 Thumb 状态中, 这些寄存器被称为高位寄存器 例如, 它们可用作快速的临时存储器 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

25 编写 ARM 和 Thumb 汇编语言 关于可访问高位寄存器的 Thumb 数据处理指令的完整列表, 请参阅第 5 章 Thumb 指令参考 访问滚筒式移位器 在 Thumb 状态中, 只能在使用 LSL LSR ASR 或 ROR 指令的独立操作中, 使用滚筒式移位器 Thumb 指令集和 ARM 指令集的差别 在以下标题中将讨论 Thumb 指令集和 ARM 指令集的一般差别 : 跳转指令 ; 数据处理指令 ; 第 2-12 页的单个寄存器装载和存储指令 ; 第 2-12 页的多个寄存器装载和存储指令 没有 Thumb 协处理器指令, 没有 Thumb 信号量指令, 也没有访问 CPSR 或 SPSR 的 Thumb 指令 跳转指令 这些指令用于 : 向后跳转以构成循环 ; 在条件结构中向前跳转 ; 跳转到子程序 ; 将处理器从 Thumb 状态转换到 ARM 状态 相对程序的跳转, 特别是条件跳转, 其作用范围比在 ARM 代码中更有限, 并且对子程序的跳转只能是无条件的 数据处理指令 这些指令操作通用寄存器 在很多情况下, 操作结果必须放在一个操作数寄存器中, 而不是放在第三个寄存器中 与 ARM 状态下相比, 可使用的数据处理操作较少 它们能有限地访问寄存器 r8 到 r15 除了在使用 MOV 或 ADD 指令访问寄存器 r8 到 r15 时之外, 这些指令总是更新 CPSR 中的 ALU 状态标志 访问寄存器 r8 到 r15 的 Thumb 数据处理指令不能更新标志 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-11

26 编写 ARM 和 Thumb 汇编语言 单个寄存器装载和存储指令 这些指令装载单个低位寄存器的值, 或存储到存储器中 在 Thumb 状态中, 这些指令只能访问 r0 到 r7 多个寄存器装载和存储指令 LDM 和 STM 从存储器装载 r0 到 r7 范围内的寄存器的任何子集, 或将其存储到存储器中 PUSH 和 POP 指令使用栈指针 (r13) 作为基址, 实现了完全降序的栈 除了传送 r0 到 r7 之外, PUSH 可以存储链接寄存器, POP 可以装载程序计数器 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

27 编写 ARM 和 Thumb 汇编语言 2.3 汇编语言模块的结构 汇编语言是指 ARM 汇编程序 (armasm) 分析语法并汇编生成目标代码的语言 其可以是 : ARM 汇编语言 ; Thumb 汇编语言 ; 两者的混合 汇编语言源文件的编排 汇编语言的源语句行的一般格式是 : {label} {instruction directive pseudo-instruction} {;comment} 备注即使没有标号, 指令 伪指令和命令前面也必须有空白, 例如一个空格或制表符 源语句行的所有三部分都是可选的 可以使用空行来使代码更具可读性 大小写规则 指令记忆码 命令和符号寄存器名称可以用大写或小写编写, 但不能混合使用大小写 语句行长度 为使源文件更易读, 可以通过在行尾放置反斜杠符 ( \ ), 来将较长的语句行分解到几个行中 反斜杠符后面不得有任何其它字符 ( 包括空格和制表符 ) 汇编程序将反斜杠 / 行结束序列当作空白来处理 备注不要在用引号括住的字符串中使用反斜杠 / 行结束序列 行长度的限值是 4095 个字符, 包括使用反斜杠后的任何扩展在内 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-13

28 编写 ARM 和 Thumb 汇编语言 标号 标号是表示地址的符号 在汇编时计算由标号指定的地址 汇编程序计算标号的地址, 该地址是相对于标号所在段的原点的 引用相同段内的一个标号时, 可以使用程序计数器加上或减去一个偏移量 这被称为相对程序的寻址 标号可以在一个映射中定义 请参阅第 2-53 页的用 MAP 和 FIELD 命令描述数据结构 在运算时, 可以将映射的原点放在一个指定的寄存器中, 并用所指定的寄存器加上一个偏移量来引用标号 这被称为相对寄存器的寻址 其它段中的标号地址是在链接时计算的, 此时链接程序已在存储器中为每个段分配了具体的位置 局部标号 局部标号是标号的一个子类 局部标号以 0-99 范围内的一个数字开头 与其它标号不同的是, 局部标号可以被定义多次 在生成含有一个宏的标号时, 局部标号就很有用 当汇编程序找到对一个局部标号的引用时, 就将其链接到该局部标号的邻近实例上 局部标号的作用范围由 AREA 命令加以限制 可以使用 ROUT 命令来更严格地限制范围 请参阅第 3-16 页的局部标号以了解下列内容的有关详细信息 : 局部标号声明的语法 ; 汇编程序如何利用其标号来关联对局部标号的引用 注释 一行中的第一个分号标记注释的开始, 但不包括出现在一个字符串常数内的分号 行的末尾就是注释的结束 一个注释本身就是一个有效的行 汇编程序将忽略所有注释 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

29 编写 ARM 和 Thumb 汇编语言 常数 常数可以数值 布尔值 字符或字符串 数字可以接受下列形式的数字常数 : 十进制数, 如 123 十六进制数, 如 0x7B n_xxx, 其中 : n 是 2 到 9 之间的基数 xxx 是采用该基数的数字 布尔值布尔常数 TRUE 和 FALSE 必须书写为 {TRUE} 和 {FALSE} 字符 字符串 字符常数由左 右单引号组成, 中间括住单个字符或一个转义字符, 采用标准的 C 转义字符 字符串由左 右双引号括住多个字符或空格而组成 如果在一个字符串内使用了双引号或美元字符作为文字文本字符, 则必须用一对适当的字符来表示它们 例如, 如果需要在字符串内使用单个 $, 则必须使用 $$ 在字符串常数内可以使用标准的 C 转义序列 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-15

30 编写 ARM 和 Thumb 汇编语言 ARM 汇编语言模块的示例 示例 2-1 说明了汇编语言模块的一些核心成分 此示例是用 ARM 汇编语言编写的 在 RVCT 的 examples\asm 子目录下, 以 armex.s 文件形式提供了该示例 有关如何汇编 链接和执行该示例的操作说明, 请参阅第 2-2 页的代码示例 以下各节详细介绍此示例的组成部分 示例 2-1 start stop AREA ENTRY ARMex, CODE, READONLY ; Name this block of code ARMex ; Mark first instruction to execute MOV r0, #10 ; Set up parameters MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI END ; Mark end of file ELF 段和 AREA 命令 ELF 段是独立的 命名的 不可分割的代码或数据序列 单个代码段是生成一个应用程序的最低要求 汇编或编译的输出可以包括 : 一个或多个代码段 它们通常是只读段 ; 一个或多个数据段 它们通常是读写段 它们可以是零初始化的 (ZI) 链接程序依照段位置规则, 将每个段放在一个程序映像中 在源文件中相邻的段, 不一定要在应用程序映像中相邻 有关链接程序如何定位段的详细信息, 请参阅 RealView 编译工具 2.0 版链接程序和实用程序指南中的链接程序一章 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

31 编写 ARM 和 Thumb 汇编语言 在 ARM 汇编语言源文件中, 用 AREA 命令来标记一个段的开始 该命令对段进行命名并设置其属性 属性放在名称后面, 之间用逗号分隔 有关 AREA 命令的语法的详细描述, 请参阅第 7-54 页的 AREA 可以为段选择任何段名 但是, 以任何非字母数字字符开头的名称必须放在竖杠内, 否则会产生一个 [AREA name missing] 错误 例如 : 1_DataArea 第 2-16 页的示例 2-1 定义了包含代码的 名为 ARMex 的单个段, 并将其标记为 READONLY ENTRY 命令 ENTRY 命令标记要执行的第一个指令 在包含 C 代码的应用程序中, 在 C 库的初始化代码中也包含一个入口点 初始化代码和异常处理程序也包含入口点 应用程序执行 第 2-16 页的示例 2-1 中的应用程序代码在标号 start 处开始执行, 在此将十进制数值 10 和 3 装载到寄存器 r0 和 r1 中 将这些寄存器相加, 把结果放入 r0 中 应用程序终止 在执行主代码后, 应用程序将控制返回调试器, 从而终止执行 这是通过使用 ARM 半主机 SWI ( 默认是 0x123456), 采用下列参数来加以实现的 : r0 等于 angel_swireason_reportexception (0x18) ; r1 等于 ADP_Stopped_ApplicationExit (0x20026) 有关其它信息, 请参阅 RealView 编译工具 2.0 版编译程序和库指南中的半主机 SWI 一章 END 命令 此命令指示汇编程序停止处理这个源文件 每个汇编语言源模块必须以一行单独的 END 命令结束 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-17

32 编写 ARM 和 Thumb 汇编语言 调用子程序 要调用子程序, 可使用一个跳转和链接指令 其语法是 : BL destination 其中 destination 通常是位于子程序的第一个指令处的标号 destination 也可以是一个相对程序或相对寄存器的表达式 有关详细信息请参阅第 4-98 页的 B 和 BL BL 指令 : 将返回地址放入链接寄存器 (lr) 中 ; 将程序计数器设置为子程序的地址 在执行子程序代码后, 可以使用 MOV pc,lr 指令返回 根据约定, 寄存器 r0 到 r3 用于给子程序传递参数, 并将结果送回调用程序 备注单独汇编或编译的模块之间的调用, 必须符合由程序调用标准规定的限制和约定 有关详细信息, 请参阅 RealView 编译工具 2.0 版开发人员指南中的使用程序调用标准一章 示例 2-2 说明了一个将两个参数值相加并将结果返回 r0 的子程序 该示例的代码在 RVCT examples\asm 子目录下的 subrout.s 文件中 有关如何汇编 链接和执行该示例的操作说明, 请参阅第 2-2 页的代码示例 示例 2-2 AREA subrout, CODE, READONLY ; Name this block of code ENTRY ; Mark first instruction to execute start MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutine stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

33 编写 ARM 和 Thumb 汇编语言 doadd ADD r0, r0, r1 ; Subroutine code MOV pc, lr ; Return from subroutine END ; Mark end of file ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-19

34 编写 ARM 和 Thumb 汇编语言 一个 Thumb 汇编语言模块示例 示例 2-3 说明了 Thumb 汇编语言模块的一些核心成分 此示例基于 subrout.s 文件 该示例的代码在 RVCT 的 examples\asm 子目录下的 thumbsub.s 文件中 有关如何汇编 链接和执行该示例的操作说明, 请参阅第 2-2 页的代码示例 示例 2-3 AREA ThumbSub, CODE, READONLY ; Name this block of code ENTRY ; Mark first instruction to execute CODE32 ; Subsequent instructions are ARM header ADR r0, start + 1 ; Processor starts in ARM state, BX r0 ; so small ARM code header used ; to call Thumb main program CODE16 ; Subsequent instructions are Thumb start MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutine stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0xAB ; Thumb semihosting SWI doadd ADD r0, r0, r1 ; Subroutine code MOV pc, lr ; Return from subroutine END ; Mark end of file CODE32 和 CODE16 命令 这些命令指示汇编程序将随后的指令汇编为 ARM (CODE32) 或 Thumb (CODE16) 指令 它们不能汇编成运行时改变处理器状态的指令 它们只能改变汇编程序状态 默认情况下, ARM 汇编程序 armasm 启动在 ARM 模式下 如果想让其启动在 Thumb 模式下, 可以在命令行中使用 -16 选项 BX 指令 这是一条可在运行时改变处理器状态的跳转指令 目的地址的最低有效位指定其是一条 ARM 指令 ( 清除 ) 还是 Thumb 指令 ( 设置 ) 在此例中, 该位是在 ADR 伪指令中设置的 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

35 编写 ARM 和 Thumb 汇编语言 2.4 使用 C 预处理程序 在汇编语言源文件中, 可以包含 C 预处理程序命令 #include 如果这样做, 则必须在使用 armasm 汇编文件之前, 使用 C 预处理程序预先处理它 请参阅 RealView 编译工具 2.0 版编译程序和库指南 armasm 会正确解释结果文件中的 #line 命令 其能使用 #line 命令中的信息产生错误信息和 debug_line 表 示例 2-4 说明了用来预处理和汇编 sourcefile.s 的命令 在此例中, 预处理程序输出一个名为 preprocessed.s 的文件, 而 armasm 汇编 preprocessed.s 示例 2-4 预处理汇编语言源文件 armcpp -E sourcefile.s > preprocessedfile.s armasm preprocessedfile.s ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-21

36 编写 ARM 和 Thumb 汇编语言 2.5 条件执行 在 ARM 状态中, 每个数据处理指令都有一个选项, 可根据操作结果来更新当前程序状态寄存器 (CPSR) 中的 ALU 标志 对一个 ARM 数据处理指令添加一个 S 后缀, 可使其更新 CPSR 中的 ALU 状态标志 不要将 S 后缀用于 CMP CMN TST 或 TEQ 这些比较指令总是更新标志 这是它们的唯一作用 在 Thumb 状态下没有选项 所有数据处理指令都更新 CPSR 中的 ALU 状态标志, 但在 MOV 和 ADD 中使用了一个或多个高位寄存器除外 在这些情况下, MOV 和 ADD 不能更新状态标志 几乎每条 ARM 指令都可根据 CPSR 中的 ALU 状态标志的值, 来有条件地加以执行 有关添加到指令上以使其条件执行的后缀的列表, 请参阅第 2-23 页上的表 2-1 在 ARM 状态中, 可以 : 根据数据操作结果更新 CPSR 中的 ALU 状态标志 ; 执行几个其它数据操作而不更新标志 ; 根据第一个操作所更新的标志的状态, 来执行或不执行后续指令 在 Thumb 状态中, 大多数数据操作总是更新标志, 并且只能使用条件跳转指令 (B) 来实现条件执行 该指令的后缀与在 ARM 状态下相同 没有其它指令是有条件的 ALU 状态标志 CPSR 包含下列 ALU 状态标志 : N 当操作结果是负值时设置此标志 Z 当操作结果是零时设置此标志 C 当操作导致一个进位时设置此标志 V 当操作造成上溢时设置此标志 Q ARM 体系结构 v5e v6 及以上版本 粘性标志 ( 请参阅第 4-7 页的 Q 标志 ) 如果一个加法的结果大于或等于 2 32 如果一个减法的结果是正值, 或者如果是移动或逻辑指令中的一个内嵌滚筒式移位器操作的结果时, 则发生进位 如果一个加法 减法或比较的结果大于或等于 2 31 或小于 2 31, 则发生上溢 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

37 编写 ARM 和 Thumb 汇编语言 执行条件 条件代码后缀与 N Z C 和 V 标志的关系如表 2-1 所示 表 2-1 条件代码后缀 后缀 标志 含义 EQ Z 设置 等于 NE Z 清除 不等于 CS/HS 设置 C 标志 大于或等于 ( 无符号的 >= ) CC/LO C 清除 小于 ( 无符号的 <) MI N 设置 取负值 PL N 清除 正数或零 VS V 设置 上溢 VC V 清除 无上溢 HI C 设置和 Z 清除 大于 ( 无符号的 >) LS C 清除和 Z 设置 小于或等于 ( 无符号的 <= ) GE N 和 V 相等 有符号的 >= LT N 和 V 不相等 有符号的 < GT 清除 Z 标志, N 和 V 相等 有符号的 > LE 设置 Z 标志,N 和 V 不相等 有符号的 <= AL 任意总是 通常忽略该后缀 示例 ADD r0, r1, r2 ; r0 = r1 + r2, don't update flags ADDS r0, r1, r2 ; r0 = r1 + r2, and update flags ADDCSS r0, r1, r2 ; If C flag set then r0 = r1 + r2, and update flags CMP r0, r1 ; update flags based on r0-r1. ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-23

38 编写 ARM 和 Thumb 汇编语言 在 ARM 状态中使用条件执行 可以利用 ARM 指令的条件执行, 来减少代码中跳转指令的数目 这样就改进了代码密度 跳转指令在处理器周期中也是很耗时的 在跳转预测硬件的 ARM 处理器上, 每次获得一个跳转时, 一般需要三个处理器周期来重填处理器流水线 有些 ARM 处理器, 如 ARM10 和 StrongARM, 带有跳转预测硬件 在使用这些处理器的系统中, 只有当存在错误预测时才需要刷新和重填流水线 使用条件执行的示例 此例使用 Euclid 的最大公因子 (gcd) 算法的两种实现方法 它说明了如何能使用条件执行来改进代码密度和执行速度 有关执行速度的详细分析只适用于 ARM7 处理器 代码密度计算适用于所有 ARM 处理器 在 C 语言中, 该算法可以表示如下 : int gcd(int a, int b) { while (a!= b) { if (a > b) a = a - b; else b = b - a; } return a; } 采用下列代码, 可以只用带条件执行的跳转来实现 gcd 函数 : gcd CMP r0, r1 BEQ end BLT less SUB r0, r0, r1 B gcd less SUB r1, r1, r0 B gcd end ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

39 编写 ARM 和 Thumb 汇编语言 由于跳转数目的原因, 该代码的长度是七条指令 每次获得一个跳转时, 处理器必须重填流水线并从新位置继续执行 其它指令和未执行的跳转各使用一个周期 通过使用 ARM 指令集的条件执行功能, 可以仅用四个指令实现 gcd 函数 : gcd CMP SUBGT SUBLT BNE r0, r1 r0, r0, r1 r1, r1, r0 gcd 除了减小了代码大小之外, 此代码在大多数情况下执行速度更快 表 2-2 和第 2-26 页上的表 2-3 说明了在 r0 = 1 和 r1 = 2 的情况下, 每次执行所用的周期数 在这种情况下, 用条件执行的所有指令来代替跳转后, 可节省三个周期 当 r0 = r1 时两种代码的执行周期数相等 在其他情况下, 代码的条件执行版本的执行周期数最少 r0: a r1: b 指令周期数 (ARM7) 1 2 CMP r0, r BEQ end 1 ( 未执行 ) 1 2 BLT less SUB r1, r1, r B gcd CMP r0, r BEQ end 3 表 2-2 仅使用条件跳转 总计 = 13 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-25

40 编写 ARM 和 Thumb 汇编语言 表 2-3 所有指令为条件执行 r0: a r1: b 指令 周期数 (ARM7) 1 2 CMP r0, r SUBGT r0,r0,r1 1 ( 未执行 ) 1 1 SUBLT r1,r1,r BNE gcd CMP r0,r SUBGT r0,r0,r1 1 ( 未执行 ) 1 1 SUBLT r1,r1,r0 1 ( 未执行 ) 1 1 BNE gcd 1 ( 未执行 ) 总计 = 10 转换为 Thumb 由于 B 是可有条件执行的唯一 Thumb 指令, 必须用 Thumb 代码的条件跳转来编写 gcd 算法 与 ARM 代码的条件跳转实现方法类似,Thumb 代码需要七条指令 但是, 与较小的 ARM 代码实现的 16 字节相比, 整个代码大小是 14 字节, 因为 Thumb 指令只是 16 位长 此外, 在使用 16 位存储器的系统中, Thumb 版本比第二种 ARM 实现方法运行得更快, 因为每个 Thumb 指令只需要访问一次存储器, 而每个 ARM 指令需要两次存取 跳转预测和高速缓存 为了优化代码的执行速度, 需要有相关指令计时 跳转预测逻辑以及目标系统的缓存性能的详细知识 有关详细的信息, 请参阅 ARM 体系结构参考手册和各种处理器的技术参考手册 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

41 编写 ARM 和 Thumb 汇编语言 2.6 将常数装载到寄存器中 不执行从存储器的数据装载操作, 就不能用单个指令来将任一个 32 位立即数装载到寄存器中 这是因为 ARM 指令仅是 32 位长度 Thumb 指令也有类似的限制 可以用一次数据装载来将任何 32 位值装入寄存器中, 但是有更直接 更有效的方式来装载很多常用的常数 也可以在数据处理指令内, 直接将很多常用的常数包含为操作数, 而根本不需要单独的装载操作 以下各节介绍 : 如何使用 MOV 和 MVN 指令来装载一个直接值的范围, 请参阅第 2-28 页的用 MOV 和 MVN 直接装载 ; 如何使用 LDR 伪指令装载任何 32 位常数, 请参阅第 2-29 页的使用 LDR Rd, =const 装载 ; 如何装载浮点常数, 请参阅第 2-31 页的装载浮点常数 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-27

42 编写 ARM 和 Thumb 汇编语言 用 MOV 和 MVN 直接装载 在 ARM 状态下, 可以使用 MOV 和 MVN 指令来将一定范围内的 8 位常数直接装载到寄存器中 : 通过指定 0x0-0xFF (0-255) 的范围, MOV 可装载任何八位常数值 ; 它也可以将这些值循环移位任一偶数位 表 2-4 说明了这种操作所提供的值范围 ; MVN 可装载这些值的按位补码 数字值是 -(n+1), 其中 n 是表 2-4 中给出的值 您不必计算必要的循环 汇编程序会执行这些计算 您不需决定是使用 MOV 还是 MVN 汇编程序会使用适当的指令 如果值是一个汇编时变量, 则这是很有用的 如果您编写的指令中含有一个无法构造的常数, 汇编程序将报告错误 : Immediate n out of range for this operation. 在数据处理操作中, 表 2-4 中所示的值的范围也可被用作一个操作数 不能使用它们的按位补码作为操作数, 并且在乘法运算中不能使用它们作为操作数 表 2-4 ARM 状态的立即数 循环二进制十进制步长十六进制 无循环 xxxxxxxx xFF 向右, 30 位 xxxxxxxx x3FC 向右, 28 位 xxxxxxxx xFF0 向右, 26 位 xxxxxxxx x3FC 向右, 8 位 xxxxxxxx x xFF 向右, 6 位 xxxxxx xx 向右, 4 位 xxxx xxxx 向右, 2 位 xx xxxxxx ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

43 编写 ARM 和 Thumb 汇编语言 在 Thumb 状态下用 MOV 直接装载 在 Thumb 状态下, 可以使用 MOV 指令来直接装载 范围内的常数 不能产生此范围外的常数, 因为 : Thumb MOV 指令不提供对滚筒式移位器的内联访问 不能像在 ARM 状态中一样将常数向右循环移位 ; Thumb MVN 指令只能操作寄存器而不能操作常数值 不能像在 ARM 状态中一样直接装载按位补码 如果试图使用带有 范围外的值的 MOV 指令, 汇编程序会报告错误 : Immediate n out of range for this operation 使用 LDR Rd, =const 装载 LDR Rd,=const 伪指令可以在单个指令中构造任何 32 位数字常数 使用此伪指令可产生超出 MOV 和 MVN 指令范围的常数 LDR 伪指令为特定的常数产生最高效的代码 : 如果可以用 MOV 或 MVN 指令来构造该常数, 则汇编程序会生成适当的指令 如果不能用 MOV 或 MVN 指令来构造该常数, 那么汇编程序将会 : 把该值放入一个文字池 ( 嵌入在代码中的一部分存储器, 用于存放常数值 ) 产生使用相对程序地址的一条 LDR 指令, 用于从文字池读取该常数 例如 : LDR rn, [pc, #offset to literal pool] ; load register n with one word ; from the address [pc + offset] 必须保证在由汇编程序产生的 LDR 指令的范围内, 有一个文字池存在 有关详细信息请参阅第 2-30 页的放置文字池 有关 LDR 伪指令的语法的详细描述, 请参阅第 页的 LDR ARM 伪指令 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-29

44 编写 ARM 和 Thumb 汇编语言 放置文字池 汇编程序将文字池放在每个段的末尾 它们是由后面的段开始处的 AREA 命令定义的, 或者由汇编代码末尾的 END 命令加以定义 一个包含文件末尾的 END 命令并不表示一个段的结束 在大型段中, 默认的文字池可能会超出一个或多个 LDR 指令的范围 从程序计数器到该常数的偏移量必须是 : 在 ARM 状态中小于 4KB, 但可以沿每个方向 ; 在 Thumb 状态中小于 1KB 并且向前 当 LDR Rd,=const 伪指令要求将常数放入文字池中时, 汇编程序将 : 检查前面的任何文字池是否可用 如果是, 则用前面的文字池来寻址这个常数 如果前面的文字池已经不可用, 则尝试将该常数放入下一个文字池中 如果下一个文字池超出范围, 汇编程序将产生一条出错信息 在这种情况下, 必须使用 LTORG 命令来在代码中放置一个附加的文字池 将 LTORG 命令放在失败 LDR 伪指令后, 并且在 4KB (ARM) 或 1KB (Thumb) 范围内 详细描述请参阅第 7-14 页的 LTORG 必须把文字池放在处理器不会试图将其当作指令来执行的位置上 将其放在无条件跳转指令后, 或放在一个子程序末尾的返回指令之后 示例 2-5 给出了一个工作实例 该实例的代码在 RVCT 的 examples\asm 子目录下的 loadcon.s 文件中 作为注释列出的指令是由汇编程序生成的 ARM 指令 有关如何汇编 链接和执行该示例的操作说明, 请参阅第 2-2 页的代码示例 示例 2-5 AREA Loadcon, CODE, READONLY ENTRY ; Mark first instruction to execute start BL func1 ; Branch to first subroutine BL func2 ; Branch to second subroutine stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI func1 LDR r0, =42 ; => MOV R0, #42 LDR r1, =0x ; => LDR R1, [PC, #offset to ; Literal Pool 1] LDR r2, =0xFFFFFFFF ; => MVN R2, #0 MOV pc, lr LTORG ; Literal Pool 1 contains ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

45 编写 ARM 和 Thumb 汇编语言 ; literal Ox func2 LDR r3, =0x ; => LDR R3, [PC, #offset to ; Literal Pool 1] ; LDR r4, =0x ; If this is uncommented it ; fails, because Literal Pool 2 ; is out of reach MOV pc, lr LargeTable SPACE 4200 ; Starting at the current location, ; clears a 4200 byte area of memory ; to zero END ; Literal Pool 2 is empty 装载浮点常数 利用 FLD 伪指令, 可以在单个指令中装载任何单精度或双精度浮点常数 详细信息请参阅第 6-36 页的 FLD 伪指令 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-31

46 编写 ARM 和 Thumb 汇编语言 2.7 将地址装载到寄存器中 经常需要将一个地址装载到一个寄存器中 可能需要装载变量 字符串常数或跳转表开始位置的地址 地址通常表示为从当前程序计数器或其它寄存器开始的偏移量 这一节介绍将地址装载到寄存器中的下列方法 : 直接装载寄存器, 请参阅用 ADR 和 ADRL 直接装载 ; 从一个文字池装载地址, 请参阅第 2-37 页的用 LDR Rd, = label 装载地址 用 ADR 和 ADRL 直接装载 ADR 和 ADRL 伪指令可以生成某个确定范围内的地址, 而无需执行数据装载操作 ADR 和 ADRL 接受以下两种值之一 : 一个相对于程序的表达式, 这是带有可选偏移量的一个标号, 其中标号地址是相对于当前程序计数器的 ; 一个相对于寄存器的表达式, 这是带有可选偏移量的一个标号, 其中标号地址是相对于存放在指定的通用寄存器中的地址的 有关指定相对寄存器表达式的信息, 请参阅第 2-53 页的用 MAP 和 FIELD 命令描述数据结构 通过生成以下指令或消息, 汇编程序转换一条 ADR rn,label 伪指令 : 如果地址在范围内, 则生成装载该地址的单个 ADD 或 SUB 指令 ; 如果不能在单个指令中访问到该地址, 则生成一条出错消息 对于相对非字对齐地址的偏移, 偏移量范围是 ±255 字节 ; 对于相对字对齐地址的偏移, 偏移量范围是 ±1020 字节 (255 字 ) ( 对于 Thumb 状态, 地址必须是字对齐的, 并且偏移量必须是正值 ) 通过生成以下指令或消息, 汇编程序转换一条 ADRL rn,label 伪指令 : 如果地址在范围内, 则生成两个装载地址的数据处理指令 ; 如果不能在两个指令中构造该地址, 则生成一条出错消息 对于非字对齐地址, ADRL 伪指令的范围是 ±64KB ; 对于字对齐地址, 其范围是 ±256KB ( 没有用于 Thumb 状态的 ADRL 伪指令 ) 如果成功的话, ADRL 汇编为两条指令 即使可以在单条指令中装载该地址, 汇编程序也产生两条指令 有关装载超出 ADRL 伪指令范围的地址的信息, 请参阅第 2-37 页的用 LDR Rd, = label 装载地址 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

47 编写 ARM 和 Thumb 汇编语言 备注用于 ADR 或 ADRL 的标号必须位于相同的代码段内 对于在相同段中对超出范围的标号的引用, 汇编程序将做出错处理 对于在其它代码段中对超出范围的标号的引用, 链接程序将做出错处理 在 Thumb 状态下, ADR 只能产生字对齐的地址 ADRL 不能用于 Thumb 代码 只能在 ARM 代码内使用它 示例 2-6 说明了在汇编 ADR 和 ADRL 伪指令时, 由汇编程序产生的代码类型 该实例的代码在 RVCT 的 examples\asm 子目录下的 adrlabel.s 文件中 有关如何汇编 链接和执行该实例的操作说明, 请参阅第 2-2 页的代码示例 注释中列出的指令是由汇编程序生成的 ARM 指令 示例 2-6 AREA adrlabel, CODE,READONLY ENTRY ; Mark first instruction to execute Start BL func ; Branch to subroutine stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI LTORG ; Create a literal pool func ADR r0, Start ; => SUB r0, PC, #offset to Start ADR r1, DataArea ; => ADD r1, PC, #offset to DataArea ; ADR r2, DataArea+4300 ; This would fail because the offset ; cannot be expressed by operand2 ; of an ADD ADRL r2, DataArea+4300 ; => ADD r2, PC, #offset1 ; ADD r2, r2, #offset2 MOV pc, lr ; Return DataArea SPACE 8000 ; Starting at the current location, ; clears a 8000 byte area of memory ; to zero END ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-33

48 编写 ARM 和 Thumb 汇编语言 用 ADR 实现跳转表 第 2-35 页的示例 2-7 给出了实现跳转表的 ARM 代码 该实例的代码在 RVCT 的 examples\asm 子目录的 jump.s 文件中 有关如何汇编 链接和执行该实例的操作说明, 请参阅第 2-2 页的代码示例 ADR 伪指令装载跳转表的地址 在此例中, 函数 arithfunc 获取三个自变量, 并将结果返回 r0 第一个自变量确定对第二和第三个自变量执行哪种操作 : 自变量 1 = 0 结果 = 自变量 2 + 自变量 3 自变量 1 = 1 结果 = 自变量 2 自变量 3 跳转表用下列指令和汇编程序命令来实现 : EQU DCD 是一个汇编程序命令 它用于为一个符号赋值 在此例中, 其将值 2 赋予 num 当在代码中其它位置使用 num 时, 将用值 2 替代它 以这种方式使用 EQU 时, 类似于在 C 语言中使用 #define 定义一个常数 声明一个或多个存储器字 在此例中, 每个 DCD 存储一个程序的地址, 该程序处理跳转表的一个特定子句 LDR LDR pc,[r3,r0,lsl#2] 指令将跳转表的所需子句的地址装载到 pc 中 该指令 : 将 r0 中的子句数值乘以 4 以给出一个字偏移 ; 将结果加到跳转表的地址上 ; 将组合地址的内容装载到程序计数器中 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

49 编写 ARM 和 Thumb 汇编语言 示例 2-7 ARM 代码跳转表 AREA Jump, CODE, READONLY ; Name this block of code CODE32 ; Following code is ARM code num EQU 2 ; Number of entries in jump table ENTRY ; Mark first instruction to execute start ; First instruction to call MOV r0, #0 ; Set up the three parameters MOV r1, #3 MOV r2, #2 BL arithfunc ; Call the function stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI arithfunc ; Label the function CMP r0, #num ; Treat function code as unsigned integer MOVHS pc, lr ; If code is >= num then simply return ADR r3, JumpTable ; Load address of jump table LDR pc, [r3,r0,lsl#2] ; Jump to the appropriate routine JumpTable DCD DoAdd DCD DoSub DoAdd ADD r0, r1, r2 ; Operation 0 MOV pc, lr ; Return DoSub SUB r0, r1, r2 ; Operation 1 MOV pc, lr ; Return END ; Mark the end of this file ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-35

50 编写 ARM 和 Thumb 汇编语言 转换为 Thumb 示例 2-8 说明了转换为 Thumb 代码的跳转表的实现 大多数 Thumb 代码版本与 ARM 代码相同 两者的差别在 Thumb 版本中做出了注释 在 Thumb 状态中, 不能 : 在 LDR 和 STR 指令中增加基址寄存器 ; 使用 LDR 指令将一个值装载到 pc 中 ; 对寄存器中存放的值执行内联移位 示例 2-8 Thumb 代码跳转表 AREA Jump, CODE, READONLY CODE16 ; Following code is Thumb code num EQU 2 ENTRY start MOV r0, #0 MOV r1, #3 MOV r2, #2 BL arithfunc stop MOV r0, #0x18 LDR r1, =0x20026 SWI 0xAB ; Thumb semihosting SWI arithfunc CMP r0, #num BHS exit ; MOV pc, lr cannot be conditional ADR r3, JumpTable LSL r0, r0, #2 ; 3 instructions needed to replace LDR r0, [r3,r0] ; LDR pc, [r3,r0,lsl#2] MOV pc, r0 ALIGN ; Ensure that the table is aligned on a ; 4-byte boundary JumpTable DCD DoAdd DCD DoSub DoAdd ADD r0, r1, r2 exit MOV pc, lr DoSub SUB r0, r1, r2 MOV pc, lr END ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

51 编写 ARM 和 Thumb 汇编语言 用 LDR Rd, = label 装载地址 LDR Rd,= 伪指令可以将任何 32 位常数装载到寄存器中 请参阅第 2-29 页的使用 LDR Rd, =const 装载 它也接受相对程序的表达式, 例如标号, 以及带偏移的标号 汇编程序通过完成下列操作来转换一条 LDR r0,=label 伪指令 : 把 label 的地址放入一个文字池 ( 嵌入在代码中的一部分存储器, 用于存放常数值 ) 产生相对程序的 LDR 指令, 来从文字池读取该地址, 例如 : LDR rn [pc, #offset to literal pool] ; load register n with one word ; from the address [pc + offset] 必须要确保范围内有一个文字池 有关详细信息请参阅第 2-30 页的放置文字池 与 ADR 和 ADRL 伪指令不同的是,LDR 可以使用当前段之外的标号 如果标号在当前段之外, 那么当汇编源文件时, 汇编程序在目标代码中放置一个重定位命令 重定位命令指示链接程序在链接时确定地址 无论链接程序将包含 LDR 和文字池的段放在何处, 该地址都保持有效 示例 2-9 说明了这一实现过程 该示例的代码在 RVCT 的 examples\asm 子目录的 ldrlabel.s 文件中 有关如何汇编 链接和执行该示例的操作说明, 请参阅第 2-2 页的代码示例 注释中列出的指令是由汇编程序生成的 ARM 指令 示例 2-9 AREA LDRlabel, CODE,READONLY ENTRY ; Mark first instruction to execute start BL func1 ; Branch to first subroutine BL func2 ; Branch to second subroutine stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI func1 LDR r0, =start ; => LDR R0,[PC, #offset into ; Literal Pool 1] LDR r1, =Darea + 12 ; => LDR R1,[PC, #offset into ; Literal Pool 1] ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-37

52 编写 ARM 和 Thumb 汇编语言 LDR r2, =Darea ; => LDR R2, [PC, #offset into ; Literal Pool 1] MOV pc,lr ; Return LTORG ; Literal Pool 1 func2 LDR r3, =Darea ; => LDR r3, [PC, #offset into ; Literal Pool 1] ; (sharing with previous literal) ; LDR r4, =Darea ; If uncommented produces an error ; as Literal Pool 2 is out of range MOV pc, lr ; Return Darea SPACE 8000 ; Starting at the current location, ; clears a 8000 byte area of memory ; to zero END ; Literal Pool 2 is out of range of ; the LDR instructions above ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

53 编写 ARM 和 Thumb 汇编语言 一个 LDR Rd, =label 示例 : 字符串复制 示例 2-10 说明用一个字符串覆盖另一个字符串的 ARM 代码例程 其使用 LDR 伪指令来从一个数据段中装载两个字符串的地址 以下内容需要特别注意 : DCB DCB 命令定义一个或多个存储器字节 除整数值外,DCB 也可接受引号内的字符串 字符串内的每个字符存放在连续的字节中 有关详细信息请参阅第 7-18 页的 DCB LDR/STR LDR 和 STR 指令使用后索引寻址来更新其地址寄存器 例如, 指令 : LDRB r2,[r1],#1 用 r1 所指地址的内容装载 r2, 然后将 r1 增加 1 示例 2-10 字符串复制 AREA StrCopy, CODE, READONLY ENTRY ; Mark first instruction to execute start LDR r1, =srcstr ; Pointer to first string LDR r0, =dststr ; Pointer to second string BL strcopy ; Call subroutine to do copy stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI strcopy LDRB r2, [r1],#1 ; Load byte and update address STRB r2, [r0],#1 ; Store byte and update address CMP r2, #0 ; Check for zero terminator BNE strcopy ; Keep going if not MOV pc,lr ; Return AREA srcstr DCB dststr DCB END Strings, DATA, READWRITE "First string - source",0 "Second string - destination",0 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-39

54 编写 ARM 和 Thumb 汇编语言 转换为 Thumb 对于 Thumb LDR 和 STR 指令, 不存在后索引寻址模式 因此, 在 LDR 和 STR 指令之后, 必须使用一个 ADD 指令来增加地址寄存器 例如 : LDRB r2, [r1] ; load register 2 ADD r1, #1 ; increment the address in ; register ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

55 编写 ARM 和 Thumb 汇编语言 2.8 装载和存储多个寄存器指令 ARM 和 Thumb 指令集包含的指令用来从存储器装载到多个寄存器和将寄存器内容存储到存储器 多个寄存器传送指令提供了一种高效的方法, 来将几个寄存器的内容移动到存储器, 以及从存储器将内容移动到寄存器 它们最常用于块复制以及用于在子程序入口点和退出点的栈操作 使用多个寄存器传送指令来代替一系列单个数据传送指令的优点包括 : 代码更小 一次指令存取开销, 而不是多次指令存取开销 在不带高速缓存的 ARM 处理器上, 由装载多个或存储多个指令传送的数据的第一个字总是非顺序的存储器周期, 但随后传送的所有字可以是顺序的存储器周期 在大多数系统中, 顺序存储器周期更快一些 备注最低编号的寄存器被传送到或传送自所访问的最低存储器地址, 最高编号的寄存器被传送到或传送自所访问的最高存储器地址 指令的寄存器列表中的寄存器顺序没有影响 使用 -checkreglist 汇编程序命令行选项, 来确保寄存器列表中的寄存器是按递增顺序提供的 有关详细信息请参阅第 3-2 页的命令语法 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-41

56 编写 ARM 和 Thumb 汇编语言 ARM LDM 和 STM 指令 装载多个 ( 或存储多个 ) 指令将 16 个通用寄存器的任意子集, 用单条指令从存储器中装载或存储到存储器中 语法 LDM 指令的语法是 : LDM{cond}address-mode Rn{!},reg-list{^} 其中 : cond address-mode Rn 是一个可选的条件码 有关详细信息请参阅第 2-22 页的条件执行 指定该指令的寻址模式 详细信息请参阅第 2-43 页的 LDM 和 STM 寻址模式 是装载操作的基址寄存器 该寄存器中存储的地址是装载操作的起始地址 不要指定 r15 (pc) 作为基址寄存器! 指定基址寄存器回写 如果指定了该项, 则在传送后更新基址寄存器中的地址 对于寄存器列表中的每个寄存器, 将减小或增加一个字 register-list ^ 是括在大括号内的 以逗号分隔的符号化寄存器名称和寄存器范围 列表中必须至少有一个寄存器 寄存器范围用一个短划线指定 例如 : {r0,r1,r4-r6,pc} 如果基址寄存器 Rn 位于 register-list 中, 则不能指定回写选项 在 [User] 模式或 [System] 模式下不能使用此选项 有关该指令在特权模式下的使用方法的信息, 请参阅 RealView 编译工具 2.0 版开发人员指南中的处理处理器异常一章以及第 4-20 页的 LDM 和 STM STM 指令的语法完全与 LDM 指令相对应, 只是 ^ 选项的影响细节有点差异 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

57 编写 ARM 和 Thumb 汇编语言 用法 请参阅第 2-44 页的用 LDM 和 STM 实现栈操作和第 2-46 页的用 LDM 和 STM 实现块复制 LDM 和 STM 寻址模式 有四种不同的寻址模式 对于操作中的每个寄存器, 可以将基址寄存器增加或减小一个字, 并且这种增加或减小可以发生在操作之前或之后 这些选项的后缀是 : IA 之后增加 IB DA DB 之前增加 之后减小 之前减小 对于栈操作, 还有一些更容易使用的替代寻址模式后缀 请参阅第 2-44 页的用 LDM 和 STM 实现栈操作 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-43

58 编写 ARM 和 Thumb 汇编语言 用 LDM 和 STM 实现栈操作 装载多个和存储多个指令可以更新基址寄存器 对于栈操作来说, 基址寄存器通常是栈指针 r13 这就意味着, 可以使用单个装载多个和存储多个指令, 为任意数量的寄存器实施推入和弹出操作 装载多个和存储多个指令可以使用几种类型的栈 : 降序或升序 满的或空的 栈向下增长, 从一个高地址开始并向更低地址 ( 降序栈 ); 或者向上增长, 从一个低地址开始并向更高地址前进 ( 升序栈 ) 栈指针可指向栈中的最后一个条目 ( 满栈 ), 或者指向栈中的下一个可用空间 ( 空栈 ) 为便于程序员操作, 可以使用面向栈的后缀, 来代替后缀之前或之后的增量或减量 请参阅表 2-5 中的面向栈的后缀列表 栈类型推进弹出 表 2-5 用于装载多个和存储多个指令的后缀 满降序 STMFD (STMDB) LDMFD (LDMIA) 满升序 STMFA (STMIB) LDMFA (LDMDA) 空降序 STMED (STMDA) LDMED (LDMIB) 空升序 STMEA (STMIA) LDMEA (LDMDB) 例如 : STMFD LDMFD r13!, {r0-r5} ; Push onto a Full Descending Stack r13!, {r0-r5} ; Pop from a Full Descending Stack. 备注 ARM-Thumb 程序调用标准 (ATPCS) 以及 ARM 和 Thumb C 与 C++ 编译程序总是使用满降序栈 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

59 编写 ARM 和 Thumb 汇编语言 用于嵌套子程序的栈寄存器 在子程序入口点和退出点处, 栈操作是非常有用的 在一个子程序的开始处, 可以把需要的任何工作寄存器保存在栈上, 在退出点处再将其弹出 此外, 如果在入口点处将链接寄存器推到栈上, 就可以安全地进行其它子程序调用, 而不会导致返回地址丢失 如果这样做, 就可以通过在退出点处将 pc 弹出栈, 来从一个子程序中返回, 而不必先弹出 lr 然后将该值移动到 pc 中 例如 : subroutine STMFD ; code BL ; code LDMFD sp!, {r5-r7,lr} ; Push work registers and lr somewhere_else sp!, {r5-r7,pc} ; Pop work registers and pc 备注在混合使用 ARM 和 Thumb 的系统中要谨慎使用这种方法 在 ARM 体系结构 v4t 系统中, 不能通过直接弹入到程序计数器中来改变状态 在 ARM 体系结构 v5t 及以上版本中, 可以用这种方式改变状态 有关混合使用 ARM 和 Thumb 指令的详细信息, 请参阅 RealView 编译工具 2.0 版开发人员指南中的 ARM 和 Thumb 的互相连合使用一章 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-45

60 编写 ARM 和 Thumb 汇编语言 用 LDM 和 STM 实现块复制 示例 2-11 是一个 ARM 代码程序, 其通过一次复制单个字, 来将一组字从源位置复制到目标位置上 该示例存放在 RVCT 的 examples\asm 子目录下的 word.s 文件中 有关如何汇编 链接和执行该示例的操作说明, 请参阅第 2-2 页的代码示例 示例 2-11 块复制 AREA Word, CODE, READONLY ; name this block of code num EQU 20 ; set number of words to be copied ENTRY ; mark the first instruction to call start LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to copy wordcopy LDR r3, [r0], #4 ; load a word from the source and STR r3, [r1], #4 ; store it to the destination SUBS r2, r2, #1 ; decrement the counter BNE wordcopy ;... copy more stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI AREA BlockData, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END 通过使用 LDM 和 STM 来尽可能多的复制, 可以使这个模块的效率更高 在已知 ARM 拥有的寄存器数目后, 一次传送 8 个字最合理 利用下列指令, 可以找出要复制的块所包含的 8 个字的倍数 ( 如果 r2 = 要复制的字数 ): MOVS r3, r2, LSR #3 ; number of eight word multiples 此值可用于控制通过循环的重复次数, 循环中的每次操作拷贝八个字 当只剩下不足八个字时, 可以用以下指令找出剩余的字数 ( 假定 r2 还未被破坏 ): ANDS r2, r2, #7 第 2-47 页的示例 2-12 列出了重新编写的使用 LDM 和 STM 进行复制的块复制模块 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

61 编写 ARM 和 Thumb 汇编语言 示例 2-12 AREA Block, CODE, READONLY ; name this block of code num EQU 20 ; set number of words to be copied ENTRY ; mark the first instruction to call start LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to copy MOV sp, #0x400 ; Set up stack pointer (r13) blockcopy MOVS r3,r2, LSR #3 ; Number of eight word multiples BEQ copywords ; Less than eight words to move? STMFD sp!, {r4-r11} ; Save some working registers octcopy LDMIA r0!, {r4-r11} ; Load 8 words from the source STMIA r1!, {r4-r11} ; and put them at the destination SUBS r3, r3, #1 ; Decrement the counter BNE octcopy ;... copy more LDMFD sp!, {r4-r11} ; Don't need these now - restore ; originals copywords ANDS r2, r2, #7 ; Number of odd words to copy BEQ stop ; No words left to copy? wordcopy LDR r3, [r0], #4 ; Load a word from the source and STR r3, [r1], #4 ; store it to the destination SUBS r2, r2, #1 ; Decrement the counter BNE wordcopy ;... copy more stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x ; ARM semihosting SWI AREA BlockData, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-47

62 编写 ARM 和 Thumb 汇编语言 Thumb LDM 和 STM 指令 Thumb 指令集包含下列多寄存器传送指令组 : 用于存储器块传送的 LDM 和 STM ; 用于栈操作的 PUSH 和 POP LDM 和 STM 这些指令可用于从存储器中装载到低位寄存器的任何子集或将其存储到存储器 在多寄存器传送指令结束后, 总是更新基址寄存器 必须指定! 字符 这些指令的唯一有效后缀是 IA 下面是这些指令的示例 : LDMIA STMIA r1!, {r0,r2-r7} r4!, {r0-r3} PUSH 和 POP 这些指令可用以将低位寄存器的任何子集和 ( 可选 ) 链接寄存器推入栈中, 以及将低位寄存器的任何子集和 pc( 可选 ) 从栈中弹出 栈的基址存放在 r13 中 下面是这些指令的示例 : PUSH POP PUSH POP {r0-r3} {r0-r3} {r4-r7,lr} {r4-r7,pc} 可选择向寄存器列表中添加 lr 或 pc, 提供了对子程序入口点和退出点的支持 栈总是满降序的 Thumb 状态的块复制示例 块复制示例第 2-46 页的示例 2-11 可转换为 Thumb 指令 ( 请参阅第 2-49 页的示例 2-13) 由于 Thumb LDM 和 STM 只能存取低位寄存器, 每次重复操作复制的字数被从八个减到四个 此外, LDM 和 STM 指令可用于一次执行单个字复制, 因为它们在每次访问后更新基址指针 如果将 LDR 和 STR 用于实现这种操作, 则需要单独的 ADD 指令来更新每个基址指针 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

63 编写 ARM 和 Thumb 汇编语言 示例 2-13 AREA Tblock, CODE, READONLY ; Name this block of code num EQU 20 ; Set number of words to be copied ENTRY ; Mark first instruction to execute header ; The first instruction to call MOV sp, #0x400 ; Set up stack pointer (r13) ADR r0, start + 1 ; Processor starts in ARM state, BX r0 ; so small ARM code header used ; to call Thumb main program CODE16 ; Subsequent instructions are Thumb start LDR r0, =src ; r0 =pointer to source block LDR r1, =dst ; r1 =pointer to destination block MOV r2, #num ; r2 =number of words to copy blockcopy LSR r3,r2, #2 ; Number of four word multiples BEQ copywords ; Less than four words to move? PUSH {r4-r7} ; Save some working registers quadcopy LDMIA r0!, {r4-r7} ; Load 4 words from the source STMIA r1!, {r4-r7} ; and put them at the destination SUB r3, #1 ; Decrement the counter BNE quadcopy ;... copy more POP {r4-r7} ; Don't need these now-restore originals copywords MOV r3, #3 ; Bottom two bits represent number AND r2, r3 ;...of odd words left to copy BEQ stop ; No words left to copy? wordcopy LDMIA r0!, {r3} ; load a word from the source and STMIA r1!, {r3} ; store it to the destination SUB r2, #1 ; Decrement the counter BNE wordcopy ;... copy more stop MOV r0, #0x18 ; angel_swireason_reportexception LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0xAB ; Thumb semihosting SWI AREA BlockData, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-49

64 编写 ARM 和 Thumb 汇编语言 2.9 使用宏 宏定义是位于 MACRO 和 MEND 命令之间的一块代码 它定义了一个名称, 可用于代替重复的整块代码 宏的主要用途是 : 通过用单个有意义的名称代替一块代码, 使得更容易理解源代码的逻辑性 ; 为了避免多次重复一块代码 详细信息请参阅第 7-27 页的 MACRO 和 MEND 测试和跳转的宏示例 一个测试和跳转操作需要两个 ARM 指令来实现 您可以定义类似下面这样的宏定义 : MACRO $label TestAndBranch $dest, $reg, $cc $label CMP $reg, #0 B$cc $dest MEND MACRO 命令后的行是宏原型语句 宏原型语句定义了用于调用宏的名称 (TestAndBranch) 它也定义了参数 ($label $dest $reg 和 $cc) 在调用宏时必须为这些参数提供值 汇编程序用所提供的值替换到代码中 可以按以下方式调用这个宏 : test TestAndBranch NonZero, r0, NE NonZero 在替换后将变成 : test CMP r0, #0 BNE NonZero NonZero ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

65 编写 ARM 和 Thumb 汇编语言 无符号整数除法的宏示例 示例 2-14 给出了一个执行无符号整数除法的宏 它带有四个参数 : $Bot 存放除数的寄存器 $Top 存放指令执行前被除数的寄存器 执行指令之后, 它存放余数 $Div 存放除法的商的寄存器 如果只需求余数, 它可以是 NULL ("") $Temp 计算时使用的临时寄存器 示例 2-14 MACRO $Lab DivMod $Div,$Top,$Bot,$Temp ASSERT $Top <> $Bot ; Produce an error message if the ASSERT $Top <> $Temp ; registers supplied are ASSERT $Bot <> $Temp ; not all different IF "$Div" <> "" ASSERT $Div <> $Top ; These three only matter if $Div ASSERT $Div <> $Bot ; is not null ("") ASSERT $Div <> $Temp ; ENDIF $Lab MOV $Temp, $Bot ; Put divisor in $Temp CMP $Temp, $Top, LSR #1 ; double it until 90 MOVLS $Temp, $Temp, LSL #1 ; 2 * $Temp > $Top CMP $Temp, $Top, LSR #1 BLS %b90 ; The b means search backwards IF "$Div" <> "" ; Omit next instruction if $Div is null MOV $Div, #0 ; Initialize quotient ENDIF 91 CMP $Top, $Temp ; Can we subtract $Temp? SUBCS $Top, $Top,$Temp ; If we can, do so IF "$Div" <> "" ; Omit next instruction if $Div is null ADC $Div, $Div, $Div ; Double $Div ENDIF MOV $Temp, $Temp, LSR #1 ; Halve $Temp, CMP $Temp, $Bot ; and loop until BHS %b91 ; less than divisor MEND ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-51

66 编写 ARM 和 Thumb 汇编语言 这个宏确认任何两个参数不使用相同的寄存器 如果只需要计算余数, 它也优化所产生的代码 如果在汇编程序源代码中多次使用了 DivMod, 为了避免标号的多次定义, 宏将使用局部标号 (90, 91) 有关详细信息请参阅第 2-14 页的局部标号 示例 2-15 说明了按如下方式调用宏时它所生成的代码 : ratio DivMod r0,r5,r4,r2 示例 2-15 ASSERT r5 <> r4 ; Produce an error if the ASSERT r5 <> r2 ; registers supplied are ASSERT r4 <> r2 ; not all different ASSERT r0 <> r5 ; These three only matter if $Div ASSERT r0 <> r4 ; is not null ("") ASSERT r0 <> r2 ; ratio MOV r2, r4 ; Put divisor in $Temp CMP r2, r5, LSR #1 ; double it until 90 MOVLS r2, r2, LSL #1 ; 2 * r2 > r5 CMP r2, r5, LSR #1 BLS %b90 ; The b means search backwards MOV r0, #0 ; Initialize quotient 91 CMP r5, r2 ; Can we subtract r2? SUBCS r5, r5, r2 ; If we can, do so ADC r0, r0, r0 ; Double r0 MOV r2, r2, LSR #1 ; Halve r2, CMP r2, r4 ; and loop until BHS %b91 ; less than divisor ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

67 编写 ARM 和 Thumb 汇编语言 2.10 用 MAP 和 FIELD 命令描述数据结构 可以使用 MAP 和 FIELD 命令来描述数据结构 这些命令总是一起使用的 使用 MAP 和 FIELD 定义的数据结构 : 容易维护 ; 可用于描述相同结构的多个实例 ; 使得易于高效地存取数据 MAP 命令指定数据结构的基址 有关详细信息请参阅第 7-15 页的 MAP FIELD 命令指定一个数据项所需的存储器数量, 并可为该数据项提供一个标号 对结构中的每个数据项重复该命令 有关详细信息请参阅第 7-16 页的 FIELD 备注当定义一个映射时, 不分配存储器空间 使用定义常数的命令 ( 如 DCD) 来分配存储器空间 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-53

68 编写 ARM 和 Thumb 汇编语言 相对映射 要存取当前指令 4KB 范围外的数据, 可以使用相对寄存器的指令, 例如 : LDR r4,[r9,#offset] offset 被限制为 4096, 因此 r9 必须已包含位于数据地址的 4KB 范围内的一个值 示例 2-16 MAP 0 consta FIELD 4 ; consta uses four bytes, located at offset 0 constb FIELD 4 ; constb uses four bytes, located at offset 4 x FIELD 8 ; x uses eight bytes, located at offset 8 y FIELD 8 ; y uses eight bytes, located at offset 16 string FIELD 256 ; string is up to 256 bytes long, starting at offset 24 利用示例 2-16 中的映射, 可以使用下列指令来访问数据结构 : MOV LDR r9,#4096 r4,[r9,#constb] 标号是相对于数据结构的开始位置的 用于存放映射的起始地址的寄存器 ( 此例中为 r9) 称为基址寄存器 可能有很多 LDR 或 STR 指令访问此数据结构中的数据 此映射不包含数据结构的位置 数据结构的位置是由运行时装载到基址寄存器的值确定的 同一映射可以用于描述数据结构的多个实例 它们可以位于存储器中的任何位置 对可用 MOV 指令装载到寄存器中的地址有一些限制 有关如何装载任意地址的详细信息, 请参阅第 2-32 页的将地址装载到寄存器中 备注 r9 是 ARM-Thumb 程序调用标准 中的静态基址寄存器 (sb) 有关详细信息, 请参阅 RealView 编译工具 2.0 版开发人员指南中的使用程序调用标准一章 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

69 编写 ARM 和 Thumb 汇编语言 基于寄存器的映射 在很多情况下, 每次访问一个数据结构时可以使用相同的寄存器作为基址寄存器 可以在映射的基址中包含该寄存器的名称 示例 2-17 说明了这样一个基于寄存器的映射 映射中定义的标号包含有该寄存器 示例 2-17 MAP 0,r9 consta FIELD 4 ; consta uses four bytes, located at offset 0 (from r9) constb FIELD 4 ; constb uses four bytes, located at offset 4 x FIELD 8 ; x uses eight bytes, located at offset 8 y FIELD 8 ; y uses eight bytes, located at offset 16 string FIELD 256 ; string is up to 256 bytes long, starting at offset 24 利用示例 2-17 中的映射, 可以访问数据结构而不管它在什么位置 : ADR r9,datastart LDR r4,constb ; => LDR r4,[r9,#4] constb 包含从数据结构开始位置算起的数据项的偏移量, 也包含基址寄存器 在此例中, 基址寄存器是在 MAP 命令中定义的 r9 ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-55

70 编写 ARM 和 Thumb 汇编语言 相对于程序的映射 可以使用程序计数器 (r15) 作为一个映射的基址寄存器 在此例中, 每个 STM 或 LDM 指令必须在其寻址的数据项的 4KB 范围内, 因为偏移量被限制为 4KB 数据结构与指令必须位于相同的段内, 因为否则不能保证在链接后数据项将在范围内 示例 2-18 说明了含有这种映射的程序片段 其中包含一个为数据结构分配存储器空间的命令, 也包含存取它的一条指令 示例 2-18 datastruc SPACE 280 ; reserves 280 bytes of memory for datastruc MAP datastruc consta FIELD 4 constb FIELD 4 x FIELD 8 y FIELD 8 string FIELD 256 code LDR r2,constb ; => LDR r2,[pc,offset] 在此例中, 不需要在装载数据之前装载基址寄存器, 因为程序计数器已经存放了正确的地址 ( 因为处理器里面的流水线, 这与 LDR 指令的实际地址并不相同 但是, 汇编程序会处理这个问题 ) ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

71 编写 ARM 和 Thumb 汇编语言 查找已分配的数据的结束位置 可以使用带有 0 操作数的 FIELD 命令, 来标记结构内的一个位置 标记位置后, 位置计数器并未增加 示例 2-19 中定义的数据结构的大小依赖于 MaxStrLen 和 ArrayLen 的值 如果这些值太大, 该结构会超过可用存储器的结束位置 示例 2-19 使用 : 一个 EQU 命令定义可用内存的结束位置 ; 一个带有 0 操作数的 FIELD 命令, 来标记数据结构的结束位置 一个 ASSERT 命令确认数据结构的结束位置并未超出可用内存 示例 2-19 StartOfData EQU 0x1000 EndOfData EQU 0x2000 MAP StartOfData Integer FIELD 4 Integer2 FIELD 4 String FIELD MaxStrLen Array FIELD ArrayLen*8 BitMask FIELD 4 EndOfUsedData FIELD 0 ASSERT EndOfUsedData <= EndOfData ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-57

72 编写 ARM 和 Thumb 汇编语言 强制正确对齐 像示例 2-20 中一样, 如果在数据结构中包含一些字符变量, 就可能会有问题 这是因为很多字是未对齐的 示例 2-20 StartOfData EQU 0x1000 EndOfData EQU 0x2000 MAP StartOfData Char FIELD 1 Char2 FIELD 1 Char3 FIELD 1 Integer FIELD 4 ; alignment= 3 Integer2 FIELD 4 String FIELD MaxStrLen Array FIELD ArrayLen*8 BitMask FIELD 4 EndOfUsedData FIELD 0 ASSERT EndOfUsedData <= EndOfData 不能使用 ALIGN 命令来实现, 因为 ALIGN 命令只对齐存储器内的当前位置 MAP 和 FIELD 命令不为其定义的结构分配任何存储器 可以在 Char3 FIELD 1 后插入一个虚拟的 FIELD 1 但是, 如果改变了字符变量的数目, 这会造成维护困难 每次必须重新计算正确的填充数 第 2-59 页的示例 2-21 说明了一个更好的调整填充的方法 该示例使用一个带有 0 操作数的 FIELD 命令, 来标记字符数据的结束位置 第二个 FIELD 命令根据标号的值来插入正确的填充数 使用 :AND: 运算符用来计算正确的值 (-EndOfChars):AND:3 表达式计算正确的填充数 : 如果 EndOfChars 是 0 mod 4, 则填充数是 0 ; 如果 EndOfChars 是 1 mod 4, 则填充数是 3 ; 如果 EndOfChars 是 2 mod 4, 则填充数是 2 ; 如果 EndOfChars 是 3 mod 4, 则填充数是 1 无论何时添加或删除字符变量, 它会自动调整填充数 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

73 编写 ARM 和 Thumb 汇编语言 示例 2-21 StartOfData EQU 0x1000 EndOfData EQU 0x2000 MAP StartOfData Char FIELD 1 Char2 FIELD 1 Char3 FIELD 1 EndOfChars FIELD 0 Padding FIELD (-EndOfChars):AND:3 Integer FIELD 4 Integer2 FIELD 4 String FIELD MaxStrLen Array FIELD ArrayLen*8 BitMask FIELD 4 EndOfUsedData FIELD 0 ASSERT EndOfUsedData <= EndOfData ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-59

74 编写 ARM 和 Thumb 汇编语言 使用基于寄存器的 MAP 和 FIELD 命令 基于寄存器的 MAP 和 FIELD 命令定义基于寄存器的符号 基于寄存器的符号的主要用途是 : 定义与 C 语言结构类似的结构 ; 更快地访问不是由基于寄存器的 MAP 和 FIELD 命令描述的存储器段 定义基于寄存器的符号 基于寄存器的符号可以非常有用, 但使用时必须小心 作为通则, 请仅按下列方式使用它们 : 作为一个装载或存储指令的装载或存储地址 如果 Location 是基于寄存器的符号 ( 基于寄存器 Rb 并带有数字偏移量 ), 汇编程序会自动进行切换, 例如将 LDR Rn,Location 转换为 LDR Rn,[Rb,#offset] 在 ADR 或 ADRL 指令中,ADR Rn,Location 将由汇编程序转换为 ADD Rn,Rb,#offset 将一个常规的数字表达式加到一个基于寄存器的符号上, 以获得另一个基于寄存器的符号 从一个基于寄存器的符号减去一个常规的数字表达式, 以获得另一个基于寄存器的符号 从一个基于寄存器的符号减去另一个基于寄存器的符号, 以获得一个常规的数字表达式 除非两个基于寄存器的符号是基于同一个寄存器的, 否则不能执行这种操作 不然的话, 将得到两个寄存器和一个数字值的组合 这样会导致一个汇编程序错误 作为 :BASE: 或 :INDEX: 运算符的操作数 这些运算符主要用于宏中 其它用法通常会导致汇编程序产生出错消息 例如, 如果编写了 LDR Rn,=Location 指令, 其中 Location 是基于寄存器的, 则意味着让汇编程序从一个存储器位置装载 Rn, 该位置总是含有寄存器 Rb 的当前值加上其中的偏移量 汇编程序不能执行这条指令, 因为不存在这样的存储器位置 类似地, 如果编写了 ADD Rd,Rn,#expression 指令, 其中 expression 是基于寄存器的, 则该指令请求执行一条 ADD 指令, 将 expression 的两个基址寄存器及其对 Rn 的偏移量相加 再一次, 汇编程序不能执行这一指令 您必须使用两个 ADD 指令来执行这两个加法 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

75 编写 ARM 和 Thumb 汇编语言 建立 C 语言类型的结构 使用 C 语言中的结构时需要 : 1. 声明该结构包含的字段 2. 在存储器中生成结构再使用它 例如, 下面的 typedef 语句定义了一个点结构, 其中包含三个名为 x y 和 z 的 float 字段, 但它不分配任何存储器 第二条语句在存储器中分配名为 origin oldloc 和 newloc 的三个 Point 类型的结构 : typedef struct Point { float x,y,z; } Point; Point origin,oldloc,newloc; 下列汇编语言代码等价于上面的 typedef 语句 : PointBase RN r11 MAP 0,PointBase Point_x FIELD 4 Point_y FIELD 4 Point_z FIELD 4 下列汇编语言代码分配存储器空间 : 其等价于 C 语言代码的最后一行 : origin SPACE 12 oldloc SPACE 12 newloc SPACE 12 在使用映射中定义的标号之前, 必须将数据结构的基址装载到基址寄存器中 例如 : LDR MOV STR MOV STR MOV STR PointBase,=origin r0,#0 r0,point_x r0,#2 r0,point_y r0,#3 r0,point_z 等价于下列 C 语言代码 : origin.x = 0; origin.y = 2; origin.z = 3; ARM DUI 0204BSC ARM Limited 版权所有 保留所有权利 2-61

76 编写 ARM 和 Thumb 汇编语言 获得尽可能快的访问速度 如要更快速地访问存储器段 : 1. 将存储器段描述为一个结构 2. 使用一个寄存器来寻址该结构 例如, 考虑示例 2-22 中的定义 示例 2-22 StartOfData EQU 0x1000 EndOfData EQU 0x2000 MAP StartOfData Integer FIELD 4 String FIELD MaxStrLen Array FIELD ArrayLen*8 BitMask FIELD 4 EndOfUsedData FIELD 0 ASSERT EndOfUsedData <= EndOfData 如果需要等价的 C 代码 : Integer = 1; String = ""; BitMask = 0xA000000A; 利用示例 2-22 中的定义, 可以编写如示例 2-23 中所示的汇编语言代码 示例 2-23 MOV LDR STR MOV LDR STRB MOV LDR STRB r0,#1 r1,=integer r0,[r1] r0,#0 r1,=string r0,[r1] r0,#0xa000000a r1,=bitmask r0,[r1] 示例 2-23 使用了 LDR 伪指令 有关这些代码的说明, 请参阅第 2-29 页的使用 LDR Rd, =const 装载 ARM Limited 版权所有 保留所有权利 ARM DUI 0204BSC

Microsoft PowerPoint sun-arm isa2.ppt [Compatibility Mode]

Microsoft PowerPoint sun-arm isa2.ppt [Compatibility Mode] 嵌入式系统设计与应用 第二章 ARM 指令系统 (2) 西安交通大学电信学院 孙宏滨 汇编伪指令 汇编伪指令 : 在 ARM 汇编语言里, 有一些特殊指令助记符, 没有相对应的操作码 ( 或直接对应指令 ) 通常称这些特殊指令助记符为伪指令, 它们所完成的操作叫做伪操作 伪指令在源程序中的作用是为完成汇编程序作各种准备工作 这些伪指令仅在汇编过程中起作用, 一旦汇编结束, 伪指令的使命完成 ADR:

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

Computer Architecture

Computer Architecture ECE 3120 Computer Systems Assembly Programming Manjeera Jeedigunta http://blogs.cae.tntech.edu/msjeedigun21 Email: msjeedigun21@tntech.edu Tel: 931-372-6181, Prescott Hall 120 Prev: Basic computer concepts

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

uc/os 1

uc/os 1 uc/os 1 uc/os-ii Source Code ANSI C, uc/os-ii 8/16/32 bits microprocessor Preemptive real-time Task 64 Stack Size ROMable (C compiler, assembler and linker/locator) uc/os-ii Mailboxes, Queues, Semaphores,

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378> 第一章第二章 Q2 1: 高序 : 最低位字节存储在字的最低位 ; 低序 : 最低位字节存储在字的最高位 ; Q2 2: 冯. 诺依曼结构 : 数据和指令都存储在同一存储器中 ; 哈佛结构 : 数据和程序存储在各自独立的存储器中 Q2 3: a) ARM 有 16 个通用寄存器,r0 r15, 其中 r15 还被用作程序计数器 b) CPSR 是程序状态寄存器, 包含了条件码标识 中断禁止位 当前处理器模式和其他状态

More information

ARM中C和汇编混合编程及示例.doc

ARM中C和汇编混合编程及示例.doc ARM 中 C 和汇编混合编程及示例 在嵌入式系统开发中, 目前使用的主要编程语言是 C 和汇编,C++ 已经有相应的编译器, 但是现在使用还是比较少的 在稍大规模的嵌入式软件中, 例如含有 OS, 大部分的代码都是用 C 编写的, 主要是因为 C 语言的结构比较好, 便于人的理解, 而且有大量的支持库 尽管如此, 很多地方还是要用到汇编语言, 例如开机时硬件系统的初始化, 包括 CPU 状态的设定,

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

-i-

-i- -i- -ii- -iii- -iv- -v- -vi- -vii- -viii- -ix- -x- -xi- -xii- 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9 1-10 1-11 1-12 1-13 1-14 1-15 1-16 1-17 1-18 1-19 1-20 1-21 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 2-11

More information

Microsoft Word - 强迫性活动一览表.docx

Microsoft Word - 强迫性活动一览表.docx 1 1 - / 2 - / 3 - / 4 - / 5 - I. 1. / 2. / 3. 4. 5. 6. 7. 8. 9 10 11. 12. 2 13. 14. 15. 16. 17. 18. 19. 20 21. 22 23. 24. / / 25. 26. 27. 28. 29. 30. 31. II. 1. 2 3. 4 3 5. 6 7 8. 9 10 11 12 13 14. 15.

More information

Microsoft PowerPoint ren-advanced topics [兼容模式]

Microsoft PowerPoint ren-advanced topics [兼容模式] 嵌入式系统设计与应用 第五章 ARM 与 Thumb 指令集 西安交通大学电信学院 任鹏举 1 深入 ARM 指令集 在以字节为单位寻址的存储器中, 有两种方式来存储字, 这根据最低有效字节与相邻较高有效字节相比是存在较低的还是较高的地址来划分 On holy wars and a plea for peace 小端 大端 条件执行 ARM 指令集不同寻常的特征是, 条件执行不仅应用于转移指令, 也可以应用于所有的

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

全唐诗28

全唐诗28 ... 1... 1... 1... 2... 2... 2... 3... 3... 4... 4... 4... 5... 5... 5... 5... 6... 6... 6... 6... 7... 7... 7... 7... 8... 8 I II... 8... 9... 9... 9...10...10...10...11...11...11...11...12...12...12...13...13...13...14...14...14...15...15...15...16...16...16...17...17

More information

「香港中學文言文課程的設計與教學」單元設計範本

「香港中學文言文課程的設計與教學」單元設計範本 1. 2. 3. (1) (6) ( 21-52 ) (7) (12) (13) (16) (17) (20) (21) (24) (25) (31) (32) (58) 1 2 2007-2018 7 () 3 (1070) (1019-1086) 4 () () () () 5 () () 6 21 1. 2. 3. 1. 2. 3. 4. 5. 6. 7. 8. 9. ( ) 7 1. 2.

More information

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11 .. 软件综合实验之操作系统 进入保护模式 陈香兰 中国科学技术大学计算机学院 July 1, 2016 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 1 / 11 提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 2 / 11 实验准备 实验环境准备

More information

眼病防治

眼病防治 ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...2...3...5...5...6...7...9... 11...13...14...15...17...18...19...20...21 I II...21...22...23...24...25...27...27...28...29...30...31...33...33...34...36...38...39...40...41...42...43...45

More information

中国南北特色风味名菜 _八)

中国南北特色风味名菜 _八) ( 20 010010) 7871092 1/32 356.25 4 760 2004 8 1 2004 8 1 11 000 ISBN 7-204-05943-3/Z102 1026.00 ( 18.00 ) ...1...2...2...4...6...7...8...9... 10... 11... 12... 13... 13... 14... 15... 17... 18... 19...

More information

穨學前教育課程指引.PDF

穨學前教育課程指引.PDF i 1 1.1 1 1.2 1 4 2.1 4 2.2 5 2.3 7 2.4 9 2.5 11 2.6 1 2 1 5 3.1 1 5 3.2 1 5 19 4.1 19 4.2 19 4.3 2 1 4.4 29 4.5 38 4.6 4 3 4.7 47 50 5.1 5 0 5.2 5 0 5.3 6 2 5.4 9 4 5.5 1 2 6 ( ) 1 2 7 ( ) 1 31 ( ) 1

More information

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63> 1 实验目的 实验 2 C 和汇编语言的混合编程实验 学习在 C 程序中使用嵌入式汇编编写程序 了解嵌入式汇编的格式 语言特点 2 实验设备 S3C2410 开发板 ADS1.2 集成开发环境,JTAG 调试器 串口连接线 3 实验原理 在 ARM 的应用开发中,C 语言功能强大且容易编写程序, 但是汇编程序在底层的操作仍然具有 C 程序无法替代的功能, 有时候我们需要在 C 程序中嵌入汇编程序来完成一些直接对底层的诸如寄存器的操作

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

Microsoft Word - Entry-Level Occupational Competencies for TCM in Canada200910_ch _2_.doc

Microsoft Word - Entry-Level Occupational Competencies for TCM in Canada200910_ch _2_.doc 草 稿 致 省 級 管 理 單 位 之 推 薦 書 二 零 零 九 年 十 月 十 七 日 加 拿 大 中 醫 管 理 局 聯 盟 All rights reserved 序 言 加 拿 大 中 醫 管 理 局 聯 盟, 於 二 零 零 八 年 一 月 至 二 零 零 九 年 十 月 間, 擬 定 傳 統 中 醫 執 業 之 基 礎 文 件 由 臨 床 經 驗 豐 富 之 中 醫 師 教 育 者 及

More information

微机原理(计算机原理与接口技术)

微机原理(计算机原理与接口技术) 微机原理 ( 计算机原理 ) 第 10 讲 MIPS 体系结构与编程 1 第 10 讲 MIPS 体系结构与编程 MIPS 体系结构概述 MIPS 指令集简介 MIPS 汇编语言程序设计 2 MIPS 体系结构概述 MIPS 诞生于 1980 年代, 是最早的 RISC 处理器之一, 也是目前销量最好的 RISC 处理器之一, 从游戏机到路由器, 再到 SGI 的超级计算机, 都可以看到 MIPS

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

Microsoft Word - Final Chi-Report _PlanD-KlnEast_V7_ES_.doc

Microsoft Word - Final Chi-Report _PlanD-KlnEast_V7_ES_.doc 九 龍 東 商 業 的 統 計 調 查 - 行 政 摘 要 - 2011 年 5 月 統 計 圖 行 政 摘 要...1 圖 I: 在 不 同 地 區 及 樓 宇 類 別 的 數 目 及 比 例...9 圖 II: 影 響 選 擇 地 點 的 因 素 的 重 要 程 度 對 比 就 現 時 所 在 地 點 各 項 因 素 的 滿 意 程 度...20 圖 III: 影 響 選 擇 樓 宇 的 因 素

More information

II II

II II I I II II III 1. 2. 3. III 4. IV 5. 6. 8. 9. 10. 12. IV V V VI VI VII VII VIII VIII IX IX X X XI XI XII XII 1 1 2 2 3 3 4 33 35 4 5 5 6 6 7 ( ) 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

2015年廉政公署民意調查

2015年廉政公署民意調查 報 告 摘 要 2015 年 廉 政 公 署 周 年 民 意 調 查 背 景 1.1 為 了 掌 握 香 港 市 民 對 貪 污 問 題 和 廉 政 公 署 工 作 的 看 法, 廉 政 公 署 在 1992 至 2009 年 期 間, 每 年 均 透 過 電 話 訪 問 進 行 公 眾 民 意 調 查 為 更 深 入 了 解 公 眾 對 貪 污 問 題 的 看 法 及 關 注, 以 制 訂 適 切

More information

一、

一、 ... 1...24...58 - 2 - - 3 - - 4 - - 5 - - 6 - - 7 - - 8 - i. ii. iii. iv. i. ii. iii. iv. v. vi. vii. viii. ix. x. - 9 - xi. - 10 - - 11 - -12- -13- -14- -15- C. @ -16- @ -17- -18- -19- -20- -21- -22-

More information

Microsoft Word - template.doc

Microsoft Word - template.doc HGC efax Service User Guide I. Getting Started Page 1 II. Fax Forward Page 2 4 III. Web Viewing Page 5 7 IV. General Management Page 8 12 V. Help Desk Page 13 VI. Logout Page 13 Page 0 I. Getting Started

More information

心理障碍防治(下).doc

心理障碍防治(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...2...3...4...5...6...7...8...9...10... 11...12...13...15...16...17...19...21 I ...23...24...26...27...28...30...32...34...37...39...40...42...42...44...47...50...52...56...58...60...64...68

More information

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc

Microsoft Word - MP2018_Report_Chi _12Apr2012_.doc 人 力 資 源 推 算 報 告 香 港 特 別 行 政 區 政 府 二 零 一 二 年 四 月 此 頁 刻 意 留 空 - 2 - 目 錄 頁 前 言 詞 彙 縮 寫 及 注 意 事 項 摘 要 第 一 章 : 第 二 章 : 第 三 章 : 第 四 章 : 附 件 一 : 附 件 二 : 附 件 三 : 附 件 四 : 附 件 五 : 附 件 六 : 附 件 七 : 引 言 及 技 術 大 綱 人

More information

南華大學數位論文

南華大學數位論文 1 i -------------------------------------------------- ii iii iv v vi vii 36~39 108 viii 15 108 ix 1 2 3 30 1 ~43 2 3 ~16 1 2 4 4 5 3 6 8 6 4 4 7 15 8 ----- 5 94 4 5 6 43 10 78 9 7 10 11 12 10 11 12 9137

More information

李天命的思考藝術

李天命的思考藝術 ii iii iv v vi vii viii ix x 3 1 2 3 4 4 5 6 7 8 9 5 10 1 2 11 6 12 13 7 8 14 15 16 17 18 9 19 20 21 22 10 23 24 23 11 25 26 7 27 28 12 13 29 30 31 28 32 14 33 34 35 36 5 15 3 1 2 3 4 5 6 7 8 9 10 11

More information

皮肤病防治.doc

皮肤病防治.doc ...1...1...2...3...4...5...6...7...7...9...10... 11...12...14...15...16...18...19...21 I ...22...22...24...25...26...27...27...29...30...31...32...33...34...34...36...36...37...38...40...41...41...42 II

More information

性病防治

性病防治 ...1...2...3...4...5...5...6...7...7...7...8...8...9...9...10...10... 11... 11 I ...12...12...12...13...14...14...15...17...20...20...21...22...23...23...25...27...33...34...34...35...35 II ...36...38...39...40...41...44...49...49...53...56...57...57...58...58...59...60...60...63...63...65...66

More information

中国南北特色风味名菜 _一)

中国南北特色风味名菜 _一) ...1...1...2...3...3...4...5...6...7...7...8...9... 10... 11... 13... 13... 14... 16... 17 I ... 18... 19... 20... 21... 22... 23... 24... 25... 27... 28... 29... 30... 32... 33... 34... 35... 36... 37...

More information

全唐诗24

全唐诗24 ... 1... 1... 2... 2... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 9... 9...10...10...10...11...12...12...12...13...13 I II...14...14...14...15...15...15...16...16...16...17...17...18...18...18...19...19...19...20...20...20...21...21...22...22...23...23...23...24

More information

509 (ii) (iii) (iv) (v) 200, , , , C 57

509 (ii) (iii) (iv) (v) 200, , , , C 57 59 (ii) (iii) (iv) (v) 500,000 500,000 59I 18 (ii) (iii) (iv) 200,000 56 509 (ii) (iii) (iv) (v) 200,000 200,000 200,000 500,000 57 43C 57 (ii) 60 90 14 5 50,000 43F 43C (ii) 282 24 40(1B) 24 40(1) 58

More information

1 2 6 8 15 36 48 55 58 65 67 74 76 150 152 1 3 1 2 4 2 2001 2000 1999 12 31 12 31 12 31 304,347 322,932 231,047 14,018 16,154 5,665 (i) 0.162 0.193 0.082 (ii) 0.165 0.227 0.082 (iii) 10.08 13.37 6.47 0.688

More information

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - string_kruse [兼容模式] Strings Strings in C not encapsulated Every C-string has type char *. Hence, a C-string references an address in memory, the first of a contiguous set of bytes that store the characters making up the string.

More information

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 WWW PHP 2003 1 Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 Comments PHP Shell Style: # C++ Style: // C Style: /* */ $value = $p * exp($r * $t); # $value

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC General instruction format for machine code 611 37100 微處理機原理與應用 Lecture 04-4 MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

科学计算的语言-FORTRAN95

科学计算的语言-FORTRAN95 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造

More information

2/80 2

2/80 2 2/80 2 3/80 3 DSP2400 is a high performance Digital Signal Processor (DSP) designed and developed by author s laboratory. It is designed for multimedia and wireless application. To develop application

More information

第 二 輯 目 錄.indd 2 目 錄 編 寫 說 明 附 : 香 港 中 學 文 憑 中 國 語 文 科 評 核 模 式 概 述 綜 合 能 力 考 核 考 試 簡 介 及 應 試 技 巧 常 用 實 用 文 文 體 格 式 及 寫 作 技 巧 綜 合 能 力 分 項 等 級 描 述 練 習 一

第 二 輯 目 錄.indd 2 目 錄 編 寫 說 明 附 : 香 港 中 學 文 憑 中 國 語 文 科 評 核 模 式 概 述 綜 合 能 力 考 核 考 試 簡 介 及 應 試 技 巧 常 用 實 用 文 文 體 格 式 及 寫 作 技 巧 綜 合 能 力 分 項 等 級 描 述 練 習 一 作 出 發 者 : 劉 梓 淩 版 : 精 工 出 版 社 行 : 精 工 印 書 局 香 港 銅 鑼 灣 道 168 號 電 話 :2571 1770 2554 1247 傳 真 :2806 0974 2873 2412 網 二 O 一 一 年 址 :http://www.jingkung.com 初 版 版 權 所 有, 翻 版 必 究 如 未 獲 得 本 公 司 同 意, 不 得 用 任 何

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC 4.1 Converting Assembly Language Instructions to

More information

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的

2. 我 沒 有 說 實 話, 因 為 我 的 鞋 子 其 實 是 [ 黑 色 / 藍 色 / 其 他 顏 色.]. 如 果 我 說 我 現 在 是 坐 著 的, 我 說 的 是 實 話 嗎? [ 我 說 的 對 還 是 不 對 ]? [ 等 對 方 回 答 ] 3. 這 是 [ 實 話 / 對 的 附 錄 美 國 國 家 兒 童 健 康 與 人 類 發 展 中 心 (NICHD) 偵 訊 指 導 手 冊 I. 開 場 白 1. 你 好, 我 的 名 字 是, 我 是 警 察 [ 介 紹 房 間 內 的 其 他 人, 不 過, 在 理 想 狀 態 下, 房 間 裡 不 該 有 其 他 人 ] 今 天 是 ( 年 月 日 ), 現 在 是 ( 幾 點 幾 分 ) 我 是 在 ( 地 點 ) 問 你

More information

_Chi.ps, page Preflight ( _Chi.indd )

_Chi.ps, page Preflight ( _Chi.indd ) on conviction3 5 1. / 2. 14 3. 2 2 3 4. 372 12 5. 6. 1 7. 1 2 i ii iii iv 8. 9. 1 12 2 2 i ii iii i ii iii 3 iv http://www.pcpd.org.hk v i ii iii 4 i ii i / ii 5 1. 2. 3. i ii iii iv v vi 4. 5. 6 6. 7.

More information

Microsoft Word - report final.doc

Microsoft Word - report final.doc 殘 疾 人 士 無 障 礙 運 輸 需 要 研 究 調 查 報 告 書 目 錄 I. 撮 要 II. III. IV. 前 言 調 查 目 的 文 獻 回 顧 V. 調 查 方 法 VI. 調 查 結 果 VII. 分 析 及 討 論 VIII. 建 議 IX. 鳴 謝 I. 撮 要 殘 疾 人 士 在 日 常 生 活 上 面 對 不 少 困 難 與 挑 戰, 健 全 人 士 未 必 可 以 身 同

More information

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63>

<4D6963726F736F667420576F7264202D203938BEC7A67EABD7B942B0CAC15AC075B3E6BF57A9DBA5CDC2B2B3B92DA5BFBD542E646F63> 98 年 3 月 11 日 依 本 校 98 學 年 度 招 生 委 員 會 第 1 次 會 議 核 定 大 同 技 術 學 院 98 學 年 度 重 點 運 動 項 目 績 優 學 生 單 獨 招 生 簡 章 大 同 技 術 學 院 招 生 委 員 會 編 印 校 址 :600 嘉 義 市 彌 陀 路 253 號 電 話 :(05)2223124 轉 203 教 務 處 招 生 專 線 :(05)2223124

More information

Microsoft Word - em78 sub program.doc

Microsoft Word - em78 sub program.doc 一 二进制数转换为 ASCⅡ 码 将一个字节的二进制数转换为两位 16 进制数的 ASCⅡ 码 main: mov a,@0x9f ; 二进制数为 0x9f mov 0x30,a ; 二进制数存入 0x30 mov a,@0x02 mov 0x10,a ;0x10 中存放转换次数 mov a,@0x31 mov 0x04,a ;0x04 中为转换后数据存放地址 mov a,0x30 B1: ; 取

More information

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx

Microsoft Word - Paper on PA (Chi)_2016.01.19.docx 立 法 會 發 展 事 務 委 員 會 二 零 一 六 年 施 政 報 告 及 施 政 綱 領 有 關 發 展 局 的 措 施 引 言 行 政 長 官 在 二 零 一 六 年 一 月 十 三 日 發 表 題 為 創 新 經 濟 改 善 民 生 促 進 和 諧 繁 榮 共 享 的 二 零 一 六 年 施 政 報 告 施 政 報 告 夾 附 施 政 綱 領, 臚 列 政 府 推 行 的 新 措 施 和

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

中医疗法(下).doc

中医疗法(下).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...2...3...4...13...15...17...17...24...25...26...26...28...28...29...31...31...33...33

More information

緒 言 董 事 會 宣 佈, 為 能 更 具 效 率 調 配 本 集 團 內 的 資 金 有 效 降 低 集 團 的 對 外 貸 款, 並 促 進 本 集 團 內 公 司 間 的 結 算 服 務, 於 2016 年 9 月 30 日, 本 公 司 中 糧 財 務 與 管 理 公 司 訂 立 財 務

緒 言 董 事 會 宣 佈, 為 能 更 具 效 率 調 配 本 集 團 內 的 資 金 有 效 降 低 集 團 的 對 外 貸 款, 並 促 進 本 集 團 內 公 司 間 的 結 算 服 務, 於 2016 年 9 月 30 日, 本 公 司 中 糧 財 務 與 管 理 公 司 訂 立 財 務 香 港 交 易 及 結 算 所 有 限 公 司 及 香 港 聯 合 交 易 所 有 限 公 司 對 本 公 告 的 內 容 概 不 負 責, 對 其 準 確 性 或 完 整 性 亦 不 發 表 任 何 聲 明, 並 明 確 表 示, 概 不 對 因 本 公 告 全 部 或 任 何 部 分 內 容 而 產 生 或 因 倚 賴 該 等 內 容 而 引 致 的 任 何 損 失 承 擔 任 何 責 任 JOY

More information

國立中山大學學位論文典藏.PDF

國立中山大學學位論文典藏.PDF I II III IV V VI VII VIII IX X 苷 XI XII 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

More information

穨ecr2_c.PDF

穨ecr2_c.PDF i ii iii iv v vi vii viii 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 26 27 2 28 29 30 31 32 33 34 35 36 37 38 39 40 3 4 41 42 43 5 44 45 46 6 47 48 49 50 51 52 1 53 2 54 55 3 56

More information

電腦相關罪行跨部門工作小組-報告書

電腦相關罪行跨部門工作小組-報告書 - ii - - iii - - iv - - v - - vi - - vii - - viii - (1) 2.1 (2) (3) 13.6 (4) 1.6 (5) 21 (6) (7) 210 (8) (9) (10) (11) ( ) ( 12) 20 60 16 (13) ( ) (

More information

i

i i ii iii iv v vi vii viii ===== 1 2 3 4 5 6 7 8 9 10 ==== 11 12 13 14 15 16 17 18 19 ==== ==== 20 .. ===== ===== ===== ===== ===== ======.. 21 22 ===== ===== ===== ===== 23 24 25 26 27 28 29 ==== ====

More information

发展党员工作手册

发展党员工作手册 发 展 党 员 工 作 问 答 目 录 一 总 论...9 1. 发 展 党 员 工 作 的 方 针 是 什 么? 如 何 正 确 理 解 这 个 方 针?... 9 2. 为 什 么 强 调 发 展 党 员 必 须 保 证 质 量?... 9 3. 如 何 做 到 慎 重 发 展?... 10 4. 如 何 处 理 好 发 展 党 员 工 作 中 的 重 点 与 一 般 的 关 系?...11 5.

More information

i

i 9 1 2 3 4 i 5 6 ii iii iv v vi vii viii 1 1 1 2 3 4 2 5 6 2 3 2.10 ( 2.11 ) ( 2.11 ) ( 2.9 ) 7 8 9 3 10 5% 2% 4 11 93% (2001 02 2003 04 ) ( ) 2,490 (100%) 5 12 25% (2.57% 25%) 6 (2001 02 2003 04 ) 13 100%

More information

39898.indb

39898.indb 1988 4 1998 12 1990 5 40 70.................................................. 40.............................................................. 70..............................................................

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt 8088/8086 MICROPROCSOR PROGRAMMING INTEGER INSTRUCTIONS AND COMPUTATIONS The MOVE The move (MOV) instruction is used to transfer a byte or a word of data from a source operand to a destination operand

More information

目 录 院 领 导 职 责... 1 院 长 职 责... 1 医 疗 副 院 长 职 责... 1 教 学 副 院 长 职 责... 2 科 研 副 院 长 职 责... 2 后 勤 副 院 长 职 责... 3 主 管 南 院 区 副 院 长 职 责... 3 党 委 书 记 职 责... 4

目 录 院 领 导 职 责... 1 院 长 职 责... 1 医 疗 副 院 长 职 责... 1 教 学 副 院 长 职 责... 2 科 研 副 院 长 职 责... 2 后 勤 副 院 长 职 责... 3 主 管 南 院 区 副 院 长 职 责... 3 党 委 书 记 职 责... 4 目 录 院 领 导 职 责... 1 院 长 职 责... 1 医 疗 副 院 长 职 责... 1 教 学 副 院 长 职 责... 2 科 研 副 院 长 职 责... 2 后 勤 副 院 长 职 责... 3 主 管 南 院 区 副 院 长 职 责... 3 党 委 书 记 职 责... 4 纪 委 书 记 职 责... 5 院 长 办 公 室... 6 院 长 办 公 室 工 作 职 责...

More information

智力测试故事

智力测试故事 II 980.00 ... 1... 1... 1... 2... 2... 2... 3... 3... 3... 3... 4... 4... 5... 5... 6... 6... 7... 7... 8... 8... 8... 9... 9...10...10...10 I II...11...11...11...12...13...13...13...14...14...14...15...15...15...16...16...17...17...18...18...19...19...19...19...20...20...21...21...21

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

常用ARM指令集及汇编

常用ARM指令集及汇编 常用 ARM 指令集及汇编 2003 年 12 月 1 日 前 言 ARM(Advanced RISC Machines) 是 微 处 理 器 行 业 的 一 家 知 名 企 业, 该 企 业 设 计 了 大 量 高 性 能 廉 价 耗 能 低 的 RISC 处 理 器 相 关 技 术 及 软 件 技 术 具 有 性 能 高 成 本 低 和 能 耗 省 的 特 点, 适 用 于 多 种 领 域, 比

More information

C

C C 2017 3 14 1. 2. 3. 4. 2/95 C 1. 3/95 C I 1 // talkback.c: 2 #include 3 #include 4 #define DENSITY 62.4 5 int main(void) 6 { 7 float weight, volume; 8 int size; 9 unsigned long letters;

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (xi) 60.99%39.01%

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (xi) 60.99%39.01% 48.55% 1998 19986 30%20086 2009 2009 200 (i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (xi) 60.99%39.01% 200820092010 772 928960200820092010 1512928 201 1. 20091222(2009)7267 20042008 16,980,954.02

More information

(b) 3 (a) (b) 7 (a) (i) (ii) (iii) (iv) (v) (vi) (vii) 57

(b) 3 (a) (b) 7 (a) (i) (ii) (iii) (iv) (v) (vi) (vii) 57 (i) (ii) (iii) A. 123 2 3(1) (2) (i) 41 (ii) (iii) 121 4(3) (i) (ii) (iii) 123A 3 (a) 56 (b) 3 (a) (b) 7 (a) (i) (ii) (iii) (iv) (v) (vi) (vii) 57 (viii) (ix) (x) 4B(2)(d) (e) (f) (xi) (xii) (b) (a) (i)

More information

中医疗法(上).doc

中医疗法(上).doc ( 20 010010) 787 1092 1/32 498.50 4 980 2004 9 1 2004 9 1 1 1 000 ISBN 7-204-05940-9/R 019 1880.00 ( 20.00 ) ...1...1...1...2...4...5...7...13...15...17...18...19...21...23...24...24...26...26...27 I ...28...29...30...30...31...32...33...34...35...36...37...39...40...41...42...43...43...45...46...47...47...48

More information

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (i) (ii)(iii) (iv) (v)

(i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (i) (ii)(iii) (iv) (v) 1948 12 1 1986 1 1995 1995 3 1995 5 2003 4 2003 12 2015 82015 10 1 2004 2 1 (i) (ii) (iii) (iv) (v) (vi) (vii) (viii) (ix) (x) (i) (ii)(iii) (iv) (v) (vi) (vii)(viii) (ix) (x) (xi) 2013 8 15 (i) (ii) (iii)

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

奇闻怪录

奇闻怪录 ... 1... 1... 2... 3... 3... 4... 4... 5... 5... 6... 8... 9... 10... 10... 11... 11... 13... 13... 14... 14... 15... 16... 17... 21 I ... 22... 23... 23... 24... 25... 25... 26... 27... 28... 29 UFO...

More information

软件测试(TA07)第一学期考试

软件测试(TA07)第一学期考试 一 判 断 题 ( 每 题 1 分, 正 确 的, 错 误 的,20 道 ) 1. 软 件 测 试 按 照 测 试 过 程 分 类 为 黑 盒 白 盒 测 试 ( ) 2. 在 设 计 测 试 用 例 时, 应 包 括 合 理 的 输 入 条 件 和 不 合 理 的 输 入 条 件 ( ) 3. 集 成 测 试 计 划 在 需 求 分 析 阶 段 末 提 交 ( ) 4. 单 元 测 试 属 于 动

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

Microsoft Word - 中三選科指南 2014 subject

Microsoft Word - 中三選科指南 2014 subject 必 修 科 目 簡 介 < < < 1. 中 文 > > > 本 科 的 公 開 評 核 以 課 程 發 展 議 會 與 香 港 考 試 及 評 核 局 聯 合 編 訂 的 中 國 語 文 科 課 程 及 評 估 指 引 ( 中 四 至 中 六 ) 為 根 據 目 標 本 科 主 要 評 核 考 生 : (1) 讀 寫 聽 說 能 力 思 維 能 力 審 美 能 力 和 自 學 能 力 ; (2)

More information

幻灯片 1

幻灯片 1 3 8086 Tel:2656809 tjx@csu.edu.cn 2005-9-14 1 2005-9-14 2 8086 8 8086 8086 7 2005-9-14 3 PC 2005-9-14 4 2005-9-14 5 81616 2005-9-14 6 [ ] MOV AX, 3064H AX=3064H 16AX OP 64H 30H 2005-9-14 7 16 AX BX CX

More information

飞行模拟设备的鉴定和使用规则

飞行模拟设备的鉴定和使用规则 中 国 民 用 航 空 总 局 民 航 总 局 令 第 141 号 飞 行 模 拟 设 备 的 鉴 定 和 使 用 规 则 (2005 年 3 月 7 日 公 布 ) CCAR-60 中 国 民 用 航 空 总 局 令 第 141 号 飞 行 模 拟 设 备 的 鉴 定 和 使 用 规 则 已 经 2005 年 2 月 5 日 中 国 民 用 航 空 总 局 局 务 会 议 通 过, 现 予 公 布,

More information

<4D6963726F736F667420576F7264202D205B345DB5D8AE4CACD732303135AECAAFC5C1C9C1DCBDD0AB48A4CEB3F8A657AAED>

<4D6963726F736F667420576F7264202D205B345DB5D8AE4CACD732303135AECAAFC5C1C9C1DCBDD0AB48A4CEB3F8A657AAED> 華 夏 盃 全 國 全 國 數 學 奧 林 匹 克 邀 請 賽 ( 華 南 賽 區 ) 晉 級 賽 比 賽 詳 情 : 一 比 賽 對 象 : 小 學 一 至 六 年 級 中 學 一 二 年 級 二 比 賽 日 期 及 時 間 : 年 2 月 15 日 ( 星 期 日 ) 小 學 組 小 一 級 小 二 級 小 三 級 小 四 級 小 五 級 小 六 級 時 間 13:10~1:20 13:10~1:20

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

Microsoft Word - MSP430 Launchpad 指导书.docx

Microsoft Word - MSP430 Launchpad 指导书.docx Contents 3... 9... 14 MSP430 LAUNCHPAD 指导书 3 第一部分第一个工程 New Project File > New > CCS Project Project name: ButtonLED Device>Family: MSP430 Variant: MSP430G2553 Project templates and examples : Empty Project

More information

群科課程綱要總體課程計畫書

群科課程綱要總體課程計畫書 核 准 文 號 :102 年 4 月 22 日 臺 教 國 署 高 字 第 1020036237 號 國 立 曾 文 高 級 農 工 職 業 學 校 群 科 課 程 綱 要 總 體 課 程 計 畫 書 (102 學 年 度 入 學 學 生 適 用 ) 中 華 民 國 102 年 04 月 22 日 國 立 曾 文 高 級 農 工 職 業 學 校 群 科 課 程 綱 要 總 體 課 程 計 畫 書 核

More information

Microsoft Word - NCH final report_CHI _091118_ revised on 10 Dec.doc

Microsoft Word - NCH final report_CHI _091118_ revised on 10 Dec.doc 十 八 區 區 議 會 的 簡 介 會 (1) 東 區 區 議 會 (2008 年 4 月 24 日 ) III. 中 環 新 海 濱 城 市 設 計 研 究 第 二 階 段 公 眾 參 與 ( 東 區 區 議 會 文 件 第 51/08 號 ) 10. 主 席 歡 迎 發 展 局 副 秘 書 長 ( 規 劃 及 地 政 ) 麥 駱 雪 玲 太 平 紳 士 規 劃 署 副 署 長 / 地 區 黃 婉

More information

前 言 根 据 澳 门 特 别 行 政 区 第 11/1999 号 法 律 第 三 条 规 定, 审 计 长 执 行 其 职 责, 已 经 对 财 政 局 提 交 的 2011 年 度 澳 门 特 别 行 政 区 总 帐 目 ( 总 帐 目 ) 进 行 了 审 计 与 2010 年 度 相 同, 本 年 度 的 总 帐 目 由 政 府 一 般 综 合 帐 目 及 特 定 机 构 汇 总 帐 目, 两

More information