嵌入式系统原理及应用(精品文档 (3)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7) 堆栈寻址 堆栈是一种存储部件, 即数据的写入跟读出不需要提 供地址, 而是根据写入的顺序决 定读出的顺序。 形象地来 说, 栈就是一条流水线, 而流水线中加工的就是方法的主 要程序, 在分配栈时, 由于程序是自上而下顺序执行, 就 将程序指令一条一条压入栈中, 就像流水 线一样。 而堆上 站着的就是工作人员, 他们加工流水线中的商品, 由程序 员分配何时加工、 如何加工。 堆栈的操作顺序为“后进先出”。 堆栈寻址是隐含的, 它使用一个专门的寄存器(堆栈 指针)指向一块存储区域(堆 栈), 指针所指向的存储单元即是堆栈的栈顶。
第 3 章 ARM 指令系统 例 3-10 使用堆栈指令进行堆栈操作。
第 3 章 ARM 指令系统
例 3-11 通过 ADS 集成开发环境的 AXD 调试器窗口, 可以观察到多寄存器指令执行 后各内存地址存储字数据的 结果, 如图 3-4 所示。
第 3 章 ARM 指令系统
图 3-4 多寄存器指令的执行顺序
6) 多寄存器寻址 多寄存器寻址一次可传送几个寄存器 值, 允许一条指令传送 16 个寄存器的任何子集或 所有寄存 器。 多寄存器寻址指令举例如下:
此处需要注意, 使用多寄存器寻址指令时, 寄存器子 集的顺序是按由小到大的顺序排 列的, 连续的寄存器可用 “ ”连接, 否则用“, ”分隔书写。
第 3 章 ARM 指令系统
只能使用加载和存储指令实现。常用存储器访问指令如表 3-5 所示。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
存储器堆栈可分为两种: (1) 向上生长: 向高地址方向生长, 称为递增堆栈。 (2) 向下生长: 向低地址方向生长, 称为递减堆栈。 堆 栈指针指向最后压入的堆栈的有效数据项, 称为满堆栈; 堆栈指针指向下一个待压 入数据的空位置, 称为空堆栈。
第 3 章 ARM 指令系统
所以可以组合出四种类型的堆栈方式: (1) 满递增: 堆栈向上增长, 堆栈指针指向内含有效数 据项的最高地址。 指令如 LDMFA、STMFA 等。 (2) 空递增: 堆栈向上增长, 堆栈指针指向堆栈上的第 一个空位置。 指令如 LDMEA、STMEA 等。 (3) 满递减: 堆栈向下增长, 堆栈指针指向内含有效数 据项的最低地址。 指令如 LDMFD、STMFD 等。 (4) 空递减: 堆栈向下增长, 堆栈指针指向堆栈下的第 一个空位置。 指令如 LDMED、STMED 等。
第 3 章 ARM 指令系统 3.1.2 ARM 指令格式与条件码
ARM 指令是三地址指令格式, 如图 3-1 所示, 指令的 基本格式如下:
其中, < >号内的项是必须的, { }号内的项是可选的。
第 3 章 ARM 指令系统
图 3-1 ARM 指令集的指令格式
第 3 章 ARM 指令系统
各项的说明如下: (1) opcped: 指令操作码、 助记符, 如 ADD、 LDR等。 (2) cond: 指令的条件码, 如表 3-1 所示, 条件码共有 16 种, 占用指令编码的最高四 位[31:28]。 所有的 ARM 指令都可以条件执行, 而 Thumb 指令只 有 B(跳转)指令具有条件执行功 能。 如果指令不标明条件 代码, 将默认为无条件(AL)执行。
可分为四类: 数据传送指令、 算 术逻辑运算指令、 比较指 令和乘法指令。
数据处理指令只能对寄存器的内容进行操作, 而不能 对内存中的数据进行操作。 所有 ARM 数据处理指令均可选 择使用 S 后缀, 以使指令影响状态标志。 比较指令 CMP、 CMN、 TST 和 TEQ不需要后缀 S, 它们会直接影响状态标 志。 常用数据处理指令如表 3-4 所示。
第 3 章 ARM 指令系统
3.1.3 ARM 指令的寻址方式 寻址方式就是处理器根据指令中给出的源操作数地址码
字段来实现寻找真实操作数地 址(或物理地址)的方式。 例 如 B 现在 21 号楼 201 教室, A 要找到 B 必须先找到教室 再找到 人, 即为间接寻址方式。 ARM 处理器具有 9 种基 本寻址方式, 下面将分别介绍。
例 3-6 判断如下立即数是否合法。
第 3 章 ARM 指令系统
② Rm——寄存器方式。 在寄存器方式下, 操作数即为寄存器的数值。 例如:
SUM R1, R1, R2 ; R1-R2→R1 ③ Rm, shift——寄存器移位方式。 将寄存器的移位结果作为操作数(移位操作不消耗额外 的时间), 但 Rm 值保持不变, 移位方法如表 3-2 与图 3-3 所示, 其中 1≤n≤32。
第 3 章 ARM 指令系统
(4) 大量使用寄存器, 大多数据操作都在寄存器中完成, 指令执行速度更快。
(5) 寻址方式灵活简单, 执行效率高。 (6) LoadStore 结构。 在 RISC中, 所有的计算都要求在 寄存器中完成。 而寄存器和内 存的通信则由单独的 Load / Store指令来完成。
第 3 章 ARM 指令系统
例 3-1 用户可以测试某个寄存器的值, 满足条件时才 可以执行某些指令。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统 例 3-2 巧妙地使用条件码, 可写出非常简练的代码。
第 3 章 ARM 指令系统
(3) S: 决定指令的操作是否影响 CPSR 的值。 默认情况下, 数据处理指令不影响程序状态寄存器的 条件码标志位, 但可以选择通过 添加“S”来影响标志位。 CMP 不需要增加“S”就可改变相应的标志位。 例 3-3 “S”位的使用。
LOOP
第 3 章 ARM 指令系统
(4) Rd: 目标寄存器编码, Rd 可为任意通用寄存器, 寄存器之间用“, ”分隔。
(5) Rn: 包含第一个操作数的寄存器编码, Rn 可为任意 通用寄存器。
(6) operand2: 第 2 操作数, 可为 8 位立即数、 寄存器 及寄存器移位方式。
灵活地使用第 2 个操作数“operand2”能够提高代码效 率。 它有三种形式:
2) 寄存器寻址 操作数的值在寄存器中, 指令中的地址码字段指出的 是寄存器编号, 指令执行时直接 取出寄存器值来操作。 寄 存器寻址指令举例如下:
第 3 章 ARM 指令系统
3) 寄存器移位寻址 寄存器移位寻址是 ARM 指令集特有的寻址方式。 当 第 2 个操作数是寄存器移位方式时, 第 2 个寄存器操作数 在与第 1 个操作数结合之前, 选择进行移位操作。
第 3 章 ARM 指令系统
5) 基址寻址 基址寻址是将基址寄存器的内容与指令中给出的偏移量 (<4 KB)相加/ 减, 形成操作数 的有效地址。 基址寻址用 于访问基址附近的存储单元, 常用于查表、 数组操作、 功 能部件寄 存器访问等。 寄存器间接寻址可认为是偏移量为0 的基址加偏移寻址。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
图 3-5 ARM 数据处理指令编码
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
3.2.2 存储器访问指令 ARM 处理器是典型的 RISC处理器, 对存储器的访问
第 3 章 ARM 指令系统
4) 寄存器间接寻址 指令中的地址码给出的是一个通用寄存器的编号, 所 需的操作数保存在寄存器指定地 址的存储单元中, 即寄存 器为操作数的地址指针。 例如, 现须到 12201 教室找 XXX 同学借书, 其中 12201 教室为间接地址, XXX 同学为 具体操作数, 如果发 现XXX 同学不在 12201 而在 12205 教室, 需要加一个偏移 量#4, 最终 找到 XXX 同学。
第 3 章 ARM 指令系统
9) 相对寻址 相对寻址是基址寻址的一种变通。 由程序计数器 PC提 供基准地址, 指令中的地址码 字段作为偏移量, 两者相加 后得到的地址即为操作数的有效地址。
第 3 章 ARM 指令系统
3.2 ARM指令集
3.2.1 数据处理指令 数据处理指令编码格式如图 3-5 所示, 数据处理指令
第 3 章 ARM 指令系统
1) 立即寻址 指令中的操作码字段后面的地址码部分即是操作数本身, 也就是说, 数据就包含在指 令当中, 取出指令也就取出了 可以立即使用的操作数, 立即数要以“#”号为前缀, 十六 进制 数值时以“0x”表示, 不加0x 时表示十进制数。 立 即寻址指令举例如下:
第 3 章 ARM 指令系统
令特点 ARM 指令有如下特点: (1) 指令长度固定。 ARM 具有
32 位 ARM 指令集和 16 位 Thumb 指令集, 程序的启动 都 是从 ARM 指令集开始, 包括所有异常中断都是自动转化 为 ARM 状态。 ARM 指令集效率 高, 但是代码密度低; 而 Thumb 指令集具有较高的代码密度, 却仍然保持 ARM 的大多数性能上的优势, 它是 ARM 指令集的子集。
第 3 章 ARM 指令系统
(2) 所有的 ARM 指令都可以条件执行, 可以通过添加 适当的条件码“ cond”后缀来达 到条件执行的目的, 从而 提高代码密度, 实现高效的逻辑操作(节省跳转和条件语句), 提 高代码效率。 而 Thumb 指令仅有一条指令具备条件执行 功能。
(3) 新版本增加指令, 并保持指令向后兼容, 如 16 / 32 位的 Thumb 2 指令集、 VFP 浮 点数运算, 指令集可以通过 协处理器扩展。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
图 3-3 寄存器移位方式
第 3 章 ARM 指令系统 例 3-7 寄存器移位方式。
例 3-8 可以借助左右移实现操作数对 2n乘除运算, 左 移 3 次相当于乘以 8, 右移 3 次相当于除以 8, 加上加减运 算, 从而实现任意函数, 如 Y=AX+B 等。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
3.1 ARM指令概述 3.2 ARM指令集 3.3 Thumb 及 Thumb-2指令集 3.4 ARM汇编语言程序设计 3.5 ARM C语言程序设计 习题
第 3 章 ARM 指令系统
3.1 ARM指令概述
ARM 处理器既支持 32 位的 ARM 指令集, 也支持 16 位的 Thumb 指令集, 从 ARMv6 开 始, 新的 ARM 处理器 支持 16/ 32 位的 Thumb 2 指令集, ARMv7 M仅支持 Thumb 2 指令 集, ARM Cortex-A8 处理器核支持 ARM、 Thumb 2、 Thumb EE、 Jazelle、 DSP 指令集。
第 3 章 ARM 指令系统
8) 块拷贝寻址 块拷贝寻址又称多寄存器传送指令, 用于将一块数据 (最多 16 个通用寄存器的值)从 存储器的某一位置拷贝到另 一位置。 ARM 支持堆栈和块复制两种不同的数据块操作机 制, 两者使用相同的指令, 如表 3-3 所示。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统 例 3-12 多寄存器传送指令。
第 3 章 ARM 指令系统
图 3-2 第 2 操作数的常数形式
第 3 章 ARM 指令系统
例 3-5 ADDR3, R7, #1020 ; #1020 为#immed-8r 型 的第 2 操作数。
分析: 1020 =0x3FC=0x000003FC, 1020 是0xFF 循 环右移 30 位后生成的 32 位立即数, 因此合法。
第 3 章 ARM 指令系统
① #immed-8r——常数表达式。 该常数必须对应 8 位位图, 当小于等于 255(0xFF)时, 正常使用; 当大于 255 时, 必须 是一个 8 位(小于等于 8 位有效数字)的常数通过循环右移偶数位得到。 例 3-4 逻辑与运算。AND R1, R2, #0x04800000 ; 其中此处的立即数是由0x12 循环右移 10 位得到的, 如图 3-2 所示。
第 3 章 ARM 指令系统 例 3-10 使用堆栈指令进行堆栈操作。
第 3 章 ARM 指令系统
例 3-11 通过 ADS 集成开发环境的 AXD 调试器窗口, 可以观察到多寄存器指令执行 后各内存地址存储字数据的 结果, 如图 3-4 所示。
第 3 章 ARM 指令系统
图 3-4 多寄存器指令的执行顺序
6) 多寄存器寻址 多寄存器寻址一次可传送几个寄存器 值, 允许一条指令传送 16 个寄存器的任何子集或 所有寄存 器。 多寄存器寻址指令举例如下:
此处需要注意, 使用多寄存器寻址指令时, 寄存器子 集的顺序是按由小到大的顺序排 列的, 连续的寄存器可用 “ ”连接, 否则用“, ”分隔书写。
第 3 章 ARM 指令系统
只能使用加载和存储指令实现。常用存储器访问指令如表 3-5 所示。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
存储器堆栈可分为两种: (1) 向上生长: 向高地址方向生长, 称为递增堆栈。 (2) 向下生长: 向低地址方向生长, 称为递减堆栈。 堆 栈指针指向最后压入的堆栈的有效数据项, 称为满堆栈; 堆栈指针指向下一个待压 入数据的空位置, 称为空堆栈。
第 3 章 ARM 指令系统
所以可以组合出四种类型的堆栈方式: (1) 满递增: 堆栈向上增长, 堆栈指针指向内含有效数 据项的最高地址。 指令如 LDMFA、STMFA 等。 (2) 空递增: 堆栈向上增长, 堆栈指针指向堆栈上的第 一个空位置。 指令如 LDMEA、STMEA 等。 (3) 满递减: 堆栈向下增长, 堆栈指针指向内含有效数 据项的最低地址。 指令如 LDMFD、STMFD 等。 (4) 空递减: 堆栈向下增长, 堆栈指针指向堆栈下的第 一个空位置。 指令如 LDMED、STMED 等。
第 3 章 ARM 指令系统 3.1.2 ARM 指令格式与条件码
ARM 指令是三地址指令格式, 如图 3-1 所示, 指令的 基本格式如下:
其中, < >号内的项是必须的, { }号内的项是可选的。
第 3 章 ARM 指令系统
图 3-1 ARM 指令集的指令格式
第 3 章 ARM 指令系统
各项的说明如下: (1) opcped: 指令操作码、 助记符, 如 ADD、 LDR等。 (2) cond: 指令的条件码, 如表 3-1 所示, 条件码共有 16 种, 占用指令编码的最高四 位[31:28]。 所有的 ARM 指令都可以条件执行, 而 Thumb 指令只 有 B(跳转)指令具有条件执行功 能。 如果指令不标明条件 代码, 将默认为无条件(AL)执行。
可分为四类: 数据传送指令、 算 术逻辑运算指令、 比较指 令和乘法指令。
数据处理指令只能对寄存器的内容进行操作, 而不能 对内存中的数据进行操作。 所有 ARM 数据处理指令均可选 择使用 S 后缀, 以使指令影响状态标志。 比较指令 CMP、 CMN、 TST 和 TEQ不需要后缀 S, 它们会直接影响状态标 志。 常用数据处理指令如表 3-4 所示。
第 3 章 ARM 指令系统
3.1.3 ARM 指令的寻址方式 寻址方式就是处理器根据指令中给出的源操作数地址码
字段来实现寻找真实操作数地 址(或物理地址)的方式。 例 如 B 现在 21 号楼 201 教室, A 要找到 B 必须先找到教室 再找到 人, 即为间接寻址方式。 ARM 处理器具有 9 种基 本寻址方式, 下面将分别介绍。
例 3-6 判断如下立即数是否合法。
第 3 章 ARM 指令系统
② Rm——寄存器方式。 在寄存器方式下, 操作数即为寄存器的数值。 例如:
SUM R1, R1, R2 ; R1-R2→R1 ③ Rm, shift——寄存器移位方式。 将寄存器的移位结果作为操作数(移位操作不消耗额外 的时间), 但 Rm 值保持不变, 移位方法如表 3-2 与图 3-3 所示, 其中 1≤n≤32。
第 3 章 ARM 指令系统
(4) 大量使用寄存器, 大多数据操作都在寄存器中完成, 指令执行速度更快。
(5) 寻址方式灵活简单, 执行效率高。 (6) LoadStore 结构。 在 RISC中, 所有的计算都要求在 寄存器中完成。 而寄存器和内 存的通信则由单独的 Load / Store指令来完成。
第 3 章 ARM 指令系统
例 3-1 用户可以测试某个寄存器的值, 满足条件时才 可以执行某些指令。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统 例 3-2 巧妙地使用条件码, 可写出非常简练的代码。
第 3 章 ARM 指令系统
(3) S: 决定指令的操作是否影响 CPSR 的值。 默认情况下, 数据处理指令不影响程序状态寄存器的 条件码标志位, 但可以选择通过 添加“S”来影响标志位。 CMP 不需要增加“S”就可改变相应的标志位。 例 3-3 “S”位的使用。
LOOP
第 3 章 ARM 指令系统
(4) Rd: 目标寄存器编码, Rd 可为任意通用寄存器, 寄存器之间用“, ”分隔。
(5) Rn: 包含第一个操作数的寄存器编码, Rn 可为任意 通用寄存器。
(6) operand2: 第 2 操作数, 可为 8 位立即数、 寄存器 及寄存器移位方式。
灵活地使用第 2 个操作数“operand2”能够提高代码效 率。 它有三种形式:
2) 寄存器寻址 操作数的值在寄存器中, 指令中的地址码字段指出的 是寄存器编号, 指令执行时直接 取出寄存器值来操作。 寄 存器寻址指令举例如下:
第 3 章 ARM 指令系统
3) 寄存器移位寻址 寄存器移位寻址是 ARM 指令集特有的寻址方式。 当 第 2 个操作数是寄存器移位方式时, 第 2 个寄存器操作数 在与第 1 个操作数结合之前, 选择进行移位操作。
第 3 章 ARM 指令系统
5) 基址寻址 基址寻址是将基址寄存器的内容与指令中给出的偏移量 (<4 KB)相加/ 减, 形成操作数 的有效地址。 基址寻址用 于访问基址附近的存储单元, 常用于查表、 数组操作、 功 能部件寄 存器访问等。 寄存器间接寻址可认为是偏移量为0 的基址加偏移寻址。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
图 3-5 ARM 数据处理指令编码
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
3.2.2 存储器访问指令 ARM 处理器是典型的 RISC处理器, 对存储器的访问
第 3 章 ARM 指令系统
4) 寄存器间接寻址 指令中的地址码给出的是一个通用寄存器的编号, 所 需的操作数保存在寄存器指定地 址的存储单元中, 即寄存 器为操作数的地址指针。 例如, 现须到 12201 教室找 XXX 同学借书, 其中 12201 教室为间接地址, XXX 同学为 具体操作数, 如果发 现XXX 同学不在 12201 而在 12205 教室, 需要加一个偏移 量#4, 最终 找到 XXX 同学。
第 3 章 ARM 指令系统
9) 相对寻址 相对寻址是基址寻址的一种变通。 由程序计数器 PC提 供基准地址, 指令中的地址码 字段作为偏移量, 两者相加 后得到的地址即为操作数的有效地址。
第 3 章 ARM 指令系统
3.2 ARM指令集
3.2.1 数据处理指令 数据处理指令编码格式如图 3-5 所示, 数据处理指令
第 3 章 ARM 指令系统
1) 立即寻址 指令中的操作码字段后面的地址码部分即是操作数本身, 也就是说, 数据就包含在指 令当中, 取出指令也就取出了 可以立即使用的操作数, 立即数要以“#”号为前缀, 十六 进制 数值时以“0x”表示, 不加0x 时表示十进制数。 立 即寻址指令举例如下:
第 3 章 ARM 指令系统
令特点 ARM 指令有如下特点: (1) 指令长度固定。 ARM 具有
32 位 ARM 指令集和 16 位 Thumb 指令集, 程序的启动 都 是从 ARM 指令集开始, 包括所有异常中断都是自动转化 为 ARM 状态。 ARM 指令集效率 高, 但是代码密度低; 而 Thumb 指令集具有较高的代码密度, 却仍然保持 ARM 的大多数性能上的优势, 它是 ARM 指令集的子集。
第 3 章 ARM 指令系统
(2) 所有的 ARM 指令都可以条件执行, 可以通过添加 适当的条件码“ cond”后缀来达 到条件执行的目的, 从而 提高代码密度, 实现高效的逻辑操作(节省跳转和条件语句), 提 高代码效率。 而 Thumb 指令仅有一条指令具备条件执行 功能。
(3) 新版本增加指令, 并保持指令向后兼容, 如 16 / 32 位的 Thumb 2 指令集、 VFP 浮 点数运算, 指令集可以通过 协处理器扩展。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
图 3-3 寄存器移位方式
第 3 章 ARM 指令系统 例 3-7 寄存器移位方式。
例 3-8 可以借助左右移实现操作数对 2n乘除运算, 左 移 3 次相当于乘以 8, 右移 3 次相当于除以 8, 加上加减运 算, 从而实现任意函数, 如 Y=AX+B 等。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统
3.1 ARM指令概述 3.2 ARM指令集 3.3 Thumb 及 Thumb-2指令集 3.4 ARM汇编语言程序设计 3.5 ARM C语言程序设计 习题
第 3 章 ARM 指令系统
3.1 ARM指令概述
ARM 处理器既支持 32 位的 ARM 指令集, 也支持 16 位的 Thumb 指令集, 从 ARMv6 开 始, 新的 ARM 处理器 支持 16/ 32 位的 Thumb 2 指令集, ARMv7 M仅支持 Thumb 2 指令 集, ARM Cortex-A8 处理器核支持 ARM、 Thumb 2、 Thumb EE、 Jazelle、 DSP 指令集。
第 3 章 ARM 指令系统
8) 块拷贝寻址 块拷贝寻址又称多寄存器传送指令, 用于将一块数据 (最多 16 个通用寄存器的值)从 存储器的某一位置拷贝到另 一位置。 ARM 支持堆栈和块复制两种不同的数据块操作机 制, 两者使用相同的指令, 如表 3-3 所示。
第 3 章 ARM 指令系统
第 3 章 ARM 指令系统 例 3-12 多寄存器传送指令。
第 3 章 ARM 指令系统
图 3-2 第 2 操作数的常数形式
第 3 章 ARM 指令系统
例 3-5 ADDR3, R7, #1020 ; #1020 为#immed-8r 型 的第 2 操作数。
分析: 1020 =0x3FC=0x000003FC, 1020 是0xFF 循 环右移 30 位后生成的 32 位立即数, 因此合法。
第 3 章 ARM 指令系统
① #immed-8r——常数表达式。 该常数必须对应 8 位位图, 当小于等于 255(0xFF)时, 正常使用; 当大于 255 时, 必须 是一个 8 位(小于等于 8 位有效数字)的常数通过循环右移偶数位得到。 例 3-4 逻辑与运算。AND R1, R2, #0x04800000 ; 其中此处的立即数是由0x12 循环右移 10 位得到的, 如图 3-2 所示。