ARM汇编指令条件码及相关标志位问题。

随便列几个条件码的例子如下:
EQ Z置位 相等
NE Z清零 不相等
CS/HS C置位 无符号数大于或等于

请问标志位的set或者clear是根据什么带条件码之前的语句结果得出的么?
比如说以下代码:
MOVS R0,R0
BNE Label ;书上的注释为:如果R0不为0,则跳转到Label标号处

MOV语句怎么能判断R0是不是为0呢?请问这个NE是怎么判断出来的呢?

这个得看具体是什么指令,根据执行的结果,来判断:
a,Z标志,是否为0;如比较指令产生相等的结果、计算结果为0;
b,N标志,是否为负;如果指令的结果被认为是有符号数,而它的第31位为1,那就会被设置为1;
c,C标志,是否有产生进位/借位,以及进行移位操作时作移出位使用;
d,V标志,有符号数进行运算,结果是否有溢出。

参考 www.juliantec.info 之前的回答: http://zhidao.baidu.com/question/251439540.html追问

我觉得cmp指令比较后的执行结果是很好理解的,
但是mov指令的执行结果是将一个寄存器的内容放在另一个寄存器中,怎么会影响到标志位呢?
比如说以下代码:
MOVS R0,R0
BNE Label ;书上的注释为:如果R0不为0,则跳转到Label标号处
十分感谢!!

追答

可以分成两种情况来考虑 movs 指令对标志位的影响:
a,假如目标寄存器非r15,也即非PC。那么看所移动的值是否为零或者是否为负来影响 cpsr 中的z标志和n标志;假如 movs 指令中还有移位操作,那么移出位还为被设置到 c标志中。
b,假如目标寄存器是 r15,那不管是 mov 还是 movs ,都会用 spsr 中的值来更新cpsr,其中的标志位自然会受到影响。
这两种情况下,都不会影响到 cpsr 中的 v标志。您可以直接参考 arm_arch_ref_manual 或者参与 JulianTec 的邮件列表像师兄师姐们请教。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-28
MOVS 目的寄存器,源操作数
其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
ARM 中很多指令在其后面加上 "S " 都会影响 CPSR中条件标志位, 如 MVNS, ANDS, ADDS...
相似回答