下面部分将会给出使用指令的更多信息。

1.    操作对象:

一个指令操作对象可以是ARM寄存器、常量、或另一个指令具体参数。指令作用于操作对象而且通常间结果存储在目的寄存器。当在指令中有一个目的寄存器,通常在操作对象前指定。在一些指令中,操作数是灵活的,它们可以是寄存器,也可以是常量。

2.    使用PC(程序计数器)或SP(栈指针)的限制条件:

许多指令关于你是否使用PC和SP作为操作数或目的寄存器有一些限制。使用BX,BLX,LDM,LDR或POP指令写到程序计数器的任何地址Bit[0]必须是1为了正确执行,因为这一位表明需要的指令集,Cortex-M3只支持thumb指令。

3.    灵活的第二操作数:

许多通用数据处理指令有一个灵活的第二操作对象。第二操作数可以是常量、可选择偏移的寄存器。

常量,指令一个第二操作数常量以#常量 的形式,常量可以是:在一个32位字内,通过移位任意位数的8位值可以产生的任何常量;形式为0x00XY00XY的任意常量;形式为0xXY00XY00的任意常量;形式为0xXYXYXYXY的任意常量。此外,在一小部分指令中,常量可以采用更宽范围的值,那些在独自的指令描述中描述。当一个第二操作数常量用于指令MOVS,MVNS,ANDS,ORRS,ORNS,EORS,BICS,TEQ或TST时,进位的标志更新至常量的bit[31],如果常量超过255且可以由移动一个8位值得到,如果第二操作数是其他任意常量,那些指令不会影响进位标志。指令替换,汇编程序中,在指定常量不被允许的情况下,可能使用等价指令。例如,汇编程序可能汇编指令CMP Rd,#0xFFFFFFFE作为等价指令CMN Rd,#0x2。

可选择偏移的寄存器,一个第二操作数指定形式Rm{,shift}。Rm是存储第二操作数的寄存器;shift是一个对于Rm可选的偏移,它可以是      ASR#n,算术右移n位,1<=n<=32

LSL #n,逻辑左移n位,1<=n<=31  LSR#n,逻辑右移n位,1<=n<=32  ROR#n,轮流右移n位,1<=n<=31      RRX,带扩展位轮流右移1位。 如果采用移位,移位对Rm的值进行操作,操作的结果被应用于指令。但是寄存器Rm内容的值保持不变。但是用确切的指令指定一个带偏移的寄存器也会更新进位标志。

4.    移位操作

移位操作向左或向右移动指定位数、指定长度的寄存器,寄存器移位可以被执行:直接由指令ASR,LSR,LSL,ROR和RRX,结果被写入目的寄存器;通过指定移位寄存器作为第二操作对象的指令在计算第二操作数时,结果被用于指令。

被允许的移位长度由移位类型和指令决定。如果移位长度为0,则没有移位发生。寄存器移位操作除了在特殊移位长度为0时会更新进位标志。

ASR

LSR

LSL

ROR

RRX

5.    地址对齐

对齐访问是一个操作,该操作在字访问、双字访问、多字访问时的字对齐地址,或在半字访问时的半字对齐地址。字节访问总是对齐的。

Cortex-M3处理仅在一些指令中支持不对齐访问,如LDR,LDRT,LDRH,LDRHT,LDRSH,LDRSHT,STR,STRT,STRH,STRHT。

所有其它的载入和存储指令在执行一个不对齐访问时将产生一个使用错误异常,因此他们的访问必须地址对齐。

不对齐访问通常慢于对齐的访问。此外,一些内存区域不支持不对齐的访问。因此,ARM建议编程者确保地址对齐。为了避免不对齐访问意外的产生,使用在配置和控制寄存器中的UNALIGN_TRP位诱捕受限所有未对齐访问。

6.    与程序计数器相关的表达式

一个程序计数器相关的表达式或标签是一个符号,这个符号表示指令或字面数据的地址。在指令中,它表达程序计数器的值加上或减去一个数值补偿。汇编程序从当前程序的地址和标签中计算出需要的偏移。如果偏移太大,汇编将会产生一个错误。

对于B,BL,CBNZ和CBZ指令,程序计数器的值是当前指令的地址加上4字节。

对于其它使用标签的指令,程序计数器的值是当前指令加上4字节的值,并将bit[1]的结果清除为0使字对齐。

我们的汇编程序可能还允许其它关于程序计时器相关的语法指令,例如一个标签值加上减去一个数,或者[PC,#number]形式的表达式。

7.    条件执行

大多数数据处理指令通过执行的结果可以选择性的校正更新在应用程序状态寄存器中的条件标志。一些指令更新所有标志,一些只更新子集。如果一个标志没有更新,则原始值被保留。

可以基于另一个指令设置的条件标志,条件性的执行一个指令。在更新标志指令后快速执行,在任何数量的未改变变量的介入指令后。

条件执行可以用于条件分支或添加条件后缀指令。条件代码后缀允许处理器基于标志测试条件。如果一个条件指令条件测试失败,指令不会执行,不会向它的目的地址写入任何值,不会影响任何标志,不会产生任何异常。

除了条件分支的条件指令必须插入到一个if-then指令块。根据供应商,汇编程序可能自动插入一个if-then指令如果你将条件指令外置在if-then块外。

使用CBZ和CBNZ指令对比寄存器值与0和结果的分支。

条件标志,应用程序状态寄存器包含以下条件标志:N,当执行的结果是负值时,否则清除为0;Z,当执行结果为0时,负责清除为0;C,当执行结果产生一个进位时,否则清除为0;V,当操作产生溢出时,否则清除为0。

一个进位的产生的条件:一个加法的结果大于等于232;一个减法的结果小于等于0;在一个移动或逻辑指令中的一个内联桶形移位操作的结果。

溢出出现在当加、减的结果大于等于231或小于-231

大部分指令仅在S后缀指定的情况下更新状态标志。

条件代码后缀,可以有条件的指令有一个可选的条件代码,语法描述显示为{cond}。条件执行需要一个先前的if-then指令。一个有条件代码的指令仅在应用程序状态寄存器中的条件代码标志满足指定条件时才执行。

我们可以通过if-then指令使用条件执行减少代码中分支指令的数目。

1.    指令宽度选择

有许多指令可以根据指定的操作对象和目的寄存器生成16位编码或32位编码。对于这些指令中的一些,我们可以通过使用一个指令宽度后缀强制一个指定的代码大小。.W后缀强制一个32位指令编码。 .N后缀强制一个16位指令编码。

如果指定了一个指令宽度后缀,汇编不能生成要求宽度的指令编码时将会产生一个错误。

在一些情况下,指定 .W后缀是必要的。例如,如果操作对象是指令或字面数据的标签,同样对于分支指令。这是因为汇编程序不会自动生成正确大小编码。

为了使用指令宽度后缀,将它放在指令助记符和条件代码的后边。

STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(3):Cortex-M3指令描述相关推荐

  1. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(4):Cortex-M3指令分类

    1.内存访问指令 2.通用数据处理指令 3.乘除指令 4.饱和指令 SSAT和USAT 5.位域指令 6.混杂指令

  2. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(2):Cortex-M3内部函数

    ANSI 不能直接访问Cortex-M3指令.这部分描述了可以生成那些指令的内在函数,由CMSIS提供可能有编译器提供.如果C编译器不支持一个适当的内部函数,我们可能不得不使用内嵌汇编访问一些函数. ...

  3. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(1):Cortex-M3指令集概要

    处理器执行一个thumb指令集的版本.支持的指令如下:

  4. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(2):Cortex-M3处理器内存模型

    这一部分描述了处理器内存图,内存访问的行为,位带特征.处理器有一个提供了高达4GB可寻找内存的固定内存图. 内存地图分裂内存图为区域.每一个区域定义了内存的类型,一些区域还有额外的内存属性.内存的类型 ...

  5. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(1):Cortex-M3处理器程序模型

    本节介绍Cortex-M3程序模型.除了各个核心寄存器描述之外,还包括关于程序执行和堆栈的处理器模式和特权级别的信息. 处理器模式:      线程模式:用于执行应用软件. 处理模式:用于处理异常,当 ...

  6. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(5):系统滴答定时器

    处理器有一个24位系统定时器,SysTick,它可以向下计数从重载值到0,在下一个时钟边沿重载LOAD寄存器中的值,然后在随后的时钟下降计数. 当处理器停止进行调试时,计数值不再缩减. 系统滴答控制和 ...

  7. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(3):Cortex-M3处理器异常模型

    这一部分描述异常模型. 每一个异常都存在一个状态: 闲置       这个异常没有活跃,没有暂停 待进行    异常等待被处理器服务.一个外设或软件中断请求可以改变相应中断的状态到即将发生状态. ·活 ...

  8. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(3):嵌套向量中断控制器

    这一部分描述了嵌套向量中断控制器和它使用到的寄存器.NVIC支持: 高达81个中断(根据STM32设备的型号,参照数据手册): 对每个中断可编程优先级级别0-15,一个高的优先级级别相应着较低的优先级 ...

  9. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(1):关于STM32核心外设

    私有外设总线的地址地图如下: 软件可以在0xE000ED90读MPU类型寄存器,测试内存保护单元的存在. 在寄存器描述中,所需的特权给出了访问寄存器时所需的特权级别, 特权的:只有特权软件可以访问这个 ...

最新文章

  1. java语言简单代码_java语言编程如何实现一个最简单程序?
  2. boost::describe模块宏BOOST_DESCRIBE_PP_NAME的测试程序
  3. SVN基本的理解和使用
  4. SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区
  5. mybatis通用mapper_全网最全Mapper解析,附实操代码帮你更好理解
  6. Asp.net Web Api 路由 和 异常处理
  7. 单链表(链式)c/c++实现
  8. 邵国际: C 语言对象化设计实例 —— 命令解析器
  9. cdr轮廓字怎么把轮廓拆出来_教您用CDR将图片转为手绘素描效果!
  10. SwitchHosts的安装及软件使用
  11. html 苹果手机输入法,苹果手机搜狗输入法怎么计算字数?
  12. C语言基础学习——基本数据类型(float型)
  13. 基于物联网的无线温度系统在钢铁行业的应用
  14. Java实现Telegram机器人
  15. Python 矩阵顺时针逆时针旋转90度
  16. Java学习-面向对象进阶
  17. 【苹果推iMessage送】摆设overrideUserInterfaceStyle属性以使该视图及其子视图具备特定的UIUserInterfaceStyle
  18. 什么是死锁?死锁的预防?
  19. 【数据结构】广义表的存储结构及基本运算(C语言)
  20. Java多线程系列-CyclicBarrier

热门文章

  1. 关于多径效应,平坦衰落,频率选择性衰落以及瑞利衰落的理解
  2. 王树森:学 DRL 走过的弯路太多,想让大家避开
  3. Hadoop 图像小文件查重方法
  4. 为什么汉语不能用来编程?
  5. 广联达计算机图形学面试题,计算机图形学 面试题.docx
  6. wcdma系统随机接入过程的流程图_WCDMA系统随机接入过程浅析
  7. 【Java.JMS】JMS基础
  8. rust投递箱连接箱子_箱子、栈和堆
  9. iOS Password AutoFill开发指南
  10. 【C++】7-41 互评成绩(PTA)