Thumb® 16 位指令集 快速参考卡 本卡列出了版本低于 ARM®v6T2 的支持 Thumb 的处理器中可用的所有 Thumb 指令。此外,还列出了所有 Thumb-2 16 位指令。 除非另外注明,否则本卡中显示的指令均为 Thumb-2 16 位指令。 除非指定,否则所有寄存器都为 Lo (R0-R7)。 Hi 寄存器为 R8-R15。 表关键字 § 请参阅表 ARM 体系结构版本。<loreglist+LR> 以逗号隔开的 Lo 寄存器列表。加上 LR,括在大括号 { 和 } 内。 <loreglist> 以逗号隔开的 Lo 寄存器列表,括在大括号 { 和 } 内。<loreglist+PC> 以逗号隔开的 Lo 寄存器列表。加上 PC,括在大括号 { 和 } 内。 运算 汇编器更新 操作说明 移动立即数MOVS Rd, #<imm> N Z Rd := imm imm 范围为 0-255。 Lo 到 Lo MOVS Rd, Rm N Z Rd := Rm LSLS Rd, Rm, #0 的同义词 Hi 到 Lo、Lo 到 Hi、Hi 到 Hi MOV Rd, Rm Rd := Rm 不是 Lo 到 Lo。 任何寄存器之间6 MOV Rd, Rm Rd := Rm 任何寄存器之间。 加法立即数 3 ADDS Rd, Rn, #<imm> N Z C V Rd := Rn + imm imm 范围为 0-7。 所有寄存器 Lo ADDS Rd, Rn, Rm N Z C V Rd := Rn + Rm Hi 到 Lo、Lo 到 Hi、Hi 到 Hi ADD Rd, Rd, Rm Rd := Rd + Rm 不是 Lo 到 Lo。 任何寄存器之间T2 ADD Rd, Rd, Rm Rd := Rd + Rm 任何寄存器之间。 立即数 8 ADDS Rd, Rd, #<imm> N Z C V Rd := Rd + imm imm 范围为 0-255。 带进位ADCS Rd, Rd, Rm N Z C V Rd := Rd + Rm + C-bit 值与 SP ADD SP, SP, #<imm> SP := SP + imm imm 范围为 0-508(字对齐)。 SP 所存储的地址ADD Rd, SP, #<imm> Rd := SP + imm imm 范围为 0-1020(字对齐)。 PC 所存储的地址ADR Rd, <label> Rd := label 标签范围为 PC 到 PC+1020(字对齐)。 减法Lo 到 Lo SUBS Rd, Rn, Rm N Z C V Rd := Rn – Rm 立即数 3 SUBS Rd, Rn, #<imm> N Z C V Rd := Rn – imm imm 范围为 0-7。 立即数 8 SUBS Rd, Rd, #<imm> N Z C V Rd := Rd – imm imm 范围为 0-255。 带进位SBCS Rd, Rd, Rm N Z C V Rd := Rd – Rm – NOT C 位 来自 SP 的值SUB SP, SP, #<imm> SP := SP – imm imm 范围为 0-508(字对齐)。 求反RSBS Rd, Rn, #0 N Z C V Rd := – Rn 同义词:NEGS Rd, Rn 乘法乘法MULS Rd, Rm, Rd N Z * * Rd := Rm * Rd * C 和 V 标记在 §4T 中不可预测, 在 §5T 及更高版本中保持不变 比较CMP Rn, Rm N Z C V 更新 Rn – Rm 的 APSR 标记可为 Lo 和 Lo、Lo 和 Hi、Hi 和 Lo 或者 Hi 和 Hi。 求反CMN Rn, Rm N Z C V 更新 Rn + Rm 的 APSR 标记 立即数CMP Rn, #<imm> N Z C V 更新 Rn – imm 的 APSR 标记imm 范围为 0-255。 逻辑与ANDS Rd, Rd, Rm N Z Rd := Rd AND Rm 异或EORS Rd, Rd, Rm N Z Rd := Rd EOR Rm 或ORRS Rd, Rd, Rm N Z Rd := Rd OR Rm 位清零BICS Rd, Rd, Rm N Z Rd := Rd AND NOT Rm 取反移动MVNS Rd, Rd, Rm N Z Rd := NOT Rm 测试位TST Rn, Rm N Z 更新 Rn AND Rm 的 APSR 标记 移位/循环逻辑左移LSLS Rd, Rm, #<shift> N Z C* Rd := Rm << shift 允许移动 0-31 位。 如果移位为 0,则不会影响 * C 标记。 LSLS Rd, Rd, Rs N Z C* Rd := Rd << Rs[7:0] 如果 Rs[7:0] 为 0,则不会影响 * C 标记。 逻辑右移LSRS Rd, Rm, #<shift> N Z C Rd := Rm >> shift 允许移动 1-32 位。 LSRS Rd, Rd, Rs N Z C* Rd := Rd >> Rs[7:0] 如果 Rs[7:0] 为 0,则不会影响 * C 标记。 算术右移ASRS Rd, Rm, #<shift> N Z C Rd := Rm ASR shift 允许移动 1-32 位。 ASRS Rd, Rd, Rs N Z C* Rd := Rd ASR Rs[7:0] 如果 Rs[7:0] 为 0,则不会影响 * C 标记。 向右循环移RORS Rd, Rd, Rs N Z C* Rd := Rd ROR Rs[7:0] 如果 Rs[7:0] 为 0,则不会影响 * C 标记。 dds r0,r0,#1 BNE 判断r0+1是否=0 就是判断r0是否为-1