




免费预览已结束,剩余270页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第3章Cortex M3指令系统 2 3 1指令基础3 2汇编语言3 3寻址方式3 4指令集 3 1指令基础 3 1 1程序设计语言的层次结构3 1 2指令周期和时序3 1 3程序的执行过程 3 1 1程序设计语言的层次结构 计算机程序设计语言的层次结构如图3 1所示 分为机器语言级 汇编语言级 高级语言级 机器语言是与计算机硬件最为密切的一种语言 它由微程序解释机器指令 这一级也是硬件级 是软件系统和硬件系统之间的纽带 图3 1程序设计语言的层次结构 为了提高程序设计的效率 提出了汇编语言的概念 将机器码用指令助记符表示 就比机器语言方便得多 汇编语言的编程效率和程序的可读性都有所提高 但汇编语言同机器语言非常接近 它的书写风格在很大程度上取决于特定计算机的机器指令 所以它仍然是一种面向机器的语言 3 1 1程序设计语言的层次结构 为了更好地进行程序设计 提高程序设计的效率 人们又提出了高级语言程序设计的概念 如C JAVA等 这类高级语言对问题的描述十分接近人们的习惯 并且还具有较强的通用性 这就给程序员带来极大的方便 当然这类高级语言在执行前必须转换为汇编语言或其它中间语言 最终转换为机器语言 通常有两种方法实现这个转换 编译或解释 7 3 1 1程序设计语言的层次结构 高级语言 HighLevelLanguage 面向问题的程序设计语言汇编语言 AssemblyLanguage 将机器指令用助记符号代替而形成的一种语言本质上是机器语言优势 可以直接 有效地控制计算机硬件 容易产生运行速度快 指令序列短小的高效率目标程序劣势 与处理器密切有关 需熟悉硬件和细节 编程繁琐 调试 维护 移植困难机器语言 MachineLanguage 底层的计算机语言 对应机器指令 3 1 2指令周期和时序 指令周期 InstructionCycle 微处理器执行一条指令所需要的时间 不同指令的指令周期不是等长的 如果要处理的数据在微处理器的寄存器中 则需要的时间短 如果要处理的数据在存储器或I O设备中则需要的时间长 一般情况下 以访问存储器所需最长的时间来衡量指令周期 举例 以ARM7微处理器为例 所有存储器的传输周期都可以被归结到以下四种类型之一 1 不连续周期 ARM请求传输到某个地址或者从某个地址传输 但这个地址跟前一个周期用到的地址没有联系 这种情况所需的时间称为访问一个非顺序的内存位置的周期 简称为N周期 2 连续周期 ARM请求传输到某个地址或者从某个地址传输 此地址或者同上一个周期的地址相同或者是上一个周期的地址之后一个字 这种情况所需的时间称为访问一个顺序的内存位置的周期 简称为S周期 10 3 1 2指令周期和时序 3 内部周期 ARM不请求一个传输 因为它执行一个内部功能 同时不执行有效的预取 这种情况所需的时间称为内部周期 简称为I周期 4 协处理器寄存器传输周期 ARM希望通过数据总线同协处理器通信 ARM与一个协处理器之间在数据总线 对于无缓存的ARM 或协处理器总线 对于有缓存的ARM 上写传送一个字的周期 简称C周期 3 1 2指令周期和时序 ARM指令在时序上是S N I和C周期的混合 各种类型的周期都必须至少与ARM的时钟周期一样长 对于典型的SRAM系统 所有类型的周期是最小长度 内存系统也可以伸展它们 如典型的DRAM系统伸展如下 N周期伸展为最小长度的两倍 这是因为DRAM在内存访问是非顺序时要求更长的时间 S周期通常是最小长度 但有时也会被伸展成N周期的长度 如从一个内存 行 的最后一个字移动到下一行的第一个字时 I周期和C周期总是最小长度 3 1 2指令周期和时序 例如 在8MHz的ARM微处理器中 一个S周期是125ns 而一个N周期是250ns 一个8MHz的ARM微处理器可以与一个给出125ns的N周期的RAM系统相连接 处理器的速率是8MHz只是简单的意味着如果你使任何类型的周期 在长度上小于125ns则它不保证能够工作 图3 2存储器访问时序 其中N cycle比其它的周期长 这考虑了对DRAM的访问时间 3 1 2指令周期和时序 3 1 3程序的执行过程 CPU通过数据总线 地址总线 控制总线和存储器 外部I O设备联系起来 计算机采取 存储程序与程序控制 的工作方式 即事先把程序加载到计算机的存储器中 当启动运行后 计算机会自动按照存储程序的要求进行工作 这称为程序控制 图3 3计算机程序的执行过程 3 1 3程序的执行过程 计算机执行程序是一条指令一条指令地执行 执行一条指令的过程可分为取指 译码和执行等阶段 首先 CPU进入取指阶段 通过控制总线 CB 发出读命令 并在地址总线上 AB 给出所取指令的地址 从存储器中取出的指令代码经过数据总线 DB 送到CPU的指令寄存器中 然后对该指令译码 再转入执行阶段 在这期间 CPU执行指令指定的操作 3 2ARM汇编语言 3 2 1指令和指令格式3 2 2指令的可选后缀3 2 3指令的条件执行3 2 4指令分类 3 2 1指令和指令格式 1 指令和指令系统指令 指示计算机进行某种操作的命令 指令系统 指令的集合 指令系统的功能强弱在很大程度上决定了这类计算机智能的高低 它集中地反映了微处理器的硬件功能和属性 3 2 1指令和指令格式 2 指令的表示方法从形式上看 ARM指令在机器中的表示格式是用32位的二进制数表示 如ARM中有一条指令为 ADDEQSR0 R1 8其二进制代码形式为 ARM指令代码一般可以分为5个域 第1个域是4位 31 28 的条件码域 4位条件码共有16种组合 第2个域是指令代码域 27 20 除了指令编码外 还包含几个很重要的指令特征和可选后缀的编码 第3个域是地址基址Rn 是4位 19 16 为R0 R15共16个寄存器编码 第4个域是目标或源寄存器Rd 是4位 15 12 为R0 R15共16个寄存器编码 第5个域是地址偏移或操作寄存器 操作数区 11 0 3 2 1指令和指令格式 3 汇编指令格式用助记符表示的ARM指令一般格式如下 S 格式中的内容必不可少 中的内容可省略 如是指令助记符 是必须的 而 为指令的执行条件 是可选的 缺省的情况下表示使用默认条件AL 无条件执行 3 2 1指令和指令格式 表示操作码 如ADD表示算术加法 表示指令执行的条件域 如EQ NE等 S 决定指令的执行结果是否影响APSR的值 使用该后缀则指令执行的结果影响APSR的值 否则不影响 表示目的寄存器 表示第一个操作数 为寄存器 表示第二个操作数 可以是立即数 寄存器和寄存器移位操作数 3 2 1指令和指令格式 例如 上述指令ADDEQSR0 R1 8 操作码为ADD 条件域cond为EQ S表示该指令的执行影响APSR寄存器的值 目的寄存器Rd为R0 第一个操作数寄存器Rn为R1 第二个操作数OP2为立即数 8 22 3 2 1指令和指令格式 例3 1指令格式举例 LDRR0 R1 读取R1地址上的存储单元的数据到寄存器R0BEQENDDATA 条件分支执行指令 执行条件EQ 即相等则跳转到ENDDATA处ADDSR2 R1 1 寄存器R1中的内容加1存入寄存器R2 并影响APSR寄存器的值 23 3 2 1指令和指令格式 3 2 2指令的可选后缀 1 S后缀指令中使用S后缀时 指令执行后程序状态寄存器的条件标志位将被刷新 不使用S后缀时 指令执行后程序状态寄存器的条件标志将不会发生变化 S后缀通常用于对条件进行测试 例如是否有溢出 是否进位等 根据这些变化 就可以进行一些判断 如是否大于 是否相等 从而可能影响指令执行的顺序 3 2 2指令的可选后缀 例3 2假设R0 0 x1 R3 0 x3 指令执行之前APSR nzcvqIFt SVC 分别执行如下指令APSR的值有何变化 SUBR1 R0 R3 R0的值减去R3的值 结果存入R1SUBSR1 R0 R3 R0的值减去R3的值 结果存入R1 影响标志位 分析 执行第1条指令对于标志寄存器的值没有任何影响 因此CPSR的值不变 执行第2条指令后APSR NzcvqIFt SVC 因为R0的值减去R3值 结果变成了一个负数 故而N被置位了 2 后缀如果指令地址表达式中不含 后缀 则基址寄存器中的地址值不会发生变化 指令中的地址表达式中含有 后缀时 指令执行后 基址寄存器中的地址值将发生变化 变化的结果如下 基址寄存器中的值 指令执行后 指令执行前的值 地址偏移量 3 2 2指令的可选后缀 3 2 2指令的可选后缀 例3 3分别执行下面两条指令有何区别 LDRR3 R0 4 LDRR3 R0 4 分析 在上述指令中 第1条指令没有后缀 指令的结果是把R0加4作为地址指针 把这个指针所指向的地址单元所存储的数据读入R3 R0的值不变 第2条指令除了实现以上操作外 还把R0 4的结果送到R0中 3 2 2指令的可选后缀 使用 后缀需要注意如下事项 1 后缀必须紧跟在地址表达式后面 而地址表达式要有明确的地址偏移量 2 后缀不能用于R15 PC 的后面 3 当用在单个地址寄存器后面时 必须确信这个寄存器有隐性的偏移量 例如 STMDBR1 R3 R5 R7 此时地址基址寄存器R1的隐性偏移量是4 3 2 3指令的条件执行 程序要执行的指令 均保存在存储器中 当计算机需要执行一条指令时 首先产生这条指令的地址 并根据地址号打开相应的存储单元 取出指令代码 CPU根据指令代码的要求以及指令中的操作数 去执行相应的操作 表3 2指令的条件码 3 2 3指令的条件执行 例3 4下面三条指令有何区别 ADDR4 R3 1ADDEQR4 R3 1ADDSR4 R3 1分析 第1条指令不带条件标志 无条件AL 指令的执行不受条件标志位的影响 完成加法运算 将R3的值加1存入寄存器R4 第2条ADD指令加上后缀EQ变为ADDEQ表示 相等则相加 即当APSR中的Z标志置位时该指令执行 否则不执行 第3条指令的执行也不受条件标志的影响 但是由于附带了后缀S 这条指令执行的结果将影响APSR中条件标志位的值 3 2 3指令的条件执行 条件后缀只是影响指令是否执行 不影响指令的内容 如上述ADDEQ指令 可选后缀EQ并不影响本指令的内容 它执行时仍然是一条加法指令 3 2 3指令的条件执行 条件后缀和S后缀的关系如下 1 如果既有条件后缀又有S后缀 则书写时S排在后面 如 ADDEQSR1 R0 R2该指令在Z 1时执行 将R0 R2的值放入R1 同时刷新条件标志位 2 条件后缀是要测试条件标志位 而S后缀是要刷新条件标志位 3 条件后缀要测试的是执行前的标志位 而S后缀是依据指令的结果改变条件标志 3 2 3指令的条件执行 3 2 4ARM指令分类 ARM微处理器的指令集是加载 存储型的 即指令集中的大部分指令仅能处理寄存器中的数据 而且处理结果都要放回寄存器 而对系统存储器的访问则需要通过专门的加载 存储指令来完成 ARM微处理器的指令集可以分为数据处理指令 数据加载与存储指令 分支指令 程序状态寄存器 PSR 处理指令 协处理器指令和异常产生指令等 统一汇编语言书写语法ARM汇编器引了一个 统一汇编语言 UAL 语法机制 对于16位指令和32位指令 汇编器允许开发者统一使用32位Thumb 2指令的语法格式书写 很多Thumb 2指令的用法也与32位ARM指令相同 并且由汇编器来决定是使用16位指令 还是使用32位指令 以前 Thumb的语法和ARM的语法不同 在有了UAL之后 两者的书写格式就统一了 35 例如 ADDR0 R1 使用传统的Thumb语法ADDR0 R0 R1 引入UAL后允许的等效写法 R0 R0 R1 36 注意问题 虽然引入了UAL 但是仍然允许使用传统的Thumb语法 如果使用传统的Thumb语法 有些指令会默认地更新APSR 即使没有加上S后缀 如果使用UAL语法 则必须指定S后缀才会更新 绝大多数16位指令只能访问R0 R7 32位Thumb 2指令则可以随意访问R0 R15 在Thumb 2指令集中 有些操作既可以由16位指令完成 也可以由32位指令完成 在UAL下 汇编器能主动决定用哪个 也可以手工指定是用16位的还是32位的 37 例如 ADDSR0 1 汇编器将为了节省空间而使用16位指令ADDS NR0 1 指定使用16位指令 N Narrow ADDS WR0 1 指定使用32位指令 W Wide W后缀指定32位指令 如果没有给出后缀 汇编器会先试着用16位指令以给代码瘦身 如果不行再使用32位指令 N后缀指定16位指令 其实是多此一举 不过汇编器可能仍然允许这样的语法 38 3 3指令的寻址方式 3 3 1立即数寻址3 3 2寄存器寻址3 3 3寄存器间接寻址3 3 4寄存器移位寻址3 3 5基址变址寻址3 3 6多寄存器寻址3 3 7相对寻址3 3 8堆栈寻址 3 3 1立即数寻址 立即数寻址也叫立即寻址 操作数本身就在指令中给出 取出指令也就取到了操作数 这个操作数被称为立即数 对应的寻址方式也就叫做立即寻址例3 5MOVR0 15此指令是将立即数15传送到R0中 该指令的机器编码为E3A0000FH 由指令编码中0 x00F即可得到一个32位的立即0 x0000000FH 这个数再送入R0 立即数要求以 为前缀 对于以十六进制表示的立即数 还要求在 后加上 0 x 或 对于以二进制表示的立即数 要求在 后加上 0b 对于以十进制表示的立即数 要求在 后加上 0d 或缺省 3 3 1立即数寻址 3 3 2寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数 这种寻址方式是各类微处理器经常采用的一种方式 也是一种执行效率较高的寻址方式 例3 6ADDR0 R1 R2 R0 R1 R2 3 3 3寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址 而操作数本身存放在存储器中 例3 7LDRR0 R4 R0 R4 3 3 4寄存器移位寻址 寄存器移位寻址的操作数由寄存器中的数值做相应移位而得到 例3 8ADDR0 R1 R2 LSL 1MOVR0 R1 LSLR3 3 3 5基址变址寻址 基址变址寻址就是将寄存器 该寄存器一般称作基址寄存器 的内容与指令中给出的地址偏移量相加 从而得到一个操作数的有效地址 例3 9LDRR0 R1 4 R0 R1 4 LDRR0 R1 4 R0 R1 4 R1 R1 4LDRR0 R1 4 R0 R1 R1 R1 4LDRR0 R1 R2 R0 R1 R2 3 3 6多寄存器寻址 采用多寄存器寻址方式 一条指令可以完成多个寄存器值的传送 这种寻址方式中用一条指令最多可传送16个通用寄存器的值 连续的寄存器间用 连接 否则用 分隔 例3 10LDMIAR0 R1 R4 R1 R0 R2 R0 4 R3 R0 8 R4 R0 12 指令执行后内存和寄存器值 指令执行前内存和寄存器值 3 3 6多寄存器寻址 3 3 7相对寻址 与基址变址寻址方式相类似 相对寻址以程序计数器PC的当前值为基地址 指令中的地址标号作为偏移量 将两者相加之后得到操作数的有效地址 以下程序段完成子程序的调用 分支指令BL采用了相对寻址方式 BLproc 跳转到子程序proc处执行 procMOVR0 1 3 3 8堆栈寻址 堆栈是一种数据结构 按后进先出 LastInFirstOut LIFO 的方式工作 使用一个称作堆栈指针的专用寄存器指示当前的操作位置 堆栈指针总是指向栈顶 采用POP操作 出栈 和PUSH操作 进栈 R13作为堆栈指针 数据传送数据处理子程呼叫与无条件跳转指令标志位与条件转移指令隔离 barrier 指令和存储器隔离指令饱和运算其他指令 50 3 4指令集 CM3中的数据传送类型包括 寄存器间数据传送 寄存器与存储器间数据传送堆栈操作指令 寄存器与特殊功能寄存器间数据传送 立即数加载到寄存器 51 3 4指令集 数据传送 寄存器间数据传送用于在寄存器间传送数据的指令是MOV 例如 MOVR8 R3 要把R3的数据传送给R8MOV的一个衍生物是MVN 它把寄存器的内容取反后再传送 52 3 4指令集 数据传送 1 MOV指令汇编格式 MOV S Rd operand2功能 MOV指令将源操作数operand2传送到目的寄存器Rd中 通常operand2是一个立即数 寄存器Rm或被移位的寄存器 S选项决定指令的操作是否影响CPSR中条件标志位的值 有S时指令执行后的结果影响CPSR中条件标志位N和Z值 在计算第2操作数时更新标志C 不影响V标志 例3 12MOV指令示例 MOVR1 R0 将寄存器R0的值传送到寄存器R1MOVPC R14 将寄存器R14的值传送到PC 常用于子程序返回MOVR1 R0 LSL 3 将寄存器R0的值左移3位后传送到R1MOVR0 5 将立即数5传送到寄存器R0 2 MVN指令汇编格式 MVN S Rd operand2功能 MVN指令可完成从另一个寄存器 被移位的寄存器或将一个立即数传送到目的寄存器Rd 与MOV指令不同之处是 数据在传送之前被按位取反了 即把一个被取反的值传送到目的寄存器中 S选项决定指令的操作是否影响CPSR中条件标志位的值 有S时指令执行后的结果影响CPSR中条件标志位N和Z值 在计算第2操作数时更新标志C 不影响V标志 例3 13MVN指令示例 MVNR0 0 将立即数0取反传送到寄存器R0中 完成后R0 1MVNR1 R2 将R2取反 结果存到R1中 56 寄存器与存储器间数据传送用于访问存储器的基础指令是 加载 Load 和 存储 Store 加载指令LDR 把存储器中的内容加载到寄存器中 存储指令STR 把寄存器的内容存储至存储器中 传送过程中数据类型也可以变通 57 3 4指令集 数据传送 寄存器与存储器间数据传送 58 3 4指令集 数据传送 寄存器与存储器间数据传送可以使用LDMxy STMxy 一次传输更多数据 X 可以为I或D I表示自增 D表示自减Y 可以为A或B A表示自增减的时机在每次访问后 B表示自增减的时机在每次访问前 59 3 4指令集 数据传送 寄存器与存储器间数据传送 60 3 4指令集 数据传送 增 减单位 字 4字节 寄存器与存储器间数据传送 带预索引 Pre indexing 例如 LDR WR0 R1 20 预索引该指令先把地址R1 offset处的值加载到R0 然后 R1 R1 20 offset也可以是负数 这里的 的作用在传送后更新基址寄存器R1的值 是可选的 如果没有 则该指令就是普通的带偏移量加载指令 不会自动调整R1的值 带预索引的数据传送可以用在多种数据类型上 并且既可用于加载 又可用于存储 61 3 4指令集 数据传送 寄存器与存储器间数据传送 62 3 4指令集 数据传送 预索引数据传送的常见用法 寄存器与存储器间数据传送 后索引 Post indexing 后索引也要使用一个立即数offset 但与预索引不同的是 后索引忠实地使用基址寄存器Rd的值 把它作为传送的目的地址 待到数据传送后 再执行Rd Rd offset offset可以是负数 63 3 4指令集 数据传送 寄存器与存储器间数据传送 后索引 Post indexing 如 STR WR0 R1 12 后索引该指令是把R0的值存储到地址R1处的 在存储完毕后 R1 R1 12 注意 R1 后面是没有 的 在后索引中 基址寄存器是无条件被更新 64 3 4指令集 数据传送 寄存器与存储器间数据传送 65 3 4指令集 数据传送 后索引数据传送的常见用法 数据加载与存储指令 ARM处理器是加载 存储体系结构的处理器 对存储器的访问只能通过加载和存储指令实现 1 数据加载与存储的方向问题数据加载与存储 Load store 指令用于在存储器和处理器的寄存器之间传送数据 如图所示 Load用于把内存中的数据装载到寄存器中 而Store则用于把寄存器中的数据存入内存 数据加载与存储指令有两种类型 单寄存器加载与存储指令 多寄存器加载与存储指令 2 数据加载与存储指令的寻址数据加载与存储类指令的基本格式为opcode Rd addr格式中opcode为指令代码 如LDR表示将存储器中的数据加载到寄存器中 addr为存储器的地址表达式 也称为第2操作数 可表示为 Rn offset 其中Rn表示基址寄存器 offset表示偏移量 Addr有如下几种表示形式 1 立即数立即数可以是一个无符号的数值 这个数值可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR5 R6 0 x08 STRR6 R7 0 x08 2 寄存器寄存器中的数值可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR5 R6 R3 STRR6 R7 R8 3 寄存器移位这种格式由一个通用寄存器和一个立即数组成 寄存器中的数值可以根据指令中的移位标志以及移位常数作一定的移位操作 生成一个地址偏移量 这个地址偏移量可以加到基址寄存器 也可以从基址寄存器中减去这个数值 如 LDRR3 R2 R4 LSL 2 LDRR3 R2 R4 LSR 3 4 标号这是一种简单的寻址方法 在这种方法中 程序计数器PC是隐含的基址寄存器 偏移量是语句标号所在的地址和PC 当前正在执行的指令 之间的差值 例如 LDRR4 START 3 地址索引ARM指令中的地址索引也是指令的一个功能 索引作为指令的一部分 它影响指令的执行结果 地址索引分为前索引 Pre indexed 自动索引 Auto indexed 后索引 Post indexed 1 前索引前索引也称为前变址 这种索引是在指令执行前把偏移量和基址相加 减 得到的值作为寻址的地址 例如 LDRR5 R6 0 x04 STRR0 R5 R8 在上述第1条指令中 在寻址前先把R6加上偏移量4 作为寻址的地址值 在第2条指令中 在寻址前先把基址R5和偏移量R8相减 以计算的结果作为地址值 在这两条指令中 指令完成后 基址寄存器的地址值和指令执行前相同 并不发生变化 2 自动索引自动索引也称为自动变址 有时为了修改基址寄存器的内容 使之指向数据传送地址 可使用这种方法自动修改基址寄存器 例如 LDRR5 R6 0 x04 这条指令在寻址前先把R6加上偏移量4 作为寻址的地址值 通过可选后缀 完成基址寄存器的更新 本例中执行完操作后R6 基址寄存器 的内容加4 3 后索引后索引也称为后变址 后索引就是用基址寄存器的地址值寻址 找出操作数进行操作 操作完成后 再把地址偏移量和基址相加 减 结果送到基址寄存器 作为下一次寻址的基址 例如 LDRR5 R6 0 x04STRR6 R7 0 x08在上述指令中 先把R6指向的地址单元的数据赋给R5 再把偏移量4加到基址寄存器R6中去 在第2条指令中 先把R6的值存储到R7指向的地址单元中去 再把偏移量 8加到R7上 在后索引中 基址在指令的执行前后是不相同的 4 不同索引方式的区别前索引和自动索引的区别是 前索引方式利用对基址寄存器的改变值进行寻址 但是基址寄存器在操作之后仍然保持原值 自动索引在计算出新的地址后要用新的地址更新基址寄存器的内容 然后再利用新的基址寄存器进行寻址 前索引和后索引的区别 前索引在指令执行完成后并没有改变基址寄存器的值 后索引在指令执行完成后改变了基址寄存器的地址值 后索引和自动索引的区别 后索引和自动索引类似 也要更新基址寄存器的内容 但是后索引先利用基址寄存器的原值进行寻址操作 然后再更新基址寄存器 这两种方式在遍历数组时是很有用的 单寄存器加载与存储指令 用于把单一的数据传入或者传出一个寄存器 支持的数据类型有字 32位 半字 16位 和字节 常用的单寄存器加载与存储指令包括 LDR STR字数据加载 存储指令LDRB STRB字节数据加载 存储指令LDRH STRH半字数据加载 存储指令LDRSB LDRSH有符号数字节 半字加载指令 1 LDR STR字数据加载 存储指令LDR STR指令的格式和功能如下 机器编码格式 LDR STR指令的机器编码格式如图所示 其中 cond 指令执行的条件编码I P U W 用于区别不同的地址模式 偏移量 I为0时 偏移量为12位立即数 I为1时 偏移量为寄存器移位 P表示前 后索引 U表示加 减 W表示回写 图3 19LDR STR指令的机器编码格式 L L为1表示加载 L为0表示存储 B B为1表示字节访问 B为0表示字访问Rd 源 目标寄存器Rn 基址寄存器addr mode 表示偏移量 是一个12位的无符号二进制数 与Rn一起构成地址addr 汇编格式 LDR Rd addr功能 LDR指令用于从存储器中将一个32位的字数据加载到目的寄存器Rd中 该指令通常用于从存储器中读取32位的字数据到通用寄存器 然后对数据进行处理 当程序计数器PC作为目的寄存器时 指令从存储器中读取的字数据被当作目的地址 从而可以实现程序流程的跳转 例3 41LDR指令示例 使用标号LDRR4 START 将存储地址为START的字数据读入R4STRR5 DATA1 将R5存入存储地址为DATA1中 前索引LDRR0 R1 将存储器地址为R1的字数据读入寄存器R0 LDRR0 R1 R2 将存储器地址为R1 R2的字数据读入寄存器R0 LDRR0 R1 8 将存储器地址为R1 8的字数据读入寄存器R0 LDRR0 R1 R2 LSL 2 将存储器地址为R1 R2 4的字数据读入寄存器R0 自动索引STRR0 R1 R2 将R0字数据存入存储器地址为R1 R2的存储单元 中 并将新地址R1 R2写入R1 STRR0 R1 8 将R0字数据存入存储器地址为R1 8的存储单元中 并将新地址R1 8写入R1STRR0 R1 R2 LSL 2 将R0字数据存入地址为R1 R2 4的存储单元中 并将新地址R1 R2 4写入R1 后索引LDRR0 R1 8 将存储器地址为R1的字数据读入寄存器R0 并将新地址R1 8写入R1LDRR0 R1 R2 将存储器地址为R1的字数据读入寄存器R0 并将新地址R1 R2写入R1 LDRR0 R1 R2 LSL 2 将存储器地址为R1的字数据读入寄存器R0 并将新地址R1 R2 4写入R1 注意事项 1 立即数的规定立即数绝对值不大于4095的数值 可使用带符号数 即在 4095 4095之间 2 标号使用的限制要注意语句标号不能指向程序存储器的程序存储区 而是指向程序存储器的数据存储区或数据存储器的数据存储区 另外指向的区域是可修改的 3 地址对齐字传送时 偏移量必须保证偏移的结果能够使地址对齐 4 使用移位时需注意使用寄存器移位的方法计算偏移量时 移位的位数不能超过规定的数值 各类移位指令的移位位数规定如下 ASR n 算术右移 1 n 32 LSL n 逻辑左移 0 n 31 LSR n 逻辑右移 1 n 32 ROR n 循环右移 1 n 31 5 注意程序计数器R15R15作为基址寄存器Rn时 不可以使用回写功能 即使用后缀 另外 R15不可作为偏移寄存器使用 87 例3 42指令的正误LDRR1 R2 R5 正确STRR2 R3 0 xFFFF8 错误 超出了立即数的范围STREQR4 R0 R4 LSLR5 错误 不能用寄存器表示移位的位数LDRR4 R0 R1 LSL 32 错误 超出了移位的范围STREQR3 R6 0 x08 正确LDRR0 R2 R6 错误 后索引不用 后缀LDRR4 START 正确LDRR1 SP 0 x04 正确STRR1 START 格式正确 但必须保证标号处可以存储数据LDRPC R6 错误 R6不表示一个存储地址LDRPC R6 正确LDRR1 R3 R15 错误 R15不可作为偏移寄存器 2 LDRB STRB字节数据加载 存储指令汇编格式 LDRB STRB Rd addr功能 LDRB指令用于从存储器中将一个8位的字节数据加载到目的寄存器中 同时将寄存器的高24位清零 该指令通常用于从存储器中读取8位的字节数据到通用寄存器 然后对数据进行处理 当程序计数器PC作为目的寄存器时 指令从存储器中读取的字数据被当作目的地址 从而可以实现程序流程的跳转 STRB指令用于从源寄存器中将一个8位的字节数据存储到存储器中 该字节数据为源寄存器中的低8位 STRB指令和LDRB指令的区别在于数据的传送方向 必须明确的是 即使传送的是8位数据 地址总线仍然以32位的宽度工作 而数据总线也是以32位的宽度工作 传送16位的半字数据 地址总线和数据总线也是以32位的宽度工作的 90 1 从寄存器存储到存储器的过程由于寄存器中的数据是32位结构 在向存储器存储8位字节时 怎样去选择寄存器中4个字节中的一个字节呢 在ARM指令中 从寄存器到存储器的一字节数据存储只能传送最低8位 即最低字节 7 0 如果想要存储其它字节 可以采用移位的方法把要存储的字节移至最低字节 从寄存器到存储器的8位字节传送如图3 20所示 图3 20字节存储 2 从存储器到寄存器的加载过程和上述不同的是 在实现从存储器到寄存器的加载过程时 可以选择任何一个存储器的地址单元 这时是不要求地址对齐的 也就是说 可以不加限制地选择任何存储器中的字节加载 从存储器到寄存器的8位字节传送如图3 21所示 图3 21字节加载 例3 43LDRB STRB指令示例 LDRBR0 R1 将存储器地址为R1的字节数据读入寄存器 R0 并将R0的高24位清零 LDRBR0 R1 8 将存储器地址为R1 8的字节数据 读入寄存器R0 并将R0的高24位清零 STRBR0 R1 将寄存器R0中的字节数据写入以R1 为地址的存储器中 STRBR0 R1 8 将寄存器R0中的字节数据写入 以R1 8为地址的存储器中 93 3 LDRH STRH半字数据加载 存储指令汇编格式 LDRH STRH Rd addr功能 LDRH指令用于从存储器中将一个16位的半字数据加载到目的寄存器Rd中 同时将寄存器的高16位清零 该指令通常用于从存储器中读取16位的半字数据到通用寄存器 然后对数据进行处理 当程序计数器PC作为目的寄存器时 指令从存储器中读取的字数据被当作目的地址 从而可以实现程序流程的跳转 例3 44LDRH STRH指令示例 LDRHR0 R1 将存储器地址为R1的半字数据读入 寄存器R0 并将R0的高16位清零 LDRHR0 R1 8 将存储器地址为R1 8的半字数据 读入寄存器R0 并将R0的高16位清零 LDRHR0 R1 R2 将存储器地址为R1 R2的半字数据 读入寄存器R0 并将R0的高16位清零 STRHR0 R1 将寄存器R0中的半字数据写入以R1为地址的存储器中 使用半字加载 存储指令需要注意如下事项 1 必须半字地址对齐 2 对于R15的使用需要慎重 R15作为基址寄存器Rn时 不可以使用回写功能 3 立即数偏移使用的是8位无符号数 4 不能使用寄存器移位寻址 96 4 LDRSB LDRSH有符号数字节 半字加载指令汇编格式 LDRSB LDRSH Rd addr功能 LDRSB指令用于从存储器中将一个8位的字节数据加载到目的寄存器中 同时将寄存器的高24位设置为该字节数据的符号位的值 即将该8位字节数据进行符号位扩展 生成32位数据 LDRSH指令用于从存储器中将一个16位的半字数据加载到目的寄存器Rd中 同时将寄存器的高16位设置为该字数据的符号位的值 即将该16位字数据进行符号位扩展 生成32位数据 例3 45LDRSB LDRSH指令示例LDRSBR0 R1 4 将存储地址为R1 4的有符号字节数据 读入R0 R0中的高24位设置成该字节数据的符号位 LDRSHR6 R2 2 将存储地址为R2的有符号半字数据 读入R6 R6中的高16位设置成该字节数据的符号位 R2 R2 2 98 多寄存器加载与存储指令多寄存器加载与存储指令也称为批量数据加载 存储指令 ARM微处理器所支持批量数据加载 存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据 批量加载指令用于将一片连续的存储器中的数据加载到多个寄存器 批量数据存储指令则完成相反的操作 多寄存器加载与存储指令在数据块操作 上下文切换 堆栈操作等方面 比单寄存器加载与存储指令会有更高的执行效率 常用的加载存储指令有LDM和STM指令 1 LDM STM批量数据加载 存储指令机器编码格式 LDM STM指令的机器编码格式如图3 23所示 图中各位的含义如下 cond 指令执行的条件编码P U W 用于区别不同的地址模式 偏移量 P表示前 后变址 U表示加 减 W表示回写 S 用于区别有符号访问 S为1 和无符号访问 S为0 L L为1表示加载 L为0表示存储 Rn 基址寄存器regs 表示寄存器列表 100 图3 23LDM STM指令的编码格式 汇编格式 LDM STM Rn 功能 LDM指令用于从基址寄存器所指示的一片连续存储器中读取数据到寄存器列表所指示的多个寄存器中 内存单元的起始地址为基址寄存器Rn的值 各个寄存器由寄存器列表regs表示 该指令一般用于多个寄存器数据的出栈操作 STM指令用于将寄存器列表所指示的多个寄存器中的值存入到由基址寄存器所指示的一片连续存储器中 内存单元的起始地址为基址寄存器Rn的值 各个寄存器由寄存器列表regs表示 指令的其它参数的用法和LDM指令是相同的 该指令可用于多个寄存器数据的进栈操作 指令中 type表示类型 用于数据的存储与读取有以下几种情况 IA每次传送后地址值加IB每次传送前地址值加DA每次传送后地址值减DB每次传送前地址值减 102 为可选后缀 若选用该后缀 则当数据加载与存储完毕之后 将最后的地址写入基址寄存器 否则基址寄存器的内容不改变 基址寄存器不允许为R15 寄存器列表可以为R0 R15的任意组合 LDM STM指令寻址的区别图3 24给出了数据块操作的用法 从图中可以看出 每条指令是如何将4个寄存器的数据存入存储器的 以及在使用自动变址的情况下基址寄存器是如何变化的 执行指令之前基址寄存器为R0 自动变址之后为R0 需要注意的是 在递增方式下 即图中的IA IB方式 寄存器存储的顺序是R1 R2 R3 R4 而在递减方式下 即图中的DA DB方式 寄存器存储的顺序是R4 R3 R2 R1 105 图3 24STM各种寻址后缀的区别 例3 46设执行前 R0 0 x00090010 R6 R7 R8 0 x00000000 存储器地址为0 x00090010存储的内容如图3 25所示 则分别执行指令LDMIAR0 R6 R8 LDMIBR0 R6 R8 各相关寄存器值的变化分别如何 图3 25指令执行前 107 图3 26LDMIA指令执行后 指令LDMIBR0 R6 R8 的执行过程如下 以R0的值加4 0 x00090014 为基址取出一个32位数据 0 x00000002 放入寄存器R6 然后将地址值 0 x00090014 写回到R0 继续取出一个32位数据放入R7 依次类推 最后LDMIBR0 R6 R8 指令执行完后各寄存器的值如图3 27所示 图3 27LDMIB指令执行后 通过以上例子可以比较出IA和IB的区别 IA是每次取值后增加地址值 IB是每次地址值增加后再取值 同理可以得出DA和DB的区别 只不过此时地址值不是做加法 是做减法而已 109 堆栈操作指令PUSH POP作为堆栈专用操作 也属于数据传送指令类 PUSH cond reglistPOP cond reglistReglist为非空寄存器列表 110 3 4指令集 数据传送 111 1 堆栈堆栈就是在RAM存储器中开辟 指定 的一个特定的存储区域 在这个区域中 信息的存入 此时称为推入 与取出 此时称为弹出 的原则不再是 随机存取 而是按照 后进先出 的原则进行存取 图3 28堆栈结构示意图 堆栈的一端是固定的 另一端是浮动的 堆栈固定端是堆栈的底部 称为栈底 堆栈浮动端可以推入或弹出数据 向堆栈推入数据时 新推入的数据堆放在以前推入数据的上面 而最先推入的数据被推至堆栈底部 最后推入的数据堆放在堆栈顶部 这称为栈顶 从堆栈弹出数据时 堆栈顶部数据最先弹出 而最先推入的数据则是最后弹出 由于堆栈顶部是浮动的 为了指示现在堆栈中存放数据的位置 通常设置一个堆栈指针SP R13 它始终指向堆栈的顶部 这样 堆栈中数据的进出都由SP来 指挥 当一个数据 32位 推入堆栈时 SP R13的值减4 向下浮动指向下一个地址 即新的栈顶 当数据从堆栈中弹出时 SP R13的值加4 向上浮动指向新的栈顶 114 FD满递减堆栈 ED空递减堆栈 FA满递增堆栈 EA空递增堆栈在使用一个堆栈的时候 需要确定堆栈在存储器空间中是向上生长还是向下生长的 向上称为递增 Ascending 向下称为递减 Descending 满堆栈 Fullstack 是指堆栈指针SP R13 指向堆栈的最后一个已使用的地址或满位置 也就是SP指向堆栈的最后一个数据项的位置 相反 空堆栈 Emptystack 是指SP指向堆栈的第一个没有使用的地址或空位置 115 2 堆栈操作堆栈的操作包括建栈 进栈 出栈三种基本操作 1 建栈建栈就是规定堆栈底部在RAM存储器中的位置 如 用户可以通过LDR命令设置SP的值来建立堆栈 LDRR13 0 x90010LDRSP 0 x90010这时 SP指向地址0 x90010 栈中无数据 堆栈的底部与顶部是重叠 是一个空栈 2 进栈 出栈M 3体系结构中使用POP操作 出栈 和PUSH操作 进栈 进栈或出栈操作都是以字 32位 为单位的 117 堆栈操作指令 R0 X R1 Y R2 ZBLFx1Fx1PUSH R0 把R0存入栈回到主程序 R0 X R1 Y R2 Z 调用Fx1的前后R0 R2的值完好无损 从寄存器上下文来看 就好像什么都没发生过一样 118 堆栈操作指令举例 PUSH R0 R2 压入R0 R2PUSH R3 R5 R8 R12 压入R3 R5 R8 以及R12在POP时 可以如下操作 POP R3 R5 R8 R12 弹出R3 R5 R8 以及R12POP R0 R2 弹出R0 R2注意 在寄存器列表中 不管寄存器的序号是以什么顺序给出的 汇编器都将把它们升序排序 然后先push序号大的寄存器 所以也就先pop序号小的寄存器 119 例3 47下列指令说明了进栈和出栈的过程 设指令执行之前SP 0 x00090010 R13 R4 0 x00000003 R3 0 x00000002 R2 0 x00000001 将R2 R4入栈 然后出栈 注意进栈和出栈后SP的值 PUSH R2 R4 POP R6 R8 分析 第一条指令将R2 R4的数据入栈 指令执行前SP的值为0 x00090010 指令执行时SP指向下一个地址 SP 4 存放R4 然后依次存放R3 R2 数据入栈后SP的值为0 x00090004 指向堆栈的满位置 如果有数据继续入栈则下一地址为0 x90000 其过程如图3 29所示 注意入栈的顺序 第二条指令实现退栈操作 在第一条指令的基础上 表示将刚才入栈的数据分别退栈到R6 R8 退栈后SP指向0 x00090010 图3 29进栈操作 122 寄存器与特殊功能寄存器间数据传送MRS MSR 专门用于访问特殊功能寄存器 必须在特权级下才允许访问 以免系统因误操作或恶意破坏而功能紊乱 APSR却允许在用户级下访问 MRS 读特殊功能寄存器的值到通用寄存器MSR 写通用寄存器的值到特殊功能寄存器 123 3 4指令集 数据传送 寄存器与特殊功能寄存器间数据传送举例 MRSR0 BASEPRI 读取BASEPRI到R0中MRSR0 FAULTMASK 似上MRSR0 PRIMASK 似上MSRBASEPRI R0 写入R0到BASEPRI中MSRFAULTMASK R0 似上MSRPRIMASK R0 似上 124 3 4指令集 数据传送 立即数加载到寄存器16位指令MOV支持8位立即数加载 如 MOVR0 0 x1232位指令MOVW和MOVT可以支持16位立即数加载 MOVW 把16位立即数放到寄存器的低16位 高16位清0 MOVT 把16位立即数放到寄存器的高16位 低16位不影响 通过组合使用MOVW和MOVT就能产生32位立即数 但是要注意 必须先使用MOVW 再使用MOVT 125 3 4指令集 数据传送 常见的算术四则运算指令常用逻辑操作指令移位和循环指令符号扩展指令数据序翻转指令 126 3 4指令集 数据处理 常见的算术四则运算指令 127 3 2指令集 数据处理 常见的算术四则运算指令 64位乘法指令 128 3 2指令集 数据处理 ARM中的算术指令主要指加法和减法 这些指令主要实现两个32位数据的加减操作 该类指令常常和桶形移位器结合起来 获得许多灵活的功能 算术指令主要包括 ADD加法指令ADC带进位加法指令SUB减法指令SBC带借位减法指令RSB逆向减法指令RSC带借位的逆向减法指令 1 ADD加法指令汇编格式 ADD S Rd Rn operand2功能 ADD指令用于把寄存器Rn的值和操作数operand2相加 并将结果存放到Rd寄存器中 即Rd Rn operand2 其中Rd为目的寄存器 Rn为操作数1 要求是一个寄存器 operand2是操作数2 可以是一个寄存器 被移位的寄存器 或一个立即数 S选项决定指令的操作是否影响APSR中条件标志位的值 有S时指令执行后的结果影响APSR中条件标志位N Z C V标志 例3 20ADD指令示例 ADDR0 R1 R2 R0 R1 R2ADDR0 R1 5 R0 R1 5ADDR0 R1 R2 LSL 2 R0 R1 R2左移2位 1 立即数控制的寄存器移位表达式立即数控制方式就是寄存器Rm移位的位数由一个数值常量来控制 例如 ADDR0 R1 R2 LSL 2 R0 R1 R2左移2位 在这个表达式中 对R2中的数据逻辑左移2位 然后和R1相加 其结果放入寄存器R0中 2 寄存器控制的寄存器移位方式寄存器控制方式就是寄存器Rm移位的位数由另一个寄存器Rs来控制 Rs是通用寄存器 但不可使用R15 程序计数器 例如 ADDR0 R1 R2 LSLR3假设R3的值为3 则在这个表达式中表示对R2中的数据逻辑左移3位 然后和R1相加 其结果放入寄存器R0中 133 3 数字常量表达式数字常量表达式可以简单到一个立即数 还可以使用单目操作符 双目操作符 逻辑操作符和算术操作符等 各种操作符将在第4章介绍 这里仅举例说明 0 x88 立即数 0 x40 0 x20 使用加法 0 x40 0 x20 4 使用加减乘除算术运算 0 x80 ROR 02 使用移位操作 循环右移2位 2 11010010 使用二进制 0 xFF MOD 08 取模操作 0 xFF0000 AND 660000 逻辑操作 两数相与 2 ADC带进位加法指令汇编格式 ADC S Rd Rn oper
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国木质建材行业市场调查研究及发展战略研究报告
- 2025年 贵州公务员考试笔试试题附答案
- 糯米白醋王行业深度研究分析报告(2024-2030版)
- 2025年 东阳市市级机关遴选考试笔试试题附答案
- 中国电阻网络行业市场深度评估及投资策略咨询报告
- 农业种植项目可行性报告
- 2025年中国晶振膜厚控制仪行业市场发展前景及发展趋势与投资战略研究报告
- 管道燃气安全评估报告
- 2025年中国丁腈橡胶混炼胶行业市场发展前景及发展趋势与投资战略研究报告
- 中国健康服务产业园区市场深度分析及投资战略咨询报告
- 2024年西昌市教育和体育局考核聘用公立幼儿园教师真题
- 2025年全国高考数学真题全国2卷
- 2025年衣物清洁多元化发展趋势白皮书-天猫家清第一财经商业数据中心
- 冷链物流园建设项目投融资与财务方案
- 保险业务员分级考试试题及答案
- 2024统编版七年级道德与法治下册期末测试卷(含答案)
- 酒店经销商合同协议书
- 某市人民医院装修工程项目可行性研究报告
- 【滇人版】《信息技术》四年级第4册 第1课《搜索引擎》课件
- 2025年中考生物模拟测试卷及答案
- 国开《理工英语1》形考任务综合测试
评论
0/150
提交评论