指令格式意义示例ADCADC{条件}{S}目的,操作数1,操作数2带进位的32位数加法目的操作数1+操作数2+!CADDADD{条件}{S}目的,操作数1,操作数232位数相加目的操作数1+操作数2ANDAND{条件}{S}目的,操作数1,操作数232位数的逻辑与目的操作数1&操作数2BB{条件}目标地址相对跳转指令(32M,26b)跳转至目的地,PC目标地址BEQ相等则跳转(BranchifEQual)BNE不相等则跳转(BranchifNotEqual)BGE大于或等于跳转(BranchifGreaterthanorEqua)BGT大于跳转(BranchifGreaterThan)BICBIC{条件}{S}目的,操作数1,操作数232位数的逻辑位清零类似ANDBKPTBKPT16位的立即数断点指令BLBL{条件}目标地址带链接的相对跳转指令(PCR14,跳转)BLE小于或等于跳转(BranchifLessthanorEqual)BLEQ带链接等于跳转(BranchwithLinkifEQual)BLLT带链接小于跳转(BranchwithLinkifLessThan)BLT小于跳转(BranchifLessThan)BLXBLX目标地址带链接的切换跳转(PCR14,跳转并切换为thumb)BXBX{条件}目标地址切换跳转跳转并切换(ARM/Thumb)CDPCDP2CDP{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。协处理器数据处理操作CLZ零计数CMNCMN{条件}操作数1,操作数2比较两个数的相反数CMPCMP{条件}操作数1,操作数232位数比较操作数1–操作数2更新CPSREOREOR{条件}{S}目的,操作数1,操作数232位逻辑异或目的操作数1XOR操作数2LDCLDC2LDC{条件}{L}协处理器编码,目的寄存器,[源寄存器]从协处理器取一个或多个32位值LDCP3,C4,[R0];P3:C4[R0]LDMLDM(或STM){条件}{类型}基址寄存器{!},寄存器列表{∧}从内存送多个32位字到ARM寄存器registerMemeryLDRLDR{条件}目的,存储器地址从虚拟地址取一个单个的32位值至寄存器Register存储器地址LDR{条件}B目的,存储器地址读一个字节LDR{条件}H目的,存储器地址读半字(即16位)MCRMCR2MCRRMCR{条件}协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。从寄存器送数据到协处理器MCRP3,3,R0,C4,C5,6;将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中MLAMLA{条件}{S}目的,操作数1,操作数2,操作数332位乘累加目的操作数1*操作数2+操作数3MOVMOV{条件}{S}目的,源操作数传送一个32位数到寄存器目的源操作数MRCMRC2MRRCMRC{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。从协处理器传送数据到寄存器MRCP3,3,R0,C4,C5,6;该指令将协处理器P3的寄存器中的数据传送到ARM处理器寄存器中MRSMRS{条件}通用寄存器状态寄存器(CPSR或SPSR)把状态寄存器的值送到通用寄存器Register状态寄存器MSRMSR{条件}程序状态寄存器(CPSR或SPSR)_域,操作数把通用寄存器的值传送到状态寄存器CPSR或SPSR域操作数MULMUL{条件}{S}目的,操作数1,操作数232位乘结果MODE(2^32),目的操作数1*操作数2MVNMVN{条件}{S}目的,源操作数把一个32位数的逻辑“非”送到寄存器目的~(取反)源操作数ORRORR{条件}{S}目的,操作数1,操作数232位逻辑或目的操作数1OR操作数2PLD预装载提示指令QADD有符号32位饱和加QDADD有符号双32位饱和加QSUB有符号32位饱和减QDSUB有符号双32位饱和减RSBRSB{条件}{S}目的,操作数1,操作数2逆向32位减法目的操作数2-操作数1RSCRSC{条件}{S}目的,操作数1,操作数2带进位的逆向32法减法目的操作数2-操作数1-!CSBCSBC{条件}{S}目的,操作数1,操作数2带进位的32位减法目的=操作数1-操作数2-!CSMLAxy有符号乘累加(16位*16位)+32位=32位SMLALSMLAL{条件}{S}目的Low,目的High,操作64位有符号乘累加((32位*32位)+64位=64目的L(操作1*操作2)L+目的L数1,操作数2位)目的H(操作1*操作2)H+目的HSMALxy64位有符号乘累加((32位*32位)+64位=64位)SMLAWy号乘累加((32位*16位)16位)+32位=32位SMULLSMULL{条件}{S}目的Low,目的High,操作数1,操作数264位有符号乘累加(32位*32位)=64位SMULxy有符号乘(16位*16位=32位)SMULWy有符号乘(32位*16位16位=32位)STCSTC2STC{条件}{L}协处理器编码,源寄存器,[目的寄存器]从协处理器中把一个或多个32位值存到内存STCP3,C4,[R0];P3:C4[R0]STMLDM(或STM){条件}{类型}基址寄存器{!},寄存器列表{∧}把多个32位的寄存器值存放到内存MemRegisterSTRSTR{条件}源寄存器,存储器地址把寄存器的值存到一个内存的虚地址内间存储器地址RegisterSTR{条件}B源寄存器,存储器地址8位(R的低8位)的字节数据传送到存储器STR{条件}H源寄存器,存储器地址16位的半字数据传送到存储器SUBSUB{条件}{S}目的,操作数1,操作数232位减法目的操作数1–操作数2SWISWI{条件}24位的立即数软中断无立即数时,默认为R0SWPSWP{条件}目的,源寄存器1,[源寄存器2]把一个字或者一个字节和一个寄存器值交换SWP{条件}B目的,源寄存器1,[源寄存器2]字节操作TEQTEQ{条件}操作数1,操作数2等值测试TSTTST{条件}操作数1,操作数2位测试UMLALUMLAL{条件}{S}目的Low,目的寄存器High,操作数1,操作数264位无符号乘累加((32位*32位)+64位=64位)UMULLUMULL{条件}{S}目的L,目的H,操作数1,操作数264位无符号乘累加(32位*32位)=64位ARM汇编伪指令符号定义SymbolDefinitionGBLA、GBLL、GBLSGBLA:定义一个全局的数字变量,并初始化为0GBLL:定义一个全局的逻辑变量,并初始化为F(假)GBLS:定义一个全局的字符串变量,并初始化为空LCLA、LCLL、LCLSLCLA:定义一个局部的数字变量,并初始化为0LCLL:定义一个局部的逻辑变量,并初始化为F(假)LCLS:定义一个局部的字符串变量,并初始化为空SETA、SETL、SETSSETA伪指令用于给一个数学变量赋值SETL伪指令用于给一个逻辑变量赋值SETS伪指令用于给一个字符串变量赋值RLIST名称RLIST{寄存器列表}RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM指令LDM/STM中使用。数据定义DataDefinitionDCB用于分配一片连续的字节存储单元并用指定的数据初始化标号DCB表达式DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化SPACESPACE伪指令用于分配一片连续的存储区域并初始化为0,其中,表达式为要分配的字节数。SPACE也可用“%”代替。标号SPACE表达式MAP用于定义一个结构化的内存表首地址。MAP也可用“^”代替MAP表达式{,基址寄存器}FIELD用于定义一个结构化的内存表的数据域。FILED也可用“#”代替标号FIELD表达式汇编控制AssemblyControlIF、ELSE、ENDIF条件编译WHILE、WEND循环MACRO、MEND宏MEXIT用于从宏定义中跳转出去其它AREACODE/DATA/READONLY/READWRITE/ALAIN/COMMONAREA段名属性1,属性2,……ALIGN通过添加填充字节的方式,使当前位置满足一定的对齐方式.ALIEN=3;指定后面的指令为8字节对齐,2^3=8,可取值0-31.CODE16、CODE32CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令.CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令。只通知编译器其后指令的类型,并不能对处理器进行状态的切换。ENTRY指定汇编程序的入口点END通知编译器已经到了源程序的结尾EQU用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替EXPORT(或GLOBAL)在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写,[WEAK]选项声明其他的同名标号优先于该标号被引用IMPORT通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息EXTERN通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写GET(或INCLUDE)将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理INCBIN将一个目标文件或数据文件作为二进制数据包含到当前的源文件中RN给一个寄存器定义一个别名TempRNR0ROUT给一个局部变量定义作用范围#立即数,&十六进制数,B.表示当前PC指针(死循环)ARM条件码操作码[31:28]助记符扩展解释标志状态0000EQ相等/等于0Z==10001NE不等Z==00010CS/HS进位/无符号数高于或等于C==10011CC/LO无进位/无符号数低于C==00100MI负数N==10101PL正数或0N==00110VS溢出V==10111VC未溢出V==01000HI无符号数高于(大于)C==1&&Z==01001LS无符号数低于或等于(小于等于)C==0||Z==11010GE有符号数大于或等N==V1011LT有符号数小于N!=V1100GT有符号数大于Z==0&&N==V1101LE有符号数小于或等于Z==1||N!=V1110AL总是(always)任何状态1111NV从不(never)(不要使用)无CPSR312827876540NZCVUnusedIFT(==1thumb,==0Arm)mode位[31:24]为条件位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8]为扩展位域,用x表示;位[7:0]为控制位域,用c表示;与指令MSR相关关于移位LSL逻辑左移(低位填0)通用寄存器,LSL操作数LSR逻辑右移(高位填0)通用寄存器,LSR操作数ASL算术左移(低位填0)通用寄存器,ASL操作数ASR算术右移(符号位填充高位)通用寄存器,ASR操作数ROR循环右移通用寄存器,ROR操作数RRX带C的循环右移通用寄存器,RR