嵌入式知识要点arm02tts了解指令的分类和条件码_第1页
嵌入式知识要点arm02tts了解指令的分类和条件码_第2页
嵌入式知识要点arm02tts了解指令的分类和条件码_第3页
嵌入式知识要点arm02tts了解指令的分类和条件码_第4页
嵌入式知识要点arm02tts了解指令的分类和条件码_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

知识点列 ARM指令的分 ARM分支跳转指 跳转指令B及带连接的跳转指令 带状态切换的跳转指令 带状态切换的连接跳转指令 带状态切换的连接跳转指令 ARM数据处理指 数据处理指令编码格 数据处理指令的基本语法格式和寻址方 数据传送指 算术运算指 逻辑运算指 比较测试指 ARM加载指 单寄存器的Load/Store指 字数据传送指 字节数据传送指令 半字数据传送指令 用户模式字数据传送指令 用户模式字节数据传送指令 有符号的字节/半字数据传送指令 多寄存器Load/Store内存指 多寄存器内存字数据传送指 用户模式多寄存器内存字数据传送指 带状态寄存器的多寄存器字数据装载指令(LDM(3) 数据传送指令应 ARM乘法指 MUL乘法指 MLA乘-累加指 UMULL无符号数长乘指 UMLAL无符号长乘-累加操作指 SMULL有符号数长乘操作指 SMLAL有符号长乘-累加操作指 ARM程序状态寄存器指 程序状态寄存器内容传输到ARM寄存器指令 ARM寄存器内容传输到程序状态寄存器指令 ARM通用寄存器和器内容交换指 ARM通用寄存器和器字数据交换指令 ARM通用寄存器和器字节数据交换指令 异常产生指 软中断指令 ARM汇编语言的伪指 LDR伪指 NOP伪指 ARM指令的分ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、理指令操作数寻址方式和内存指令寻址方式。ARM指令集的一个显著特点是几乎所有的指令都可以条件执行(ARMv5T指令ARM32指令码中条件域占了最高4位。ARM条件域在指令码中的格式如下因为条件域416个条件值每个条件值都根CPSR中的条件标志N、Z、C、V的值来确定指令是被执行还是被跳过。下表给出了ARM指令的条件码、条件助记符、AL可以省略,它是缺省条件。如果没有指定条件,指令就是无条 指令条件码和条件助记符表格如下条件助记说检测的条件相等/等于不进位/无符号数大于或等无进位/无符号数小负正数或溢未溢无符号数大C=1&无符号数小于或等C=0or有符号数大于或等有符号数小有符号数大Z=0&N=有符号数小于或等Z=1orN!=总执任何状从不(不要使用无ARM分支跳转指((L指令是改变指令执行顺序的标准方式。M一般按照字地址顺序执行指令,需要时使用条件执行跳过某段指令。只要程序必须偏离顺序执行,就要使用控制流指令来修改程序计数器。尽管在特定情况下还有其他几种方式实现这个目的,但跳转和跳跳转指令改变程序的执行流程或者调用子程序。这种指令使得一个程序可以使用子程序、if-then-elsePC指向一个新的地址,ARMv5架构指令集包含的跳转指令如表2.1所示表 ARMv5架构跳转指助记 B跳转指带返回的连接跳 后面第一条指令的地址跳转并切换PC←Rm&0xfffffffe,带返回的跳转并切换状PC←Lable,T←1LR←BL后面第一条指令的地另一种实现指令跳转的方式是通过直接向PC寄存器中写入目标地址值,实现在4GB地址空间中任意跳转,这种跳转指令又被称为长跳转。如果在长跳转指令之前使用“MOVLR”或“MOVPC4GB的地址空间中的子在ARMv5以前的版本中,传送到PC寄存器中的目标地址值的低两位bits[1∶0]被忽略,ARM指令集中执行,即程序不能从ARM状态切换到ThumbT系列版本5的ARM体系不含Thumb指令,当程序试图切换到Thumb状态时,将产生未定义指在ARMv5以后的版本中,有两种类型的带连接的跳转切换指令(BLX,叙述如下形式如“BLX<Rm>RmBX指令。指令执行BX操作,同时将返回地址放到LR寄存器中。这种形式的带状态切换的跳转连接指令,方便了ARM/Thumb互交的子程序调用。另一种类型的BLX指令类似于BL指令,指令使程序跳转到指定地址,并将返回地址保LR32MBBL指令的不同之处在于它返回到Thumb状态,而不是ARM状态。BL址拷贝到1(即返回地址连接寄存器R)MSR中指令的编码格式如图2.1所示2.1B&BL ①cn>(on=L(lay。②③指令跳转的目标地址。指令通过下面的方法计算目标地址24位带符号的补码立即数符号扩展为32将扩展后的32位立即数左移两位将得到的值加到PC寄存器中,即得到跳转的目标 LR=addressof LR=addressoftheinstructionafterthebranchPC=PC+BL指令用于实现子程序调用。子程序的返回可以通过将LR寄存器的值到PC寄存器 R14(如果体系结构支持BX指令 PC,R14当子程序在处使用了压栈指令 13,{eiters,4}, 可以使用指 R13,{<eiter>,P} 将子程序返回地址放入PCARM汇编器通过以下步骤计算指令编码中的signed_immed_24将PC寄存器的值作为本跳转指令的址值从跳转的目标地址中减去上面所说的跳转的址,生成字节偏移量。由于ARM指4的倍数。 否则,将指令编码字中的signed_immed_24bits[25∶2],当指令跳转越过地址0或32位地址空间最高地址时,将产生不可预知的结果。 LABLE LABLE 跳转到绝对0x1234 funcPC值保存到LR CPSRC1LABLE 通过使用跳转使程序体循环10条件子程序调用示例;;则调用;否则调用带状态切换的跳转指令带状态切换的跳转指令BX使程序跳转到指令中指定的参数Rm指定的地址执行程序,Rm0位拷贝到CPSR中T位,位[31∶1]PCRmbit[0]1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码;若Rm的位bit[0]为0,则跳转时自动将CPSR中的标志位T复位,即把目标地址代码解释为ARM代码。指令的编码格式如图2.2所示2.2BX ①cn>(on=L(lay。②包含跳转指令的目标地址。如果Rm的bit[0]=0,目标地址处指令为ARM指令;如果Rm的bit[0]=1,目标地址处指令为Thumb指令。指令操作的伪代码如下面程序段所 PC=RmAND当Rm[1∶0]=0b10时,指令的执行结果不可预知。因为在ARM状态下,指令是4字PCRmPC作为<Rm>使用时,指令“BXPC”将程序跳转到当前指令下面第二条指令处执行。虽然这样跳转可以实 PC,或 PC,PC, 转移r0中的地址,如果r0[0]=1,则进入Thumb r0,ThumbFun+1 跳转到r0指定的地址,并根据r0的最低 r0,ThumbFun+1 带状态切换的连接跳转指令带连接和状态切换的跳转BLX(BranchwithLinkExchange)使用标号,用于使程序跳转到Thumb状态或Thumb状态返回。该指令为无条件执行指令,并用分支寄存器的最低位来更CPSRT位,将返回地址写入到连接寄存LR中。指令编码格式如图2.32.3BLX(1) 其中,<target_add>为指令的跳转目标地址。该地址根据以下规则2432③位H(bit[24])加到结果地址的第一位(bit[1PC计算偏移量的工作一般ARM汇编器来完成。这种形式的跳转指令只能实现±32MB空PC中。这时,程序计数器的内容为BX指令地址加8字节。位H(bit[24])也加到结果地址的第一位(bit[1],使目标地址成为半字地址,以执行接下来的Thumb指令。计算偏移量的工作一般由ARM汇编器来完成。这种形式的跳转指令只能实现±32MB空间的跳转。第一种格式BLX指令。LR=addressLR=addressoftheinstructionaftertheBLXinstructionTFlag=1PC=PC+PC=PC+(SignExtend(signed_immed_24)<<2)+从Thumb状态返回到ARM状态,使用BX 可以在子程序的和 带状态切换的连接跳转指令BLX(BranchwithLinkExchange)使用一个寄存器中的绝对地址,用于使程序跳转到Thumb状态或从Thumb状态返回。该指令用分支寄存器的最低位来更新CPSR中的T位,将返回地址写入到连接寄存器LR中。指令编码格式如图2.42.4BLX(2) ①cn>(on=L(lay。②Rm指定转移目标,Rm0CPSR中的T位,bit[31∶0]PC如果Rm的bit[0]=1,则跳转时自动将CPSR中的标志位T置位,即把目标地址的代码解释为Thumb代码。如果Rm的bit[0]=0,则跳转时自动将CPSR中的标志位T复位,即把目标地址代码解释为ARM代码。指令操作的伪代码如下面程序段所 LR=addressoftheinstructionafterthebranchinstructionTFlag=Rm[0]PC=RmANDThumb子程序CODE32CODE32;ARM代 TSUB;ThumbCODE16;Thumb代码开 ;ARMARM数据处理指如果在数据处理指令前使用S前缀,指令的执行结果将会影响CPSR中的标志位。数据处理指令如表3.1所示。表 数据处理指令列操作助记 逻辑逻辑异Rd:=RnEOR减Rd:=Rn−翻转Rd:=op2−加Rd:=Rn+带进位的Rd:=Rn+op2+带进位的Rd:=Rn−op2+C−带进位的翻Rd:=op2−Rn+C−测RnANDop2测试相RnEORop2比Rn−op2并更新标志负数比Rn+op2并更新标志逻辑Rd:=RnOR 指令操作的伪代码如 指令的编码格式如图3.53.5S:标志指令的条件域是否更新CPSR。 指示目的寄存器。shifter_operand:指数据处理指令的基本语法格式如 <opcode>{<cond>}{S} 其中<shifter_operand>有下面11种形式,如表3.3所示表 <shifter_operand>的寻址方 1立即数寻2寄存器寻3<Rm>, 立即数逻辑4<Rm>, 寄存器逻辑5<Rm>, 立即数逻辑6<Rm>, 寄存器逻辑7<Rm>, 立即数算术8<Rm>, 寄存器算术9<Rm>, 立即数循环<Rm>, 寄存器循环<Rm>,寄存器扩展循环右数据处理指令的寻址方式根据<shifter_operand>的不同,相应的分为11MOV指令编码MOVARMN送到目标寄存器Rd,其中N可以是寄存器,也可以是立即数。指令的编码格式如图3.6所示。3.6MOVMOV指令将移位码(shifter_operand)表示的数据传送到目的Rd,并根据操作的结果更CPSR中相应的条件标志位。指令的语法MOV{<cond>}{S} ①为指令编码中的条件域。它指示MOV指令在什么条件下执行。当<cond>忽略时,指令为(cond=AL(Alway②S=1,MOV指令更新CPSR中条件标志位的值;如果S=0,MOV指令不更新中条件标志位的值。当更新状态寄存器CPSR中的条件标志位时,有两种情和Z位(如果数据在传送前需要移位,则根据移位后的数值设置,并根据移位器的进位值设置CPSRC位。标志位V和其他位不受影响。如果指令中的目标寄存器<Rd>为R15,则当前处理器模式对应的SPSR的值到CPSR寄存器中,对于用户模式和系统模式,由于没有相应的SPSR,指令执行的结果不③确定目标寄存器④确定操作数,为目标寄存器传送数 S==1andRd==r15 S==1andRd==r15 NFlag=Rd[31]ZFlag=If then1 CFlag=shifter_carry_outVFlag=指令举【例】MOV指R0, R0R0...NOPR0,R0,LSL#3;R0=R0*MOV指令把一个数N送R0, R0R0...NOPR0,R0,LSL#3;R0=R0*r15是目的寄存器,将修改程序计数器或标志。这用于返回到调用代码,方法是把连接寄存器的内容传送r15。PCR14;PCR14;指令的使MOV指令主要完成以下功能将数据从一个寄存器传送到另一个寄存器将一个常数值传送到寄存实现无符号算术运算和逻辑运算的单纯移位操操作数乘2n可以用左移 位来实现PC,LR,B,BLMVN指令编码格MVN指令多用于向寄存器传送一个负数或生成位掩码。指令的编码格式如图3.7所示3.7MVNMVN指令将<shifter_operand>表示的数据的反码传送到目的寄存器Rd。并根据操作的结果CPSR中相应的条件标志位。指令的语法MVN{<cond>}{S} ①MNnd>(on=L(lay。②S=1,MVN指令更新CPSR中条件标志位的值;如果S=0,MVN指令不更新中条件标志位的值。当更新状态寄存器CPSR中的条件标志位时,有两种情如果指令中的目标寄存器<Rd>不是r15,指令根据传送的数值设CPSRN位和Z位(如果数据在传送前需要移位,则根据移位后的数值设置,并根据移位器的进位值设置CPSRC位。标志位V和其他位不受影响。如果指令中的目标寄存器<Rd>为r15则当前处理器模式对应的SPSR的值到寄存器中,对于用户模式和系统模式,由于没有相应的SPSR,指令执行的结果不可预知③确定目标寄存器④确定操作数,为目标寄存器传送数指令操作的伪代指令操作的伪代码如下面程序段所 Rd=NOT(shifter_operand) S==1andRd==R15 CPSR=SPSR NFlag=Rd[31]ZFlag=If then1 CFlag=shifter_carry_outVFlag=指令【例】MVNMVN指令和MOV指令相同也可以把一个数N送到目标寄存器RdN可以是立即数,R0,;R0=-R0,;R0=-指令的使MVN指令主要完成以下功能向寄存器中传送一个负数生成位掩码(bitmask求一个数的反码ADD指令的编码ADDier_pend>n>d>中,并根据指令的执行结果设置R指令的编码格式如图3.8所示指令的语法

3.8ADD ①cn>(on=L(lay。②CPSRSCPSR中条件标志位的值;当没有S位时指令不更新CPSR中条件标志位的值。当有S位时,有下面两种情况。如果<Rd>R15CPSRN和Z位根据指令的执行结果设置。C根据指令操作是否产生一个进位(即一个无符号溢出来设置;V位根据是否有带符号的溢出来设置。CPSR如果<Rd>是程序计数器R15,则当前程序状态的SPSR拷贝到CPSR。如果处理器处R寄③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代码如下面程序段所 Rd=Rn+shifter_operand Nflag=Rd[31]Z Cflag=CarryFrom{Rn+shifter_operandVflag=OverflowFrom{Rn+shifter_operand指令举【例】ADD指令举例R0,R1,R2;R0=R1+R0,R1,;R0=R1+R0,R2,;R0=R2+(R3<<ADC指令的编码ADC加操作指令,将寄存器<shifter_operand>的值加上<Rn>表示的数值,再加上CPSR中的C条件标志位的值,将结果保存到目标寄存器<Rd>中,并根据指令的执行结果设置CPSR中相应指令的编码格式如图4.9所示指令的语法

4.9ADC ①cn>(on=L(lay。②S(bit[20决定指令的操作是否影响CPSRS=1时指令更新CPSR中条件标志位的值;当S=0时指令不更新CPSR中条件标志位的值。当S=1时,有下面两种情如果d>不是15SRN和ZC作是否产生一个进位(即一个无符号溢出)来设置;V位根据是否有带符号的溢出来设置。R如果d>是程序计数器15,则当前程序状态的SR拷贝到PSR。如果处理器处于用户模式或系统模式,则指令的执行结果不可预知。因为这两种模式没有自己的私有R③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代码如下面程序段所 Rd=Rn+shifter_operand+CFlag Nflag=Rd[31]Z Cflag=CarryFrom{Rn+shifter_operand+CVflag=OverflowFrom{Rn+shifter_operand+CFlag指令举【例】ADC指令举例ADC将把两个操作数加起来,并把结果放置到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的加法。下面的例子将加两个128位的数。128位结果:寄存器R0、R1、R2第一128位数:寄存第二128位数:寄存

R4、R5、R68、9、1011R0,R4,;的R1,R5,;加下一个字,带进R2,R6,;加第三个字,带进R3,R7,;加高端的字,带进SUB减操作指令的编码UB(brac)n>hfe_oerad>d>R指令的编码格式如图4.10所示指令的语法

4.10EOR ①cn>(on=L(lay。②CPSR。当S位置位时(r15)如果结果为负,则标志位N置位;否则清0(也就是说N等于结果的第31位如果0,则标志位Z置位;否则清0当操作定义为算术操作(ADD、ADC、SUB、SBC、RSB或RSC)时,标志位C设置ALUCV30位到31位的溢出,则置位;如果不发生溢出,则清0。仅当算术操作中操作数被认为是2的补码的有符号若指令中的目标寄存器<Rd>为r15,则当前处理器模式对应的SPSR的值被到寄存器中。用户模式和系统模式下,由于没有相应的SPSR,指令的执行结果不可预知③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代指令操作的伪代码如下面程序段所 Rd=Rn-shifter_operand Nflag=Rd[31]Z Cflag=NOTBorrowForm{Rn–shifter_operand}Vflag=OverflowFrom{Rn–shifter_operand}指令举【例】SUB指令举例(1)R0=R1- R0,R1,(2)R0=R1- R0,R1, R0, R0,R2,SBC指令的编码SBC(SubtractwithCarry)带进位的减操作指令,用于执行操作数大32位时的减法操作。该指令从寄存器<Rn>中减去<shifter_operand>表示的数值,再减去寄存器CPSR中C条件标志位的反码(NOT(Carryflag。并将结果保存到目标寄存器<Rd>中,并根据指令的执行结果设置CPSR中相应的标志位。指令的编码格式如图4.11所示指令的语法

4.11SBC ①cn>(on=L(lay。②S(bit[20决定指令的操作是否影响CPSRS=1时指令更新CPSR中条件标志位的值;当S=0时指令不更新CPSR中条件标志位的值。当S=1时,有下面两种情如果<Rd>R15,CPSRNZ位根据指令的执行结果设置。C位根据指令操作是否产生一个进位(即一个无符号溢出来设置;V位根据是否有带符号的溢出来设置。CPSR如果<Rd>是程序计数器R15,则当前程序状态的SPSR拷贝到CPSR。如果处理器处于用户模式或系统模式,则指令的执行结果不可预知。因为这两种模式没有自己的私有SPSR寄存器③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代指令操作的伪代码如下面程序段所 Rd=Rn-shifter_operand-NOT(CFlag) Nflag=Rd[31]Z Cflag=NOTBorrowFrom{Rn-shifter_operand-NOT(CFlag)}Vflag=OverflowFrom{Rn-shifter_operand-NOT(CFlag)}指令举【例】SBC指令举例下面的程序使用SBC实现64位减法(R1,R0)-(R3,RSB减翻转指令的编码RSB(ReverseSubtract)减操作指令,从寄存器<shifter_operand>中减去<Rn>表示的数值,并将结果保存到目标寄存器<Rd>中,并根据指令的执行结果设置CPSR中相应的标志位。指令的编码格式如图4.12所示4.12RSB指令的语法 ①cn>(on=L(lay。②详见SUB指令③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代码如下面程序段所 Rd=shifter_operand-Rn Nflag=Rd[31]Z Cflag=NOTBorrowFrom{shifter_operand-Rn}Vflag=OverflowFrom{shifter_operand-Rn}指令举【例】RSB指令举例下面指令序列可以求一个64位数值的负数。64位数放在寄存器R0R1中,其负数放R2R3R0R232RSC指令的编码RSC(ReverseSubtractwithCarry)带进位的翻转减操作指令,从寄存器中减去<Rn>表示的数值,再减去寄存CPSRC条件标志位的反码(NOT(CarryFlag)),并将结果保存到目标寄存器<Rd>中,并根据指令的执行结果设置CPSR中相应的标志位。指令的编码格式如图4.13所示指令的语法

4.13RSC ①cn>(on=L(lay。②详见SUB指令③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代指令操作的伪代码如下面程序段所 Nflag=Rd[31]Z CCflag=NOTBorrowFrom{shifter_operand-Rn-NOT{CFlag}}Vflag=OverflowFrom{shifter_operand-Rn-NOT{CFlag}}指令【例】RSC指令举例下面程序使用RSC指令AND指令编码格AND指令将<shifter_operand>表示的数值与寄存器<Rn>的值按位(bitwise)做逻辑与操作,并将结果保存到目标寄存器<Rd>中,同时根据操作的结果更新CPSR寄存器。指令的编码格式如图4.14所示指令的语法

4.14AND ①cn>(on=L(lay。②CPSR。当S位置位时(r15)如果结果为负,则标志位N置位;否则清0(也就是说N等于结果的第31位如果0,则标志位Z置位;否则清0当操作定义为算术操作(ADD、ADC、SUB、SBC、RSB或RSC)时,标志位C设置ALUCV30位到31位的溢出,则置位;如果不发生溢出,则清0。仅当算术操作中操作数被认为是2的补码的有符号若指令中的目标寄存器<Rd>为r15,则当前处理器模式对应的SPSR的值被到寄存器中,对应用户模式和系统模式,由于没有相应 SPSR,指令的执行结果不可预知③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代 NZflag=if Cflag=shifter_carry_outV指令举【例】AND指令举例AND的真值表(11)4.4表 AND指令真值 000010100111 R0,R0, R0 R0,R0, R0=R0&0x01,取出 EOR指令的编码逻辑异或ER(EcseR)指令将寄存器n>中的值和ier_peand>的值执行按d>新SR中指令的编码格式如图4.15所示指令的语法

4.15EOREOR{<cond>}{S} ①cn>(on=L(lay。②CPSR。当S位置位时(r15)如果结果为负,则标志位N置位;否则清0(也就是说N等于结果的第31位如果0,则标志位Z置位;否则清0当操作定义为算术操作(ADD、ADC、SUB、SBC、RSB或RSC)时,标志位C设置ALUCV30位到31位的溢出,则置位;如果不发生溢出,则清0。仅当算术操作中操作数被认为是2的补码的有符号若指令中的目标寄存器<Rd>为r15,则当前处理器模式对应的SPSR的值被到寄存器中。用户模式和系统模式下,由于没有相应的SPSR,指令的执行结果不可预知③指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和 Rd=RnEOR Rd=RnEOR NZflag=if Cflag=shifter_carry_outV指令举【例】EOR指令举例EOR的真值表(二者不同则结果为1)如表4.5表 EOR指令真值 000011101110 R0,R0, R0,R0, R14 将R5和0x01进行逻辑异或,结果保存到R0,并根据执行结果设置标志位 ORR指令的编码ORR(LogicalOR)为逻辑或操作指令,将第二个源操作数<shifter_operand>的值与寄存RnRd中。指令的编码格式如图4.16所示。指令的语法

①cn>(on=L(lay。②S(bit[20决定指令的操作是否影响CPSRS=1时指令更新CPSR中条件标志位的值;当S=0时指令不更新CPSR中条件标志位的值。当S=1时,有下面两种情如果>15PRN位和ZC位则根据指令操作是否产生一个进位(即一个无符号溢出)来设置;V位则根据是否有带符号的溢出来R如果d>5R拷贝到PR用户模式或系统模式,则指令的执行结果不可预知。因为这两种模式没有自己的私有R寄<Rd>,即指令格式中的指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代指令操作的伪代码如下面程序段所 Rd=RnRd=RnOR Nflag=Rd[31]Zflag=if Cflag=shifter_Carry_outV指令举【例】ORR指令举例R00 R0,R0, R04 R1,R2,LSRR3,R1,R3,R1,R2,LSRR3,R1,R3,LSLBIC位指指令的编码码按位做“逻辑与”操作,结果保存到Rd中。指令的编码格式如图4.17所示指令的语法

4.17BIC ①为指令编码中的条件域。它指示指令在什么条件下执行。当<cond>忽略时,指令为无条(cond=AL(Alway②<Rd>,即指令编码格式中的指定目标寄存器④指定第一个源操作数寄存⑤ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和 Nflag=Rd[31]Zflag=if Cflag=shifter_Carry_outV指令举【例】BIC指令举例BIC4.7表 BIC指令真值 000010101110 R0,R0,R0中的位0、13。保持 R0,R0,R3R2R1 CMP比较指令的编码CMP(Compare)Rn的值减去shifter_operand的值,根据操作的结果更新CPSR中相应的条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令的编码格式如图4.18所示指令的语法

4.18CMP ①cn>(on=L(lay。②指定第一个源操作数寄存③TST指令操作的伪代 ALU_out=Rn-shifter_operandNFlag=ALU_out[31]ZFlag ALU_out=Rn-shifter_operandNFlag=ALU_out[31]ZFlag=ifALU_out==0then1elseVFalg=OverflowFrom{Rn-shifter_operand}指令【例】CMP指令举例MP允许进行条件执行。它进行一次减法,但不结果,而是正确地更改标志位。标志位表示的121,则此后的有GT显然,CMP不需要显式的指定S后缀来更改状态标志 下面的指令R1和立即数10并设置相关的 下面指令比较寄存器R1和R2中的值并设置相关的标志 通过上面的例子可以看出,CMPSUBS指令的区别CMP指令不保存运算结果,在进行两个数据大小判断时,常用CMP指令及相应的条件码来操作。CMN指令的编码CMN(CompareNegative)比较指令使用寄存器Rn的值减去shifter_operand的负数值(上operand2根据操作的结果更新CPSR中相应的条件标志位,以便后面的指令根据相应的条件指令的编码格式如图4.19所示指令的语法

①cn>(on=L(lay。②指定第一个源操作数寄存③TST指令操作的伪代指令操作的伪代码如下面程序段所 ALU_out=Rn+shifter_operandNFlag=ALU_out[31]ZFlag=ifALU_out==0then1elseCFlagV指令【例】CMN指令举例MN指令将寄存器n>中的值加上hte_perad>表示的数值,根据加法的结果设置PRn>中的值加上her_pernd>的操作结果对R中条件标志位的影响,与寄存器n>中的值减去her_perd>的操作结果的相反数对PR中为0或者为x 第一条指令使标志位C1,第二条指令使标志位C0下面的指令使R01,判R0是否为1的补码,若是,则Z置位 TST测试指指令的编码指令的编码格式如图4.20所示指令的语法

4.20TST ①cn>(on=L(lay。②指定第一个源操作数寄存③使用ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])和shifter_operand(bits[11∶0])指令操作的伪代指令操作的伪代码如下面程序段所 NFlag=ALU_out[31]ZFlag=ifALU_out==0then1else0CFlag=shifter_carry_outV指令【例】TST指令举例TST类似于CMP,不产生放置到目的寄存器中的结果。而是在给出的两个操作数上进行操作字而操作2是一个位掩码。经过测试后,如果匹配则设Zero标志,否则清除它。CMP指令一样,该指令不需要指定S后缀。 R0,下面的指令测试在R0中是否设置了 R0,TEQ指令的编码TEQ(tEvane)测试指令用于将一个寄存器的值和一个算术值按位做逻辑异或操作。条件标志位根据两个操作数做“逻辑异或”后的结果设置。以便后面的指令根据相应的条指令的编码格式如图4.21所示指令的语法

4.21TEQ ①cn>(on=L(lay。②指定第一个源操作数寄存③ARM的通用寻址模式确定第二个源操作数。它影响指令编码格式中的I(bit[25])位和指令操作的伪代码如下面程序段所 ALU_out=RnEORshifter_operandNFlag=ALU_out[31]ZFlag=ifALU_out==0then1else0CFlag=shifter_carry_outV指令举【例】TEQ指令举例下面的指令比较R0R1CPSRVC TST指令EORS指令的区别在于TST指令不保存运算结果。使用TEQ进行相等测试,EQNE条件码配合使用,当两个数据相等时,条件码EQ有效,否则条件码NE有效ARM加载指单寄存器的Load/StoreLoad/Store内存指令在ARM寄存器和器之间传送数据。ARM指令中有3种基本Load/Store指令(Single这些指令在ARM寄存器和器之间提供更灵活的单数据项传送方式。数据项可以是字节、16位半字或32位字。②多寄存器Load/Store内存指和存作及器数。(SingleRegister这些指令允许寄存器和器中的数值进行交换,在一条指令中有效地完成Load/Store操这种指令用于把单一的数据传入或者传出一个寄存器。支持的数据类型有字节(8位6和字2。4.7总结了所有单寄存Load/Store指令表 单寄存器Load/Store指指 把一个字装入一个寄存将寄存器中的字保存到把一个字节装入一个寄存将寄存器中的低8位字节保存到把一个半字装入一个寄存将寄存器中的低16位半字保存到用户模式下将一个字节装Rd←mem8[address]underuser用户模式下将寄存器中的低8位字节保存器Rd→mem8[address]underuser用户模式下把一个字装入一个寄存用户模式下将寄存器中的字保存到Rd→mem32[address]]underuser把一个有符号字节装入一把一个有符号半字装入一LDR指令编码格指令的编码格式如图4.22所示。4.22LDR 指令根据<addr_mode>所确定的地址模式将一个 位字到指令中的目标寄存d>数为寻址方式确定的地址s1]的8如果设置了 位,则进行装载,否则进行如果设置了 位,则使用预先变址寻址,否则使用过后变址寻址如果设置了 位,则给出的偏移量被加到基址寄存器上,否则从中减去偏移量如果设置了B位,传送内存的一个字节,否则传送一个字。即在助记符末尾添加B”,如MOVr7,r5变为MOVBr7,r5。W位的解释依赖于使用的地址模对于预先变址寻址,设 位强制把它用做地址转换的最终地址写回基址寄存器(例如,传送的副作用是Rn:=Rn+/-offset这在汇编器中表示为给指令加上)W位指示在进行传送之前强制地址转换。这在汇编器中表示为给指令加上后缀“T”。当PC作为LDR的目的寄存器<Rd>时,从器取得的数据将被当作目标地址值,程序指令的语法 ①为指令编码中的条件域。它指示LDR指令在什么条件下执行。当<cond>忽略时,指令为(cond=AL(Alway②确定使用哪个通用寄存器作为目标寄存器③I、P、、、n和adr_o>n。指令操作的伪代 address[1:0]==0b00 Value= address[1:0] address[1:0]==0b00 Value= address[1:0]== Value=Memory[address,4]Rotate_Right8 address[1:0]==0b10 Value=Memory[address,4]Rotate_Right16 /*address[1:0]==0b11*/Value=Memory[address,4]Rotate_Right24 (RdisR15) If(architectureversion5orabove) PC=valueAND0xfffffffeTBit=PC=valueANDRd=指令举值不变r1,[r0,#0x12];将r0+12地址处的数据读出,保存到r1中(r0的值不变;将r0地址处的数据读出,保存到r1中(零偏移;将r0+r2r1中(r0的值不变r1,[r0,r2,LSL;r0+r2×4r1中(r0,r2Rd,label;label为程序标号,label必须是当前指令的±4KB 的值用作传输数据地址。在数据传送后,将偏移0x04与RnRn中。RnSTR指令编码格指令的编码格式如图4.23所示。4.23STR指令的语法 ①为指令编码中的条件域。STR指令在什么条件下执行。当<cond>忽略时,指令为无(cond=AL(Alway②确定使用哪个通用寄存器作为源寄存③I、P、、、n和adr_o>n。指令操作的伪代 指令操作的伪代码如 指令举LDR/STR指令用于对内存变量的、内存缓冲区数据的、查表、部件的控制操作等等,若使用LDR指令加载数据到PC寄存器,则可以实现程序的跳转功能。 ; ;使用LDR伪指令装载NumCount的地址到R0 R1,[R0]GPIOGPIOGPIO—GPIO址 R0,=GPIO— ;将设置值放入寄存 ;IODIR=0x00ffff00,IOSET的地址为…… ;功能号乘以4,以便查 PC,[PC,r2]查表取得对应功能子程序地址,并跳转FUN— FUN— FUN—LDRB指令编码格LDRB指令根据<addr_mode>所确定的地址模式将一个8位字节到指令中的目标寄存指令的编码格式如图4.24所示4.24LDRB指令的语法 ①为指令编码中的条件域。它LDRB指令在什么条件下执行。当<cond>忽略时,指令为(cond=AL(Alway②确定使用哪个通用寄存器作为目标寄存器③I、P、、、n和adr_o>n。指令操作的伪代 Rd=STRB指令编码格STRB指令从寄存器中取出指定的8位字节放入指令中指定的内存单元8位,并将其0。指令的编码格式如图4.25所示4.25STRB指令的语法 ①为指令编码中的条件域STRB指令在什么条件下执行。当<cond>忽略时,指令为(cond=AL(Alway②确定使用哪个通用寄存器作为源寄存③I、P、、、n和adr_o>n。指令操作的伪代 Memory[address,1]=LDRH指令编码格LDRH指令用于从内存中将一个16位的半字到目标寄存器。264.26LDRH指令的语法 ①为指令编码中的条件域。它LDRH指令在什么条件下执行。当<cond>忽略时,指令为(cond=AL(Alway②确定使用哪个通用寄存器作为目标寄存器③I、P、、、n和adr_o>n。指令操作的伪代 ifaddress[0]==0 STRH指令编码格STRH1616位,并将其补0。指令的编码格式如图4.27所示。4.27STRH指令的语法 ①指令编码中的条件域。它指STRH指令在什么条件下执行。当<cond>忽略时,指令为无(cond=AL(Alway②确定使用哪个通用寄存器作为源寄存③I、P、、、n和adr_o>n。 ifaddress[0]==0 ifaddress[0]==0 LDRT指令编码格指令的编码格式如图4.28所示。LDRT指令根据<addr_mode>所确定的地址模式将一个32位字到指令中的目标寄存d>数为寻址方式确定的地址s1]的84.28LDRT存指令的语法 ①为指令编码中的条件域。它指示Tnd>(on=L(lay。②确定使用哪个通用寄存器作为目标寄存器③使用后索引地址模式寻址指令操作的伪代指令操作的伪代码如下面程序段所 8 STRT指令编码格STRT指令用于将一个32位的字数据写入到指令中指定的内存单元存指令的编码格式如图4.29所示4.29STR指令的语法 ①TTnd>(on=L(lay。②确定使用哪个通用寄存器作为源寄存③使用后索引地址模式寻址,参见LDRT指令指令操作的伪代指令操作的伪代码如下面程序段所 LDRBT指令编码格LDRBT指令根据<post_indexed_addressing_mode>地址模式将一个8位字节到指令中存指令的编码格式如图4.30所示①①4.30LDRBT指令的语法 ①DRT指令在什么条件下执行。当n>on=L(lay。②确定使用哪个通用寄存器作为目标寄存器③使用后索引地址模式寻址,参见LDRT指令指令操作的伪代指令操作的伪代码如下面程序段所 STRBT指令编码格STRBT指令用于将一个8位的字节数据写入到指令中指定的内存指令的编码格式如图4.31所示4.31STRBT指令的语法 DRT指令在什么条件下执行。当n>on=L(lay。②确定使用哪个通用寄存器作为源寄存③使用后索引地址模式寻址,参见LDRT指令指令操作的伪代 指令操作的伪代码如 LDRSB指令编码格LDRSB指令根据<addr_mode>所确定的地址模式将一个8位字节到指令中的目标寄存指令的编码格式如图4.32所示4.32LDRSB指令的语法 ①RSBn>on=L(lay。②确定使用哪个通用寄存器作为目标寄存器③①①I、P、、、n和adr_o>n。指令操作的伪代 LDRSH指令编码格LDRSH指令根据<addr_mode>所确定的地址模式将一个16位半字到指令中的目标寄指令的编码格式如图4.33所示4.33LDRSH指令的语法 ①DRSH指令在什么条件下执行。当n>on=L(lay。②确定使用哪个通用寄存器作为目标寄存器③I、P、、、n和adr_o>n。指令操作的伪代 /*address[0]==1*/多寄存器Load/Store内存指多寄存器Load/Store内存指令也叫批量加载/指令,它可以实现在一组寄存器和一块连续的内存单元之间传送数据。LDM用于加载多个寄存器,STM用于多个寄存器。多寄存器Load/Store内存指令允许一条指令传送16个寄存器的任何子集或所有寄存器。多寄存器Load/Store内存指令主要用于现场保护、数据和参数传递等。表4.8总结了多寄存器Load/Store内存指令表 多寄存器Load/Store内存指 装载多个寄{Rd}*N←mem32[start保存多个寄{Rd}*N→mem32[startLDM(1)指令编码格LDM(1)指令将数据从连续的内存单元中到指令中指定的寄存器列表中的各寄存中当PC包含在LDM指令的寄存器列表中时,指令从内存中的字数据将被作为目标地344.34LDM(1)指令的语法 M)cn>(on=L(lay。②指令的寻址方式。确定编码格式中的P、U和W③确定寻址模式所使用的基址寄存如果r15作为指令的基址寄存器,指令的执行结果不可预④设置指令编码格式中W位。它使指令执行后将操作数的内存地址写入基址寄存器<Rn>中;如果!被忽略,W0,指令执行完后,不修改基址寄存器的值。⑤相应的位等于1,否则为0。指令操作的伪代指令操作伪代码如下面程序段所 to Value=Memory[address,4]If(architectureversion5orabove) Pc=value Tbit=value[0]Pc=value AssertSTM(1)指令编码格TM(1)指令编码格式如图4.354.35STM(1)指令的语法 ①TM1)cnd>(on=L(lay。②指令的寻址方式。确定编码格式中的P、U和W③确定寻址模式所使用的基址寄存如果r15作为指令的基址寄存器,指令的执行结果不可预④设置指令编码格式中W位。它使指令执行后将操作数的内存地址写入基址寄存器<Rn>中;如果!被忽略,W0,指令执行完后,不修改基址寄存器的值。⑤相应的位等于1,否则为0。指令操作的伪代指令操作伪代码如下面程序段所 end_address==address-LDM(2)指令编码格LDM(2)指令将数据从连续的内存单元中到指令中指定的寄存器列表中的各寄存中指令的编码格式如图4.36所示4.36LDM(2)指令的语法 ①M)cn>(on=L(lay。②指令的寻址方式。确定编码格式中的PU位。此指令中W位指定为0③确定寻址模式所使用的基址寄存如果r15作为指令的基址寄存器,指令的执行结果不可预④寄存器列表中不能包PC寄存器,“ˆ”后缀表示不允许在用户模式和系统模式下使用。其他细节可参考LDM(1)指令。指令操作的伪代指令操作伪代码如下面程序段所 STM(2)指令编码格TM(2)指令编码格式如图4.374.37STM(2)指令的语法 <registers ①M)cn>(on=L(lay。②指令的寻址方式。确定编码格式中的PU位。此指令中W位指定为0③确定寻址模式所使用的基址寄存如果r15作为指令的基址寄存器,指令的执行结果不可预④<registers被保存的寄存器列表。只能使用用户模式下的寄存指令操作的伪代指令操作伪代码如下面程序段所 register_list[i]==Address=address+4 (LDM(3)M(3同时将当前处理器模式对应的R寄存器的内容到SR寄。在ARMv5及以上的版本和T系列的ARMv4版本中,SPSR寄存器的T位将到CPSR4.384.38LDM(3)指令的语法 ①M)cn>(on=L(lay。②指令的寻址方式。确定编码格式中的P、U和W③确定寻址模式所使用的基址寄存如果r15作为指令的基址寄存器,指令的执行结果不可预④设置指令编码格式中W位。它使指令执行后将操作数的内存地址写入基址寄存器<Rn>中;如果!被忽略,W0,指令执行完后,不修改基址寄存器的值。相应的位等于1,否则为0。该指令执行时将当前处理器模式下的SPSR值到 中。指令的其他参数可参LDM(1)指令格式指令操作的伪代指令操作伪代码如下面程序段所 For register_list[i]==1thenIf{architectureversion4T,5orabove}and{Tbit==1}thenPc=valueANDoxfffffffeAddress=address+4Assertend_address=address-LDM为加载多个寄存器,STM为多个寄存器。允许一条指令传送16个寄存器的任何子集LDM{cond}<LDM{cond}<模式 STM{cond}<模式 前面4种用于数据块的传输,后面4种是堆栈操作。IA:每次传送后地址加4IB:每次传送前地址加4DA:每次传送后地址减4DB:每次传送前地址减4FD:满递减堆栈ED:空递增堆栈FA:满递增堆栈EA:空递增堆栈示最后的地址写回Rn中;寄存器列表reglist可包含多于一个寄存器或寄存器范围,使用“,”r0!,{r3~r9};r0指向的地址上的多字数据,保存到r3~r9中,r0值更139}到r1指向的地址上,r1r0!,{r3~r9};r0指向的地址上的多字数据,保存到r3~r9中,r0值更139}到r1指向的地址上,r1;现场保存,将r0~r7、LRSP!,{r0~r7,PC}ˆ;PC时,加载的是用户模式寄存器,而不是当前模式寄在进行数据时,先设置好源数据指针,然后使用块拷贝寻址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB进行和。而进行堆栈操作时,则要先设置堆栈指针,一般使用SP然后使用堆栈寻址指令STMFD/LDMFDSTMED/LDMED、STMEA/LDMEA实现堆栈操作。多寄存器传送指令如例4.17所示。其中r1为指令执行前的基址寄存器,r1’则为指令执行【例4.17】多寄存器传送指令示意

400840044000

400840044000

400840044000加9表 多寄存器Load/Store内存指令映地址模满空满空增之之增之之【例4.18】使用LDM/STM进行数据 ;设置源数据地 ;设置目标;8字数据到寄存器;寄存器r2~r9到目标地【例4.19】使用LDM/STM进行现场寄存器保护,常在子程序或异常处理

SP!,{r0~r7,LR};寄存器压栈保护DELAY;DELAY子程序SP!,{r0~r7,PCARM乘法指AM乘法指令完成两个数据的乘法。两个2位二进制数相乘的结果是4些RM的处理器版本中,将乘积的结果保存到两个独立的寄存器中。另外一些版本只将最低2-数和无符号数都能使用。对于有符号数和无符号数,结果的最低有效位是一样的。因此,对于2乘法指令的二进制编码格式如图4.394.39操作助记 乘(保留32位结果乘-累加(32位结果无符号数长无符号长乘-有符号数长有符号数长乘-其中①“RdHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)形成64位数,“[31:0]”只选取结果的最低有效32= 累加(将右边加到左边)是由“+=同其他数据处理指令一样,位SS时,则有以下果的指令形式,将其设置为RdHi的第31位的值。32RdZ置位;对于产生长结果的指令形式,RdHi和RdLo同时为零时,标志位Z置位。C④标志位VMUL乘法指MUL(Multiply)32位乘法指令将RmRs中的值相乘,结果32位保存到Rd中。指令的编码格式如图4.40所示。4.40MUL ①cn>(on=L(lay。②S位(bit[20])决定指令的操作是否影响CPSR中的条件标志位NZ位的值。当S=1时,更新CPSR中的条件标志位的值;当S=0时,指令不更新CPSR中的条件标志位。③寄存器位目标寄存器④第一个乘数所在寄存⑤第二乘数所在寄存器 flag= flag= flag=if flag=unaffected flag= R1,R2, R1,R2, R0,R3,(2)R0=R3×R7,同时设置CPSR中N R0,R3,MLA(MultiplyAccumulate)32位乘累加指令将Rm和Rs中的值相乘,再将乘积加上第指令的编码格式如图4.41所示。4.41MLA ①cn>(on=L(lay。②S位(bit[20])决定指令的操作是否影响CPSR中的条件标志位NZ位的值。当S=1时,更新CPSR中的条件标志位的值;当S=0时,指令不更新CPSR中的条件标志位。③寄存器位目标寄存器④第一个乘数所在寄存⑤第二乘数所在寄存器⑥将要累加到<Rm>×<Rs>结果中的第3操作数指令操作的伪代码如下面程序段所 flag= flag=if flag=unaffected flag=R0,R1,R2,R3,下面指令R0,R1,R2,R3,UMULLUMULL(UnsignedMultiplyLong)64RmRs中的值做32位保存到RsLo32RdHi中。指令的编码格式如图4.42所示4.42UMULL ①cn>(on=L(lay。②S位(bit[20])决定指令的操作是否影响CPSR中的条件标志位NZ位的值。当S=1时,更新CPSR中的条件标志位的值;当S=0时,指令不更新CPSR中的条件标志位。③寄存器位目标寄存器。结果的低32位值④寄存器位目标寄存器。结果的高32位值⑤第一乘数寄存器⑥第二乘数寄存器指令操作的伪代码如下面程序段所 RdHi={Rm*Rs}[63:32]RdLo={Rm*Rs flag= flag=if (RdHi==0)and(RdLo==0)then1 flag=unaffected flag=下面指令完成 操作 R0,R1,R5,UMLAL无符号长乘-累加操作指UMLAL(UnsignedMultiplyAccumulateLong)为64位无符号长乘-累加指令。指令将RmRs中的值做无符号数相乘,64位乘积与RdHi,RdLo相加,结果的低32位保存到RsLo中,而高32位保存到RdHi中。指令的编码格式如图4.43所示4.43UMALL ①cn>(on=L(lay。②S位(bit[20])CPSRNZ位的值。当S=1时,更新CPSR中的条件标志位N位和ZS=0时,指令CPSR中的条件标志③将要累加到<Rm>×<Rn>乘积结果中的加数的低32 位目标寄存器,最终结果的低32位值。④将要累加到<Rm>×<Rn>乘积结果中的加数的高32 位目标寄存器,最终结果的高32位值。⑤第一乘数寄存器⑥第二乘数寄存器指令操作的伪代码如下面程序段所 RdLo={Rm*Rs}[31:0]+RdLo flag= flag=if (RdHi==0)and(RdLo==0)then1 flag=unaffected flag= R0,R1,下面的指令完成 R5×R8+(R1, R0,R1,SMULLSMULL(SignedMultiplyLong)64RmRs中的值做有符32RsLo32RdHi中。指令的编码格式如图4.44所示4.44SMULL ①cn>(on=L(lay。②S位(bit[20])CPSRNZ位的值。当S=1时,更新CPSR中的条件标志位N位和ZS=0时,指令CPSR中的条件标志③寄存器位目标寄存器,最终结果的低32位值④寄存器位目标寄存器,最终结果的高32位值⑤第一乘数寄存器⑥第二乘数寄存器指令操作的伪代码如下面程序段所 RdHi={Rm*Rs}[63:32]RdLo={Rm*Rs flag= flag=if (RdHi==0)and(RdLo==0)then1 flag=unaffected flag=下面的指令完成(R3,R2)=R7×R6操作 R2,R3,SMLAL有符号长乘-累加操作指中的值做有符号数相乘,64RdHi,RdLo相加,结果的32位保存RsLo中,而高32位保存到RdHi中。指令的编码格式如图4.45所示 28 21 4 SS4.45SMLAL ①cn>(on=L(lay。②S位(bit[20])决定指令的操作是否影响CPSR中的条件标志位N位和Z位的值。当S=1其他参数详见SMULL RdLo={Rm*Rs}[31:0]+RdLo RdLo={Rm*Rs}[31:0]+RdLo flag= flag=if (RdHi==0)and(RdLo==0)then1 flag=unaffected flag=下面的指令完成 R7×R6+(R3,R2)操作 R2,R3, ARM程序状态寄存器指ARM指令集提供了两条指令,可直接控制程序状态寄存器psr。MRS指令用于把CPSR或SPSR的值传送到一个寄存器;MSR与之相反,它将一个寄存器的内容传送到CPSR或者SPSR。这两条指令结合,可用于对CPSR和SPSR进行读/写操作。表4.11表 状态寄存器指助记 当需要保存或修改当前模式下CPSR或SPSR的内容时,首先必须将这些内容传送到通用寄存器中,对选择的位进行修改,然后将数据回写到状态寄存器。对于ARM和Thumb的状态CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换。程序状态寄存器内容传输到ARM寄存器指令MRS。在ARMMRSCPSR或SPSR读出到通用寄存器中。将程序状态字内容到通用寄存器中后就可以对其进行计算、修改等操作。指令的编码格式如图4.46所示。4.46MRS ①cn>(on=L(lay。②确定指令的目标寄存器。如果 被用作目标寄存器,指令的执行结果不可预知 指令操作的 CPSRSPSR的内容时,首先必须将这些内容传送到R。这时需要先通过MSR(如压栈指令)将 值保存起来在进程切换时也需要保存当前程序状态寄存器的 将CPSR状态寄存器,保存到r1 将SPSR状态寄存器,保存到r2 MSR指令CPSR,用来判断ALU的状态标志或IRQ/FIQ中断是否允许等;在异SPSRMRSMSRCPSR或SPSR寄存器的读-修改-写操作,可用来进行处理器模式的切换或/使能IRQ/FIQ中断等设置。另外,进行切换或允许异常中断嵌套时,也需要使用MRS指令SPSR状态值保存起下面的例子使能IRQ 下面的例子IRQ中断 CPSR_c,r0 ARM寄存器内容传输到程序状态寄存器指令Register只有MSR指令可以直接设置状态寄存器CPSRSPSR。图4.47、图4.48分别显示了源操作数为立即数的MSR指令和源操作数为寄存器的指令的编码格式4.47源操作数为立即数的MSR4.48源操作数为寄存器的MSR ①cn>(on=L(lay。②域标志位,是下面选项中的一种或几种C:设置控制位掩码域(bit[16]X:设置扩展位掩码域(bit[17]S:设置状态位掩码域(bit[18]F:设置标志位掩码域③将被传送到CPSR和SPSR寄存器的立即数。此立即数可以为8位立即数(范围在0xff之间④指定的通用寄存器,此寄存器包含将要被传送状态寄存器中的数指令操作的伪代码如下面程序段所 Else/*opcode[25]==0*/ R==0field_mask[3]==1andfield_mask[3]==1andMRS5.指令举(1)使用“读-修改-写”模式更新CPSR寄存器r0,CPSR读CPSR;清除N、Z、C、V;CPSR;读CPSR;IRQ位;CPSR状态寄存IRQ;设置管理模式;设置管理模式堆;保存返回 ;设置中断模式堆 ARM通用寄存器和器内容交换指交换指令是load/Store指令的一种特殊形式。该指令将一个器单元内容与指定的寄存器内容相交换。交换指令为进程间同步提供了便的解决途径。该指令产生一对原子operation,操作期间其他任何指令对该单元的读/写。表4.12总结了ARM的交换指令。表 交换指助记 寄存器和器字数据换Rd←[Rd],[Rn] 寄存器和器字节数交Rd←[Rd],[Rn]←[Rm](Rn≠Rd或ARM通用寄存器和器字数据交换指令寄存器和器字交换指令SWP(Swap)用于将一个内存单元(该单元地址放在寄存器Rn中)的内容到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。指令的编码格式如图4.49所示。4.49

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论