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位立即数为中断号