在编写Thumb指令时,先要用伪指令CODE16声明(ADS的编译环境下),而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。
Thumb指令集特点:
Thumb指令与ARM指令的异同:
进入和退出Thumb模式的方式:
低寄存器指的是R0~R7, 高寄存器指的是R8 ~ R15
算术运算指令
ADD与SUB–低寄存器加法和减法
句法:
op Rd, Rn, Rm
op Rd, Rn, #expr3
op Rd, #expr8
用法:指令中Rd、Rn、Rm必须是低寄存器(R0~R7)。指令更新NZCV标志
ADD–高或低寄存器
句法:
ADD Rd, Rm
用法:Rd <- Rd + Rm
Rd和Rm是低寄存器时,更新标记NZCV
ADD与SUB–SP
句法:
ADD SP, #expr
SUB SP, #expr
用法:SP <- SP + expr
不影响条件标志码
ADD – PC或SP偏移量
句法:
ADD Rd, Rp, #expr
Rp为 SP或PC
用法:Rd <- Rp + #expr
不影响条件标志码
ADC、SBC、MUL
带进位位的加法、带进位位的减法、乘法
句法:
op Rd, Rm
用法:
ADC: Rd <- Rd + Rm + C
SBC: Rd <- Rd - Rm - (1 - C) 借位
MUL: Rd <- Rd * Rm
限制:Rd和Rm必须是低寄存器(R0~R7)
ADC和SBC影响NZCV
MUL影响NZ
AND、ORR、EOR和BIC(按位逻辑运算)
句法:
op Rd, Rm
用法:EOR异或,BIC:Rd AND NOT Rm
必须是低寄存器影响NZ标志
ASR、LSL、LSR、和ROR
算术右移、逻辑左移、逻辑右移、循环右移
句法:
op Rd, Rs
op Rd, Rm, #expr
Rd、Rs、Rm必须是R0~R7范围内的寄存器
CMP和CMN(比较和比较负值)
句法:
CMP Rn, #expr
CMP Rn, Rm
CMN Rn, Rm
用法:
只更新条件码标志,不存放结果
CMP: Rn - expr(或Rm)
CMN:Rm + Rn
其中:CMP Rn, Rm指令允许使用高寄存器
MOV、MVN和NEG(传送、传送非、取反)
句法:
MOV Rd, #expr
MOV Rd, Rm
MVN Rd, Rm
NEG Rd, Rm
用法:
MOV: Rd <- #expr(或Rm)
MVN: Rd <- NOT Rm
NEG: Rd <- Rm * (-1)
TST(测试)
句法
TST Rn, Rm
用法:
Rm AND Rn, 丢弃结果,更新条件码标志NZ
Rn、Rm必须在R0~R7范围内
<op> Rd, [Rn, <#off5>] // <op> = LDR | LDRB | STR | STRB
<op> Rd, [Rn, <#off5>] // <op> = LDRH | STRH
<op> Rd, [Rn, Rm] // <op> = LDR | LDRH | LDRSH | LDRB | LDRSB | STR | STRH | STRB
<op> Rd, [PC, <#off8>]
<op> Rd, [SP, <#off8>] // <op> = LDR | STR 该两条指令偏移量为8位
LDMIA Rn!, {<reg list>}
STMIA Rn!, {<reg list>}
POP {<reg list> {, PC}}
PUSH {<reg list> {, LR}}
汇编格式:
B <cond> <label> //目标为Thumb代码
B <label> //目标为Thumb代码
BL <label> //目标为Thumb代码
BLX <label> //目标为ARM代码
B{L}X Rm //目标为ARM或Thumb代码
SWI <8位立即数> //八位立即数为数学表达式取值为0~255内的整数
BKPT immed_8
未完待续