完整版ARM汇编指令英文全称及功能描述V20Word下载.docx
《完整版ARM汇编指令英文全称及功能描述V20Word下载.docx》由会员分享,可在线阅读,更多相关《完整版ARM汇编指令英文全称及功能描述V20Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
意义
N
Z
C
V
Q
DNZ(RAZ)系统扩展用
I
F
T
M4
M3
M2
M1
M0
各位
详细
当前指令运算结果为负时,N=1;
结果为非负时,N=0
运算结果为0,Z=1;
否则Z=0
上溢出、进位C=1;
下溢出、借位C=0
加减法V=1表示符号位溢出
I=1时,禁止IRQ中断
F=1时,禁止FIQ中断
T=0,ARM指令;
T=1,Thumb指令
M[4:
0]
0b10000
User
0b10001
FIQ
0b10010
IRQ
0b10011
Supervisor
0b10111
Abort
0b11011
Undefined
0b11111
System
对于32位的CPU架构,ARM指令由32位机器码组成,根据编码格式,ARM指令固定的格式如下:
Cond
Opcode
S
Rn
Rd
Shift_operand
多数ARM指令可以条件执行,执行的结果可以影响CPSR寄存器的Z、N、C或者V等状态标志位。
cond域不同的值所代表不同的意义。
Opcode域代表具体的指令,S为指令的后缀,可加可不加,指令后缀带S表示该指令的结果会影响CPSR寄存器。
指令的详细编码格式如下。
指令
格式
指令执行的条件编码,详细如下所示
opcode
指令操作符编码(更高版本的指令集操作码包含bit27、26、25)
决定指令的操作是否影响CPSR的值
目标寄存器编码
包含第一个操作数的寄存器编码
Shift_oprand
表示第二个操作数
Cond域的编码对应的意义如下。
Cond域描述
0000
EQ
Z=1
Equal
0001
NE
Z=0
Notequal,orunordered
0010
CS/HS
C=1
Carryset/Unsignedhigherorsame
Greatthanorequal,orunordered
0011
CC/LO
C=0
Carryclear/Unsignedlower
Lessthan
0100
MI
N=1
Negative
0101
PL
N=0
Positiveorzero
Greaterthanorequal,orunordered
0110
VS
V=1
Overflow
Unordered
0111
VC
V=0
Nooverflow
Notunordered
1000
HI
C=1且Z=0
Unsignedhigher
Greaterthan,orunordered
1001
LS
C=0或Z=1
Unsignedlowerorsame
Lessthanorequal
1010
GE
N=1且V=1或N=0且V=0
Signedgreaterthanorequal
Greaterthanorequal
1011
LT
N=1且V=0或N=0且V=1
Signedlessthan
Lessthan,orunordered
1100
GT
Z=0或N=V
Signedgreaterthan
Greatthan
1101
LE
Z=1或N!
=V
Signedlessthanorequal
Lessthanorequal,orunordered
1110
AL
Always(unconditional)
Opcode域的编码对应的意义如下。
Opcode域描述
AND
LogicalAND
EOR
LogicalExclusiveOR
SUB
Subtract
RSB
ReverseSubtract
ADD
Add
ADC
AddwithCarry
SBC
SubtractwithCarry
RSC
ReverseSubtractwithCarry
TST
Test
TEQ
TestEquivalence
CMP
Compare
CMN
CompareNegated
ORR
LogicalOR
MOV
Move
BIC
BitClear
1111
MVN
MoveNot
ARM指令及功能描述详表
指令格式:
指令{条件}{S}{目的Register},{OP1},{OP2}
"
{}"
中的内容可选。
即,可以不带条件只有目的寄存器,或
只有目的寄存器和操作数1,也可以同时包含所有选项。
“S”决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值
助记符
英文全称
示例、功能
跳
转
指
令
B
Branch
BLabel;
程序无条件跳转到标号Label处执行
BL
BranchwithLink
BLLabel;
当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中
BLX
BranchwithLinkandexchange
BLXLabel;
从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中
BX
Branchandexchange
BXLabel;
跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令
数
据
处
理
MOVR1,R0,LSL#3;
将寄存器R0的值左移3位后传送到R1
MoveNOT
MVNR0,#0;
将立即数0取反传送到寄存器R0中,完成后R0=-1
CMPR1,R0;
将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位
Comparenegative
CMNR1,R0;
将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位
TSTR1,#0xffe;
将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位
Testequivalence
TEQR1,R2;
将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位
ADDR0,R2,R3,LSL#1;
R0=R2+(R3<
<
1)
Addwithcarry
ADCSR2,R6,R10;
R2=R6+R10+!
C,且更新CPSR的进位标志位
SUBR0,R1,#256;
R0=R1–256
Subtractwithcarry
SUBSR0,R1,R2;
R0=R1-R2-!
C,并根据结果设置CPSR的进位标志位
Reversesubtract
RSBR0,R1,R2;
R0=R2–R1
Reversesubtractwithcarry
RSCR0,R1,R2;
R0=R2–R1-!
And
ANDR0,R0,#3;
该指令保持R0的0、1位,其余位清零。
OR
ORRR0,R0,#3;
该指令设置R0的0、1位,其余位保持不变。
ExclusiveOR
EORR0,R0,#3;
该指令反转R0的0、1位,其余位保持不变。
Bitclear
BICR0,R0,#0b1011;
该指令清除R0中的位0、1、和3,其余的位保持不变。
CLZ
Countleftzero
计算操作数最高端0的个数
乘
加
MUL
Multiply
MULR0,R1,R2;
R0=R1×
R2
MLA
Multiplyandaccumulate
MLASR0,R1,R2,R3;
R2+R3,同时设置CPSR中的相关条件标志位
SMULL
Signedmultiplylong
SMULLR0,R1,R2,R3;
R0=(R2×
R3)的低32位R1=(R2×
R3)的高32位
SMLAL
Signedmullandaccumulatel
SMLALR0,R1,R2,R3;
R0=(R2×
R3)的低32位+R0;
R1=(R2×
R3)的高32位+R1
UMULL
Unsignedmultiplylong
UMULLR0,R1,R2,R3;
R3)的低32位;
R1=(R2×
UMLAL
Unsignedmul&
accumulatelon
UMLALR0,R1,R2,R3;
R3)的低位+R0;
R3)的高32位+R1
PSR
访问
MRS
MovePSRtoregister
MRSR0,CPSR;
传送CPSR的内容到R0
MSR
MoveregistertoPSR
MSRCPSR_c,R0;
传送R0的内容到CPSR,但仅仅修改CPSR中的控制位域
加载/
存储
LDR
Loadword
LDRR0,[R1,R2]!
;
将存储器地址为R1+R2的字数据读入R0,并将新地址R1+R2写入R1。
LDRB
Loadbyte
LDRBR0,[R1,#8];
将存储器地址为R1+8的字节数据读入R0,并将R0的高24位清零
LDRH
Loadhalfword
LDRHR0,[R1];
将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零
LDM
Loadmultiple
LDMFDR13!
,{R0,R4-R12,PC};
将堆栈内容恢复到寄存器(R0,R4到R12,LR)
STR
Store
STRR0,[R1],#8;
将R0中的字数据写入R1为地址的存储器中,并将新地址R1+8写入R1
STRB
Storebyte
STRBR0,[R1,#8];
将寄存器R0中的字节数据写入以R1+8为地址的存储器中
STRH
Storehalfword
STRHR0,[R1,#8];
将寄存器R0中的半字数据写入以R1+8为地址的存储器中
STM
Storemultiple
STMFDR13!
,{R0,R4-R12,LR};
将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈
数据
交换
SWP
Swapword
SWPR0,R1,[R2];
R2所指的字数据传送到R0,同时R1的数据传送到R2所指的单元
SWPB
Swapbyte
SWPBR0,R1,[R2];
R2所指的字节数据传送到R0,R0高24位清零,同时R1低8位送R2所指单元。
移
位
LSL
Logicshiftleft
MOVR0,R1,LSL#2(ASL#2);
将R1中的内容左移两位后传送到R0中,低位用0填充
ASL
Arithmeticshiftleft
LSR
Logicshiftright
MOVR0,R1,LSR#2;
将R1中的内容右移两位后传送到R0中,左端用零来填充
ASR
Arithmeticshiftright
MOVR0,R1,ASR#2;
将R1中的内容右移两位后传送到R0中,左端用第31位的值来填充
ROR
Rotateright
MOVR0,R1,ROR#2;
将R1中的内容循环右移两位后传送到R0中
RRX
Rotaterightextended
左端用进位标志位C来填充
协处
理器
CDP
Dataoperations
LDC
Load
STC
MCR
MovetocoprocfrARMreg
MRC
MtoARMregfrcoprocessor
并行
前缀
Signedarithmeticmodulo28or216,setsCPSRGEbit
Signedsaturatingarithmetic
SH
Signedarithmetic,halvingresults
U
Unsignedarithmeticmodulo28or216,setsCPSRGEbit
UQ
Unsignedsaturatingarithmetic
UH
Unsignedarithmetic,halvingresults
批量
传输
地址
模式
Blockload/store
Stackpop/push
IA
Incrementafter
FD
Fulldescending
IB
Incrementbefore
ED
Emptydescending
DA
Decrementafter
FA
Fullascending
DB
Decrementbefore
EA
Emptyascending
ARM
寻址
方式
立即寻址
ADDR0,R0,#0x3f
R0←R0+0x3f
寄存器寻址
ADDR0,R1,R2
R0←R1+R2
间接寻址
ADDR0,R1,[R2]
R0←R1+[R2]
变址寻址
LDRR0,[R1,#4]
R0←[R1+4]
LDRR0,[R1,#4]!
R0←[R1+4]、R1←R1+4
LDRR0,[R1],#4
R0←[R1]、R1←R1+4
LDRR0,[R1,R2]
R0←[R1+R2]
多寄存器寻址
LDMIAR0,{R1,R2,R3,R4}
R1←[R0];
R2←[R0+4];
R3←[R0+8];
R4←[R0+12]
伪指令及伪操作
符号
定义
GBLA/LCLA
定义一个全局/局部的数字变量,并初始化为0
GBLL/LCLL
定义一个全局/局部的逻辑变量,并初始化为F(假)
GBLS/LCLS
定义一个全局/局部的字符串变量,并初始化为空
SETA/SETL/SETS
给一个数学/逻辑/字符串变量赋值
RLIST
对一个通用寄存器列表定义名称,访问次序为根据寄存器的编号由低到高,与排列次序无关
DCB(=)/DCW(DCWU)
分配一片连续的字节/半字存储单元并用指定的数据初始化
后缀U表示不要求对齐
DCFS(DCFSU)/DCFD(DCFDU)
分配一片连续的(单/双精度的浮点数)字存储单元并用指定的数据初始化
DCQ(DCQU)/DCD(DCDU)
用于分配一片以双字/字为单位的连续的存储单元并用指定的数据初始化
DCDO
分配字内存但愿,初始化为标号基于静态基址寄存器R9的偏移量
DCI
和DCD类似,不同处在于DCI内存中的数据被标识为指令
SPACE(%)
DataSpaceSPACE100;
分配连续100字节的存储单元并初始化为0
MAP(^)
MAP0x100,R0;
定义结构化内存表首地址的值为0x100+R0
FIELD(#)
AFIELD16;
定义A的长度为16字节
控制
伪
IF、ELSE、ENDIF
IF逻辑表达式
指令序列1
ELSE
指令序列2
ENDIF
IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。
当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。
其中,
ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行
指令序列1,否则继续执行后面的指令。
WHILE、WEND
WHILE逻辑表达式
指令序列
WEND
WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。
当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。
MACRO、MEND
MEXIT
MACRO
$标号宏名$参数1,$参数2,……指令序列
MEND
$标号在宏指令被展开时,标号会被替换为用户定义的符号,
宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。
MEXIT用于从宏定义中跳转出去
AREA
AREA段名属性1,属性2,……
用于定义一个代码段或数据段。
其中,段名若以数字开头,则该段名需用“|”括起来,如|1_test|。
ALIGN
AREAInit,CODE,ALIEN=3
指定后面的指令为8字节对齐
CODE
CODE16、CODE32
指定指令序列为