ARM 指令集表格
STR{<cond>}T <Rd>,<addr>
同STR指令,但无论指令处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作
LDM批量数据加载指令
LDM{<cond>}{type} <Rn>{!},<reg>{^}
从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示
CMP比较指令
CMP{<cond>} <Rn>,<op1>
将寄存器Rn的值和操作op1所表示的值进行比较,根据结果更新CPSR中条件标志位的值
CMP R0,#5 ;计算R0-5,根据结果设置条件标志位
CMN反值比较指令
CMN{<cond>} <Rn>,<op1>
同CMP指令,但寄存器Rn的值是和op1取反的值进行比较
Rd=op2-Rn-!carry
RSC R1,R5,R3 ;高32位相减
MUL 32位乘法指令
gt;,<op2>
Rd=Rn*op2
MULS R0,R1,R2 ;R0=R1*R2
MLA 32位乘法指令
MLA{<cond>}{S} <Rd>,<Rn>,<op2>,<op3>
B exit;跳转到标号exit处
BL带返回的跳转指令
BL{<cond>} <addr>
同B指令,但BL指令执行跳转操作的同时,还将PC的值保存到LR寄存器中
BL func;调用子程序func
BLX带返回和状态切换的跳转指令
BLX <addr>或BLX <Rn>
处理器跳转到目的地址处,从那继续执行,并将Pc的值保存到LR寄存器中
MSR CPSR_f,R0 ;用R0的值修改CPSR的条件标志位
5、协处理器指令
指令
格式
功能
举例
CDP协处理器数据操作指令
CDP{<cond>} <p>,<opcode1>,<CRd>,<CRm>,<CRn>,<opcode2>
用于传送指令给协处理器p,要求其在寄存器CRn和CRm上进行操作opcode1,并把结果存放到CRd中
SWPB字节数据交换指令
SWP{<cond>}B <Rd>,<op1>,[<op2>]
从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0,然后将寄存器op1的低8位数据存储到同一内存地址中
4、程序状态寄存器指令
指令
格式
功能
举例
MRS程序状态寄存器到通用寄存器的数据传送
ADC{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn+op2+carry
ADDS R0,R2,R4;低32位相加,S表示结果影响条件标志位的值
SUB减法指令
SUB{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn-op2
SUB R0,R1,#5;R0=R1-5
RSB反向减法指令
EOR逻辑异或指令
EOR{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn EOR op2
EOR R0,R0,#5 ;R0的第0位和第2位取反,其余位不变
BIC位清除指令
BIC{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn AND (!op2)
BIC R0,R0,#5 ;R0的第0位和第2位清零,其余位不变
同LDR指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的内存操作
STR字数据存储指令
STR{<cond>} <Rd>,<addr>
把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器
STR Rd,[Rn] ;存储Rd到Rn所包含的有效内存地址单元中
SMLAL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>
Rdh Rdl=Rn*op2+Rdh Rdl
SMLAL R2,R3,R7,R6 ;(R3,R2)=R7*R6+(R3,R2)
UMULL 64位无符号数乘法指令
UMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>
BLX T16;跳转到标号T16处,T16后面的指令是thumb指令
BX带状态切换的跳转指令
BX <Rn>
处理器跳转到目的地址处,从那继续执行;目标地址为寄存器Rn的值和0xFFFFFFFE进行与操作的结果
ADR R0,exit ;标号exit处的地址装入R0中BX R0;跳转到exit处,并根据R0的最低位来切换处理器状态
AND逻辑与指令
AND{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn AND op2
AND R0,R0,#5 ;保持R0的第0位和第2位,其余位清零
ORR逻辑或指令
ORR{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn OR op2
ORR R0,R0,#5 ;R0的第0位和第2位设置为1,其余位不变
STM批量数据存储指令
STM{<cond>}{<type>} <Rn>{!},<reg>{^}
将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示
SWP字数据交换指令
SWP{<cond>} <Rd>,<op1>,[<op2>]
Rd=[op2],[op2]=op1
STC协处理器数据存储指令
STC{<cond>}{L} <p>,<CRd>,<addr>
将寄存器CRd的值传送到addr表示的内存地址中
STC p5,c1,[R1+5] ;将协处理器p5中寄存器c1的数据传送到R1+5所对应的存储单元中
MCR ARM寄存器到协处理器寄存器的数据传送指令
MCR{<cond>} <p>,<op1>,<Rd>,<CRn>,<CRm>,{op2}
将寄存器Rn的值和操作op1所表示的值按位进行逻辑异或操作,根据结果更新CPSR中条件标志位的值,但不存储结果
TEQ R0,R1 ;比较R0与R1是否相等
2、跳转指令
指令
格式
功能
举例
B跳转指令
B{<cond>} <addr>
一旦遇到B指令,ARM处理器将立即跳转到给定的地址addr,从哪里继续执行。
STRB字节数据存储指令
STR{<cond>}B <Rd>,<addr>
将寄存器Rd中的低8位字节数据保存到addr所表示的内存地址中
STRB R0,[R1];将寄存器R0中的低8位数据存入R1表示的内存地址中
STRBT用户模式的字节数据存储指令
STR{<cond>}BT <Rd>,<addr>
同STRB指令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下的内存操作
STRH半字数据存储指令
STR{<cond>}H <Rd>,<addr>
将寄存器Rd中的低16位半字数据保存到addr所表示的内存地址中,而且addr所表示的地址必须是半字对齐的
STRH R0,[R1] ;将寄存器R0中的低16位数据存入R1表示的内存地址低有效半字中
STRT用户模式的字数据存储指令
MVN数据取反传送指令
MVN{<cond>}{S} <Rd>,<op1>
Rd=!op1
MVN R1,R2;将R2按位取反结果存到R1
ADD加法指令
ADD{<cond>}{S} <Rd>,<Rn>,<op2>
Rd=Rn+op2
ADD R0,R1,R2,LSL#5;R0=R1+R2左移5位
ADC带进位加法指令
LDR{<cond>}B <Rd>,<addr>
同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清零
LDRB R0,[R0] ;将内存中起始地址为R1的一个字节数据装入R0中
LDRBT用户模式的字节数据加载指令
LDR{<cond>}BT <Rd>,<addr>
ARM指令集
ARM指令集由数据处理指令、跳转指令、Load/Store指令、程序状态寄存器指令、协处理器指令和软件中断指令六大类构成。