2013-7-16 条件执行
在ARM的指令编码表中,统一占用编码的最高4位[31:28]来表示条件码,即cond。
每种条件码用两个英文缩写字符表示其含义,可添加在指令助记符的后面,表示指令执行时必须要满足的条件。ARM指令根据CPSR中的条件位自动判断是否执行指令。在条件满足时,指令执行;否则,指令被忽略(可认为执行了一条NOP伪指令)。
指令的条件码:
操作码[31:28] | 助记符扩展 | 解释 | 用于执行的标志位状态 |
0000 | EQ | 相等/等于0 | Z置位 |
0001 | NE | 不等 | Z清零 |
0010 | CS/HS | 进位/无符号数高于或等于 | C置位 |
0011 | CC/LO | 无进位/无符号数小于 | C清零 |
0100 | MI | 负数 | N置位 |
0101 | PL | 正数或0 | N清零 |
0110 | VS | 溢出 | V置位 |
0111 | VC | 未溢出 | V清零 |
1000 | HI | 无符号数高于 | C置位Z清零 |
1001 | LS | 无符号数小于或等于 | C清零Z置位 |
1010 | GE | 有符号数大于或等于 | N等于V |
1011 | LT | 有符号数小于 | N不等于V |
1100 | GT | 有符号数大于 | Z清零且N等于V |
1101 | LE | 有符号数小于或等于 | Z置位且N不等于V |
1110 | AL | 总是 | 任何状态 |
1111 | NV | 从不(不使用) | 无 |
指令的条件码针对的对象是CPSR中的条件码标志。
CPSR的[31:28],最高4位称为条件标记位,注意这和指令的条件码很像,但不是同一个东西。
CPSR[31]:N,Negative。在结果是有符号的二进制补码情况下,如果结果是负数,则N=1;如果结果为非负数,则N=0。
CPSR[30]:Z,Zero。如果结果为0,则Z=1;如果结果为非0,则Z=0。
CPSR[29]:C,Carry。其设置分以下几种情况:
1).对于加法指令(包括比较指令CMN),如果产生进位,则C=1;否则C=0。
2).对于减法指令(包括比较指令CMP),如果产生借位,则C=0;否则C=1。
3).对于有移位操作的非加减法指令,C为移位操作中最后移出位的值。
4).对于其他指令,C通常不变。
CPSR[28]:V,Overflow。其设置分为以下2种情况:
1).对于加减法指令,在操作数和结果是有符号的整数时,如果发生溢出,则V=1;如果无溢出发生,则V=0。
2).对于其他指令,V通常不发生变化。
2013-7-17 指令分类及指令格式
1.指令分类简述
ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他类型的指令是基于处理器内部的寄存器操作完成。
ARM指令集可分为6大类:数据处理指令、Load/store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。
2.指令格式
ARM指令使用的基本格式如下:
<opcode> {<cond>}{S} <Rd>,<Rn> {,<operand2>}
3.基本指令格式说明
指令格式中所用的英文缩写符号说明如下:
opcode 操作码;指令助记符,如LDR、STR等。
cond 可选的条件码;执行条件,如EQ、NE等。
S 可选后缀;若指定S,则根据指令执行结果更新CPSR中的条件码。
Rd 目标寄存器。
Rn 存放第1操作数的寄存器。
operand2 第2个操作数。
指令基本格式中“<>”和“{}”的说明:
“<>”内的项是必需的,例如,<opcode>是指令助记符,这是必须书写的。
“{}”内的项是可选的,例如,{<cond>}为指令执行条件,是可选项。若不书写,则使用默认条件AL(无条件执行)
4.指令格式举例
LDR R0,[R1] ;读取R1地址上的存储单元内容到R0,执行条件AL
BEQ DATAEVEN ;条件执行分支指令,执行条件EQ,即相等则跳转到DATAEVEN
ADDS R2,R1,#1 ;加法指令,R2 = R1 + 1,影响CPSR寄存器(S)
SUBNES R2,R1,#0x20 ;条件执行的减法运算,执行条件NE,R2 = R1 - 0x20,影响CPSR寄存器(S)