</div> 
 
    
Thumb指令集可以看做ARM指令集的一个子集,其用于支持存储系统数据总线为16位的应用系统。Thumb指令长度为16位,这样,与32位的ARM指令集相比,有效地节省了系统的存储空间。但Thumb指令集中的数据处理指令的操作数仍然是32位的,指令寻址地址也是32位的。     
在实际应用中,若对系统的性能有较高要求,则选arm指令集和32位的memory;若对系统的功耗有较高要求时,则选Thumb指令集和16位的memory;一般将两者混合使用,根据系统不同部分的不同需求,选用合适的指令,发挥两者的优势。     
Thumb指令集由数据处理指令、跳转指令、Load/Store指令和软件中断指令4大类构成。     数据处理指令
| 格 式  | 
功 能  |  
| MOV Rd,imm_8; | 
Rd=imm_8;Rd为R0~R7,imm_8为8位立即数  |  
| MOV Rd,Rn; | 
Rd=Rn;Rd、Rn为R0~R15 |  
| MVN Rd,Rn; | 
Rd=~Rn;Rd、Rn为R0~R7 |  
| NEG Rd,Rn; | 
Rd=-Rn;Rd、Rn为R0~R7 |  
| ADD Rd,Rn,imm; | 
Rd=Rn+imm;Rd为R0~R7,Rn为R0~R7或PC或SP; 
 Rn为PC或SP时,imm为10位立即数;  否则,imm为3位立即数  |  
| ADD Rd,Rn,Rm; | 
Rd=Rn+Rm;Rd、Rn、Rm为R0~R7 |  
| ADD Rd,imm; | 
Rd=Rd+imm;Rd为R0~R7或SP Rd为SP时,imm为-508~+508间的4整数倍的数 
 否则,imm为8位立即数  |  
| ADD Rd,Rn; | 
Rd=Rd+Rn;Rd、Rn为R0~R15 |  
| ADC Rd,Rn; | 
Rd=Rd+Rn+carry;Rd、Rn为R0~R7,carry为进位标志值  |  
| SUB Rd,Rn,imm_3; | 
Rd=Rn-imm_3;Rd、Rn为R0~R7,imm_3为3位立即数  |  
| SUB Rd,Rn,Rm; | 
Rd=Rn-Rm;Rd、Rn、Rm为R0~R7,  |  
| SUB Rd,imm; | 
Rd=Rd-imm;Rd为R0~R7或SP Rd为SP时,imm为-508~+508间的4整数倍的数 
 否则,imm为8位立即数  |  
| SBC Rd,Rn; | 
Rd=Rd-Rn-!carry;Rd、Rn为R0~R7,carry为进位标志值  |  
| MUL Rd,Rn; | 
Rd=Rd×Rn;Rd、Rn为R0~R7 |  
| AND Rd,Rn; | 
Rd=Rd&Rn;Rd、Rn为R0~R7 |  
| ORR Rd,Rn; | 
Rd=Rd|Rn;Rd、Rn为R0~R7 |  
| EOR Rd,Rn; | 
Rd=Rd^Rn;Rd、Rn为R0~R7 |  
| BIC Rd,Rn; | 
Rd=Rd&(~Rn);Rd、Rn为R0~R7 |  
| ASR Rd,Rn; | 
Rd=Rd算术右移Rn位;Rd、Rn为R0~R7 |  
| ASR Rd,Rn,imm_5; | 
Rd=Rn算术右移imm_5位;Rd、Rn为R0~R7,  imm_5为1~32间的数值 
 |  
| LSL Rd,Rn; | 
Rd=Rd逻辑左移Rn位;Rd、Rn为R0~R7 |  
| LSL Rd,Rn,imm_5; | 
Rd=Rn逻辑左移imm_5位;Rd、Rn为R0~R7 |  
| LSR Rd,Rn; | 
Rd=Rd逻辑右移Rn位;Rd、Rn为R0~R7 |  
| LSR Rd,Rn,imm_5; | 
Rd=Rn逻辑右移imm_5位;Rd、Rn为R0~R7 |  
| ROR Rd,Rn; | 
Rd=Rd循环右移Rn位;Rd、Rn为R0~R7 |  
| CMP Rn,Rm; | 
根据Rn-Rm的值,修改CPSR的状态标志位;  Rn、Rm为R0~R7 |  
| CMP Rn,imm_8; | 
根据Rn-imm_8的值,修改CPSR的状态标志位;  Rn为R0~R7 |  
| CMN Rn,Rm; | 
根据Rn+Rm的值,修改CPSR的状态标志位;  Rn、Rm为R0~R7 |  
| TST Rn,Rm; | 
根据Rn&Rm的值,修改CPSR的状态标志位; 
 Rn、Rm为R0~R7 |   
    跳转指令
| 格 式  | 
功 能  |  
| B{cond} label | 
PC=label;  若有cond,则label必须在当前指令的-256~+256字节范围内; 
 否则,label必须在当前指令的-2KB~+2KB范围内  |  
| BL label | 
R14=PC+4,PC=label;  label必须在当前指令的-4MB~+4MB范围内 
 |  
| BX Rn | 
PC=Rn,且切换处理器状态  |   
    Load/Store指令
| 格 式  | 
功 能  |  
| LDR Rd,[Rn,imm]; | 
Rd=地址(Rn+imm)中的字数据;Rd为R0~R7,Rn为R0~R7或SP或PC;若Rn为PC或SP,imm为5位立即数,否则imm为8位立即数 
 |  
| LDR Rd,[Rn,Rm]; | 
Rd=地址(Rn+Rm)中的字数据;Rd、Rn、Rm为R0~R7 |  
| LDRH Rd,[Rn,imm_5]; | 
Rd=地址(Rn+imm_5)中的无符号半字数据;Rd、Rn为R0~R7,imm_5为5位立即数 
 |  
| LDRH Rd,[Rn,Rm]; | 
Rd=地址(Rn+Rm)中的无符号半字数据;Rd,Rn,Rm为R0~R7 |  
| LDRB Rd,[Rn,imm_5]; | 
Rd=地址(Rn+imm_5)中的无符号字节数据;Rd、Rn为R0~R7 |  
| LDRB Rd,[Rn,Rm]; | 
Rd=地址(Rn+Rm)中的无符号字节数据;Rd,Rn,Rm为R0~R7 |  
| LDRSH Rd,[Rn,Rm]; | 
Rd=地址(Rn+Rm)中的有符号半字数据;Rd,Rn,Rm为R0~R7 |  
| LDRSB Rd,[Rn,Rm]; | 
Rd=地址(Rn+Rm)中的有符号字节数据;Rd,Rn,Rm为R0~R7 |  
| LDR Rd,label; | 
Rd=地址(label)中的字数据;Rd为R0~R7 |  
| STR Rd,[Rn,imm]; | 
地址(Rn+imm)处的字数据=Rd;Rd为R0~R7,Rn为R0~R7或SP或PC;若Rn为PC或SP,imm为5位立即数,否则imm为8位立即数 
 |   
    软件中断指令
| 格 式  | 
功 能  |  
| SWI 8位立即数  | 
8位立即数为中断号 |     
 |