MOVS 目的寄存器,源操作数
          其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
          ARM 中很多指令在其后面加上 "S " 都会影响 CPSR中条件标志位, 如 MVNS, ANDS, ADDS...









CPSR格式


编辑


CPSR格式如下所示。SPSR和CPSR格式相同。


31 30 29 28 27 26 7 6 5 4 3 2 1 0


N Z C V Q DNM(RAZ) I F T M4 M3 M2 M1 M0


***条件标志位***


N——本位设置成当前指令运算结果的bit[31]的值。当两个表示的有符号整数运算时,n=1表示运算结果为负数,n=0表示结果为正数或零。


z——z=1表示运算的结果为零;z=0表示运算的结果不为零。对于CMP指令,Z=1表示进行比较的两个数大小相等。


C——下面分四种情况讨论C的设置方法:


在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号运算发生溢出(overflow);其他情况C=0。


在减法指令中(包括比较指令CMP),当运算中发生借位,则C=0,表示无符号运算数发生进位;其他情况下C=1。


对于包含移位操作的非加减运算指令,C中包含最后一次溢出的位的数值


对于其他非加减运算指令,C位的值通常不受影响


V——对于加减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出;通常其他指令不影响V位。


***Q标识位***


在ARM V5的E系列处理器中,CPSR的bit[27]称为q标识位,主要用于指示增强的dsp指令是否发生了溢出。同样的spsr的bit[27]位也称为q标识位,用于在异常中


断发生时保存和恢复CPSR中的Q标识位。


在ARM V5以前的版本及ARM V5的非E系列的处理器中,Q标识位没有被定义。


***CPSR中的控制位***


CPSR的低八位I、F、T、M[4:0]统称为控制位。当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。


**中断禁止位:当I=1时禁止IRQ中断,当F=1时禁止FIQ中断


**T控制位:T控制位用于控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。对于ARM V4以更高版本的T系列ARM处理器,T控制位含义如下:


T=0表示执行ARM指令


T=1表示执行Thumb指令


对于ARM V5以及更高版本的非T系列处理器,T控制位的含义如下


T=0表示执行ARM指令


T=1表示强制下一条执行的指令产生未定指令中断


***M控制位***


M控制位控制处理器模式,具体含义如下:


M[4:0] 处理器模式 可访问的寄存器


ob10000 user pc,r14~r0,CPSR


0b10001 FIQ PC,R14_FIQ-R8_FIQ,R7~R0,CPSR,SPSR_FIQ


0b10010 IRQ PC,R14_IRQ-R13_IRQ,R12~R0,CPSR,SPSR_IRQ


0B10011 SUPERVISOR PC,R14_SVC-R13_SVC,R12~R0,CPSR,SPSR_SVC


0b10111 ABORT PC,R14_ABT-R13_ABT,R12~R0,CPSR,SPSR_ABT


0b11011 UNDEFINEED PC,R14_UND-R8_UND,R12~R0,CPSR,SPSR_UND


0b11111 SYSTEM PC,R14-R0,CPSR(ARM V4以及更高版本)


***CPSR中的其他位***


这些位用于将来扩展。应用软件不要操作这些位。


CPSP也叫恒功率调速比,是英文constant power speed ratio的缩写。常出现于永磁电机控制方法中。








整型有无符号(unsigned)和有符号(signed)两种类型;
  在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。







TST指令是数据处理指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。     例如:TST R1,#%1用于测试在寄存器R1中是否设置了最低位。
BEQ指定是跳转指令,但是跳转要满足一定的条件,例:CMP    R1,#0    BEQ  Label    即当R1和0相等的时候程序跳到标号Label处执行,



B或BL指令引起处理器转移到“子程序名”处开始执行。两者的不同之处在于BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链 接寄存器)。由于BL指令保存了下条指令的地址,因此使用指令“MOV PC ,LR”即可实现子程序的返回。而B指令则无法实现子程序的返回,只能实现单纯的跳转。用户在编程的时候,可根据具体应用选用合适的子程序调用语句。



LDR指令的格式为:
 LDR{条件}  目的寄存器,<存储器地址>
 LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器
 中读取32位的字数据到通用寄存器,然后对数据迕行处理。
               LDR R0,[R1]         ;将存储器地址为R1的字数据读入寄存器R0。
               LDR R0,[R1,R2]  ;将存储器地址为R1+R2的字数据读入寄存器R0。
               LDR R0,[R1,#8]   ;将存储器地址为R1+8的字数据读入寄存器R0。
               LDR R0,[R1,R2]!;将存储器地址为R1+R2的字数据读入寄存器R0,幵将新地址R1+R2写入R1。
               LDR R0,[R1,#8]!  ;将存储器地址为R1+8的字数据读入寄存器R0,幵将新地址R1+8写入R1。
               LDR R0,[R1],R2  ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2写入R1。
               LDR R0,[R1,R2,LSL#2]!  ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
               LDR R0,[R1],R2,LSL#2  ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2×4写入R1。”




STR指令的格式为:
 STR{条件}  源寄存器,<存储器地址>
 STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常
 用,丏寻址方式灵活多样,使用方式可参考指令LDR。


 指令示例:
 STR R0,[R1],#8             ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
 STR R0,[R1,#8]             ;将R0中的字数据写入以R1+8为地址的存储器中。”



 str     r1, [r0]                       ;将r1寄存器的值,传送到地址值为r0的(存储器)内存中





 条件码表




条件码助记符 标志 含义
EQ Z=1 相等
NE Z=0 不相等
CS/HS C=1 无符号数大于或等于
CC/LO C=0 无符号数小于
MI N=1 负数
PL N=0 正数
VS V=1 溢出
VC V=0 没有溢出
HI C=1,Z=0 无符号数大于
LS C=0,Z=1 无符号数小于或等于
GE N=V 带符号数大于或等于
LT N!=V 带符号数小于
GT Z=0,N=V 带符号数大于
LE Z=1,N!=V 带符号数小于或等于
AL   任何无条件执行(指令默认条件)



条件码应用举例:
 1、比较两个值大小,C代码如下:
 if(a>b) a++;
 else b++;
 写出相应的ARM指令
 代码如下:设R0为a,R1为b
 CMP R0, R1              ; R0与R1比较
 ADDHI R0,R0,#1      ; 若R0>R1,则R0=R0+1
 ADDLS R1,R1,#1     ; 若R0<=R1,则R1=R1+1




CMN 比较取负的值:CMN{条件}  <op1>, <op2> ; status = op1 - (- op2) CMP 比较:
CMP{条件} <op1>, <op2> ; status = op1 - op2
TEQ 测试等价:TEQ{条件} <op1>, <op2> ; Status = op1 EOR op2
TST 测试位:TST{条件} <op1>, <op2> ;   Status = op1 AND op2





equ是一个代码替换指令
比如:
s equ bx+si
mov cx,[s]
那么上面两句代码相当于如下指令:
mov cx,[bx+si]




STR是ARM汇编中的内存访问指令,表示字数据写入,用于将一个32位的字数据写入到指令中指定的内存单元。 比如STR R0, [R1, #0x100];表示将R0中的字数据保存到内存单元(R1+0x100)中。