各标志位的意义如下:
一切ARM数据处理指令的乘法指令均可挑选运用S后缀,并影响状况标志位。而其它指令一般不允许加S后缀,如B 、LDR、SWI、MRS等。
N运算成果的最高位反映在该标志位。关于有符号二进制补码,成果为负数时N=1,成果为正数或零时N=0;
例如:碑文movs r0,#0x7FFFFFFF后N=0;由于R0最高位为0
碑文movs r0,#0x80000000后N=1;由于R0最高位为1
碑文CMP r0,r0后N=0;由于R0-R0=0x00000000;
故N一般看方针寄存器的最高位,即N = Rd[31]。
Z指令成果为0时Z=1(一般一共比较成果“持平”),不然Z=0;
例如:碑文CMP r0,r0后Z=1
碑文MOVS R0,#0后Z=1
故Z一般看方针寄存器的值是否为0,Rd=0时Z=1,不然Z=0。
C当进行加法运算(包含CMN指令),而且最高位产生进位时C=1,不然C=0。当进行减法运算(包含CMP 指令),
而且最高位产生借位时C=0,不然C=1。关于结合移位操作的非加法/减法指令,C为从最高位最终移出的值,
其它指令C一般不变;
例如:碑文 mov r0,#0xF0000000
ADDS R0,R0,R0
后C=1;
碑文 SUBS R2,R2,R2后C=1,由于R2-R2=0不需要借位。
碑文 CMP R3,R3后C=1;
碑文MOV R1,0x80000000
movs r0,r1 ,lsr #32
后C=1;
碑文mov r0,#0x10
mov r1,#0x7FFFFFFF
subs r3,R0,r1 ,lsr #1
后C=0;
总归,一般情况下加法进位,减法无借位时C=1;关于结合移位操作的非加/减法指令,C为最终移出的值。
V当进行加法/减法运算,而且产生有符号溢出时V=1,不然V=0,其它指令V一般不变。
例如:碑文mov r1,#0x80000000
adds r1,r1,r1 后V=1;
碑文 mov r1,#0x70000000
adds r1,r1,r1或 CMN R1,R1 后V=1;
碑文 LDR R0,=0x8000000
LDR R1,=0x7FFFFFFF
CMP R0,R1 后V=1;
总归,两个负数运算成果第31位为0,则V=1
两个正数运算成果第31位为1,则V=1。
别的THUMB指令一般不需要S后缀,便能影响状况标志位。
如在THUMB状况下下面两条指令相同
movs r0,#0x00
mov r0,#0x00
MOVS总是会影响CPSR, 包含N,Z,C标志位
碑文MOV pc, lr,可能会影响到T标志位,碑文MOVS pc, lr时,CPSR会被SPSR掩盖(内核态)
在Thumb代码里不能运用B跳转到ARM代码,由于T标志不会切换,即便跳到ARM代码,
也会依照Thumb方法来碑文,BX是跳特别指令,会依据方针寄存器地址来切换T标志。