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

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

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后缀是必要的。例如,如果操作对象是指令或字面数据的标签,同样对于分支指令。这是因为汇编程序不会自动生成正确大小编码。

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值