ARM及Thumb指令集
课程安排
ARM指令集
Thumb指令集
v5TE体系结构扩展
ARM指令编码格式
说明
Cond
指令执行的条件编码
Opcode
指令操作符编码
S
决定指令的操作是否影响CPSR的值
Rd
操作目标寄存器编码
Rn
包含第一操作数的寄存器编码
Shifter_operand
表示第二操作数
cond
001
opcode
s
Rn
Rd
Shifter_operand
31 28 27 25 24 21 20 19 16 15 12 11 8 7 0
ARM指令可以通过添加适当的条件码后缀来达到条件执行的目的。
这样可以提高代码密度,减少分支跳转指令数目,提高性能。
CMP r3,#0 CMP r3,#0 BEQ skip ADDNE r0,r1,r2 ADD r0,r1,r2skip
默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。 CMP不需要增加 “S”就可改变相应的标志位。
loop … SUBS r1,r1,#1 BNE loop
条件执行及标志位
如果 Z标志清零则跳转
R1减1,并设置标志位
Condition Codes
不等于(Not equal)
无符号的大于或等于
无符号的小于
负数(Minus)
等于(Equal)
溢出(Overflow)
没溢出
无符号的大于
无符号的小于或大于
正数或零
小于(Less Than)
大于(Greater Than)
小于等于
总是执行(Always)
大于等于
EQ
NE
CS/HS
CC/LO
PL
VS
HI
LS
GE
LT
GT
LE
AL
MI
VC
Suffix
描述
Z=0
C=1
C=0
Z=1
测试的标志位
N=1
N=0
V=1
V=0
C=1 & Z=0
C=0 or Z=1
N=V
N!=V
Z=0 & N=V
Z=1 or N=!V
下表为所有可能的条件码:
注意:AL为默认状态,不需要单独指出
条件执行示例
一系列的指令都使用条件指令
if (a==0) func(1);
CMP r0,#0MOVEQ r0,#1BLEQ func
置标志位,再使用不同的条件码
if (a==0) x=0;if (a>0) x=1;
CMP r0,#0MOVEQ r1,#0MOVGT r1,#1
使用条件比较指令
if (a==4 || a==10) x=0;
CMP r0,#4CMPNE r0,#10MOVEQ r1,#0
Branch : B{<cond>} label
Branch with Link : BL{<cond>} subroutine_label
处理器把偏移量左移两位,进行符号扩展后再与PC相加
跳转范围:± 32 Mbyte
如何执行长跳转?
28
31
24
0
Cond 1 0 1 L 偏移量
条件码区域
Link bit 0 = Branch
1 = Branch with link
23
25
27
分支指令
数据处理指令
包括:
算术指令: ADD ADC SUB SBC RSB RSC
逻辑指令: AND ORR EOR BIC
比较指令: CMP CMN TST TEQ
数据搬移: MOV MVN
上述指令只能对寄存器操作,不能针对存储器。
语法:
<操作>{<cond>}{S} Rd, Rn, Operand2
只有比较指令影响标志位 -不指定Rd
数据搬移不指定Rn
第二个操作数通过桶型移位器送到ALU中。
桶型移位器
Destination
CF
0
Destination
CF
LSL : Logical Left Shift
ASR: Arithmetic Right Shift
(无符号数)乘2
除2,并保留符号位
Destination
CF
...0
Destination
ARM及THUMB指令集 来自淘豆网m.daumloan.com转载请标明出处.