条件码
在指令中,有4位用来表示条件,也就是有16种条件。如果当前条件满足,则继续执行,否则这条指令将被忽略。
结果标志主要是被数据操作指令设置和清除,这些指令只有在你强调其应该操作标志位的时候才会影响标志位,比如MOV不会影响标志位,但是MOVS(mov with set)就会设置标志位。
接下来我们就要看一些指令条件,是通过在指令后面加上2个字母的后缀来表明的。
AL(ALways)
这个指令即表示总是,也就是指令将总是会被执行,如果没有表明条件,这个条件将会是默认的。
NV(NeVer)
所有的ARM条件指令都有相对应的相反的条件指令,AL就对应NV,NV就表示永不执行,可以用来占位或者消耗掉很小的一段时间。
EQ(EQual)
这个条件在Z标志位为1的时候被认为是true(关于标志位可参见第一篇)。Z标志位主要是由比较指令和一些可能会使得目标为0的指令来产生。
NE(Not Equal)
和EQ正好相反。
VS(oVerflow Set)
这个条件在V(溢出标志)为1的时候被认为是true,加法减法和比较指令会影响这个标志位。
VC (oVerflow Clear)
和VS相反
MI (MInus)
这个条件在N(负数标志)为1的时候被认为是true。N标志在最后一个数据操作使得数据为负的时候被设置。
PL(PLus)
和MI正好相反
CS (Carry Set)
从本指令开始的4个指令常被用来比较2个无符号数。
CS指令的意思是当C(进位标志)是1的时候认为为true。C标志被算术操作,比如加法、减法、比较、移位等影响。
用作比较的时候,可以被翻译为大于等于,所以也可以用HS(Higher or Same)来代替这个标志。
CC(Carry Clear)
为CS的相反情况,在比较的时候,也可以用来表示小于,所以也可以写作LO(LOwer than)
HI(HIgher)
这个标志位在C标志为1且Z标志为0的时候被认为是true,在比较或者减法之后,这个组合可以被解释为左边的操作数大于右边的数(无符号数)。 (根据前几条命令,我们可以知道C表示大于等于,Z表示等于,大于等于且不等于,则为大于。)
LS(Lower or Same)
和上一条条件相反,C为0Z为1时为true,即左边的数小于等于右边的数。
GE(Greater than or Equal
从本指令开始的4条指令常被用来比较有符号数
本指令在N为0,V为0或者N为1V为1时为true。(大于等于)
LT(Less Than)
为上一条指令的相反,N为1V为0或者N为0V为1。小于
GT(Greater Than)
和GE类似,不过Z必须为0。 表示大于
LE(Less than or Equal)
和LT类似,不过在Z为1的时候始终为true。 表示小于等于
第一类-数据操作
这一类包含16个指令,指令语法较为相似,我们以ADD为例,然后其他指令说一下不同的部分。
汇编典型格式
以add为例:
ADD{cond}{S} <dest>, <lhs>, <rhs>
花括号里的是可选的。
- cond:条件码,如果忽略则为AL
- S:如果有S,则这条指令影响标志位。
- dest:目的地,即存储结果的寄存器号,比如R0,R1等等。
- lhs:永远是一个寄存器号,左边的操作数
- rhs:右操作数比较复杂,再解释完移位操作再详细解释,其语法为