指令格式:指令{条件}{S}{目的Register},{OP1},{OP2}{}中的内容可选。即,可以不带条件只有目的寄存器,或只有目的寄存器和操作数1,也可以同时包含所有选项。“S”决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值助记符英文全称示例、功能跳转指令BBranch跳转指令BLabel;程序无条件跳转到标号Label处执行BLBranchwithLink带返回的跳转指令BLLabel;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中BLXBranchwithLinkandexchange带返回和状态切换的跳转指令BLXLabel;从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中BXBranchandexchange带状态切换的跳转指令BXLabel;跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令数据处理MOVMove数据传送MOVR1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1MVNMoveNOT数据非传送MVNR0,#0;将立即数0取反传送到寄存器R0中,完成后R0=-1CMPCompare比较指令CMPR1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位CMNComparenegative负数比较指令CMNR1,R0;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位TSTTest位测试指令TSTR1,#0xffe;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位TEQTestequivalence相等测试指令TEQR1,R2;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位ADDAdd加法运算指令ADDR0,R2,R3,LSL#1;R0=R2+(R31)ADCAddwithcarry带进位加法ADCSR2,R6,R10;R2=R6+R10+!C,且更新CPSR的进位标志位SUBSubtract减法运算指令SUBR0,R1,#256;R0=R1–256SBCSubtractwithcarry带进位减法指令SUBSR0,R1,R2;R0=R1-R2-!C,并根据结果设置CPSR的进位标志位RSBReversesubtract逆向减法指令RSBR0,R1,R2;R0=R2–R1RSCReversesubtractwithcarry带进位逆向减法指令RSCR0,R1,R2;R0=R2–R1-!CANDAnd逻辑与操作指令ANDR0,R0,#3;该指令保持R0的0、1位,其余位清零。ORROR逻辑或操作指令ORRR0,R0,#3;该指令设置R0的0、1位,其余位保持不变。EORExclusiveOR逻辑异或操作指令EORR0,R0,#3;该指令反转R0的0、1位,其余位保持不变。BICBitclear位清除指令BICR0,R0,#0b1011;该指令清除R0中的位0、1、和3,其余的位保持不变。CLZCountleftzero计算操作数最高端0的个数乘加指令MULMultiply32位乘法指令MULR0,R1,R2;R0=R1×R2MLAMultiplyandaccumulate32位乘加指令MLASR0,R1,R2,R3;R0=R1×R2+R3,同时设置CPSR中的相关条件标志位SMULLSignedmultiplylong64位有符号数乘法指令SMULLR0,R1,R2,R3;R0=(R2×R3)的低32位R1=(R2×R3)的高32位SMLALSignedmullandaccumulatel64位有符号数乘加指令SMLALR0,R1,R2,R3;R0=(R2×R3)的低32位+R0;R1=(R2×R3)的高32位+R1UMULLUnsignedmultiplylong64位无符号数乘法指令UMULLR0,R1,R2,R3;R0=(R2×R3)的低32位;R1=(R2×R3)的高32位UMLALUnsignedmul&accumulatelon64位无符号数乘法指令UMLALR0,R1,R2,R3;R0=(R2×R3)的低位+R0;R1=(R2×R3)的高32位+R1PSR访问MRSMovePSRtoregister程序状态寄存器到通用寄存器的数据传送指令MRSR0,CPSR;传送CPSR的内容到R0MSRMoveregistertoPSR通用寄存器到程序状态寄存器的数据传送指令MSRCPSR_c,R0;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域加载/存储指令LDRLoadword字数据加载指令LDRR0,[R1,R2]!;将存储器地址为R1+R2的字数据读入R0,并将新地址R1+R2写入R1。LDRBLoadbyte字节数据加载指令LDRBR0,[R1,#8];将存储器地址为R1+8的字节数据读入R0,并将R0的高24位清零LDRHLoadhalfword半字数据加载指令LDRHR0,[R1];将存储器地址为R1的半字数据读入寄存器R0,并将R0的高16位清零LDMLoadmultiple批量数据加载指令LDMFDR13!,{R0,R4-R12,PC};将堆栈内容恢复到寄存器(R0,R4到R12,LR)STRStore字数据存储指令STRR0,[R1],#8;将R0中的字数据写入R1为地址的存储器中,并将新地址R1+8写入R1STRBStorebyte字节数据加载存储指令STRBR0,[R1,#8];将寄存器R0中的字节数据写入以R1+8为地址的存储器中STRHStorehalfword半字数据存储指令STRHR0,[R1,#8];将寄存器R0中的半字数据写入以R1+8为地址的存储器中STMStoremultiple批量数据存储指令STMFDR13!,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈数据交换SWPSwapword字数据交换指令SWPR0,R1,[R2];R2所指的字数据传送到R0,同时R1的数据传送到R2所指的单元SWPBSwapbyte字节数据交换指令SWPBR0,R1,[R2];R2所指的字节数据传送到R0,R0高24位清零,同时R1低8位送R2所指单元。移位指令LSLLogicshiftleft逻辑左移操作MOVR0,R1,LSL#2(ASL#2);将R1中的内容左移两位后传送到R0中,低位用0填充ASLArithmeticshiftleft算术左移操作LSRLogicshiftright逻辑右移操作MOVR0,R1,LSR#2;将R1中的内容右移两位后传送到R0中,左端用零来填充ASRArithmeticshiftright算术右移操作MOVR0,R1,ASR#2;将R1中的内容右移两位后传送到R0中,左端用第31位的值来填充RORRotateright循环右移操作MOVR0,R1,ROR#2;将R1中的内容循环右移两位后传送到R0中RRXRotaterightextended带拓展的循环右移操作左端用进位标志位C来填充协处理器CDPDataoperations协处理器数操作指令LDCLoad协处理器数据加载指令STCStore协处理器数据存储指令MCRMovetocoprocfrARMreg处理器寄存器到协处理器寄存器的数据传送指令MRCMtoARMregfrcoprocessor协处理器寄存器到处理器寄存器的数据传送指令PSRfieldF(Flagsfieldmaskbyte)S(Statsfieldmaskbyte)X(Extensionfieldmaskbyte)C(controlfieldmaskbyte)CPSR313029282726252423222120191817161514131211109876543210意义NZCVQDNZ(RAZ)系统扩展用IFTM4M3M2M1M0CPSR各位详细意义N当前指令运算结果为负时,N=1;结果为非负时,N=0Z运算结果为0,Z=1;否则Z=0C上溢出、进位C=1;下溢出、借位C=0V加减法V=1表示符号位溢出II=1时,禁止IRQ中断FF=1时,禁止FIQ中断TT=0,ARM指令;T=1,Thumb指令M[4:0]0b10000User0b10001FIQ0b10010IRQ0b10011Supervisor0b10111Abort0b11011Undefined0b11111System指令格式313029282726252423222120191817161514131211109876543210CondOpcodeSRnRdShift_operandopcode指令操作符编码S决定指令的操作是否影响CPSR的值Rd目标寄存器编码Rn包含第一个操作数的寄存器编码Shift_oprand表示第二个操作数Cond指令执行的条件编码,详细如下所示条件域EQZ=1EqualNEZ=0Notequal,orunorderedCS/HSC=1Carryset/UnsignedhigherorsameGreatthanorequal,orunorderedCC/LOC=0Carryclear/UnsignedlowerLessthanMIN=1NegativeLessthanPLN=0PositiveorzeroGreaterthanorequal,orunorderedVSV=1OverflowUnorderedVCV=0NooverflowNotunorderedHIC=1且Z=0UnsignedhigherGreaterthan,orunorderedLSC=0或Z=1UnsignedlowerorsameLessthanorequalGEN=1且V=1或N=0且V=0SignedgreaterthanorequalGreaterthanorequalLTN=1且V=0或N=0且V=1SignedlessthanLessthan,orunorderedGTZ=0或N=VSignedgreaterthanGreatthanLEZ=1或N!=VSignedlessthanorequalLessthanorequal,orunorderedALAlways(normallyomitted)并行指令前缀SSignedarithmeticmodulo28or216,setsCPSRGEbitQSignedsaturatingarithmeticSHSignedarithmetic,halvingresultsUUnsignedarithmeticmodulo28or216,setsCPSRGEbitUQUnsignedsaturatingarithmeticUHUnsignedarithmetic,halvingresults批量传输地址模式Blockload/storeStackpop/pushIAIncrementafterFDFulldescendingIBIncrementbeforeEDEmptydescendingDADecrementafterFAFullascendingDBDecrementbeforeEAEmptyascendingARM指令寻址方式立即寻址ADDR0,R0,#0x3fR0←R0+0x3f寄存器寻址ADDR0,R1,R2R0←R1+R2间接寻址ADDR0,R1,[R2]R0←R1+[R2]变址寻址LDRR0,[R1,#4]R0←[R1+4]LDRR0,[R1,#4]!R0←[R1+4]、R1←R1+4LDRR0,[R1],#4R0←[R1]、R1←R1+4LDRR0,[R1,R2]R0←[R1+R2]多寄存器寻址LDMIAR0,{R1,R2,R3,R4}R1←[R0];R2←[R0+4];R3←[R0+8];R4←[R0+1