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)