ARM指令可以通过添加适当的条件码前缀来达到条件执行的目的。
这样可以提高代码密度,减少分支跳转指令数目,提高性能;
比如:
CMP r3,#0 ---比较r3和0
BEQ skip ---相等就跳到skip
ADD r0,r1,r2 ---不相等就执行 r0 = r1 + r2
skip
……
看看加后缀简化后的样子:
CMP r3,#0 ---比较r3和0
ADDNE r0,r1,r2 ---加了NE后缀,不相等就执行r0 = r1 + r2
2.默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。
CMP不需要增加“S”就可以改变相应的标志位。
1)、什么是标志位?
即条件码标志位,就是程序执行的条件,每执行完一个指令条件标志位就会改变;
是前面“ARM寄存器详解“里面讲到的CPSR:
1.高4位:NZCV
2)、加S怎样影响标志位?
如:SUBS r3,r3,#0 ---r3 = r3 - 0
BEQ skip ---如果相等就跳转
注:这个S的意义是:执行SUB后如果不相等的话,CPSR的Z清0(置1),按照这个条
件再继续执行下面的。而CMP是默认可以改变标志位的,就不需要加S。
3.处理器如何知道根据指令来更改对应的条件标志位呢?
这里说的单指数据处理指令,其他指令的话不需要运算就不需要改变CPSR的标志位;
数据处理指令的机器码格式:
这些是一一对应的:条件码对应指令后缀(写指令的时候需要写出来的)对应标志位;