thumb指令集可以看做arm指令集的一個子集,其用于支持存儲系統(tǒng)數(shù)據(jù)總線為16位的應用系統(tǒng)。thumb指令長度為16位,這樣,與32位的arm指令集相比,有效地節(jié)省了系統(tǒng)的存儲空間。但thumb指令集中的數(shù)據(jù)處理指令的操作數(shù)仍然是32位的,指令尋址地址也是32位的。
在實際應用中,若對系統(tǒng)的性能有較高要求,則選arm指令集和32位的memory;若對系統(tǒng)的功耗有較高要求時,則選thumb指令集和16位的memory;一般將兩者混合使用,根據(jù)系統(tǒng)不同部分的不同需求,選用合適的指令,發(fā)揮兩者的優(yōu)勢。
thumb指令集由數(shù)據(jù)處理指令、跳轉指令、load/store指令和軟件中斷指令4大類構成。
數(shù)據(jù)處理指令
格 式
功 能
mov rd,imm_8;
rd=imm_8;rd為r0~r7,imm_8為8位立即數(shù)
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位立即數(shù);
否則,imm為3位立即數(shù)
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整數(shù)倍的數(shù)
否則,imm為8位立即數(shù)
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位立即數(shù)
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整數(shù)倍的數(shù)
否則,imm為8位立即數(shù)
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間的數(shù)值
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循環(huán)右移rn位;rd、rn為r0~r7
cmp rn,rm;
根據(jù)rn-rm的值,修改cpsr的狀態(tài)標志位;
rn、rm為r0~r7
cmp rn,imm_8;
根據(jù)rn-imm_8的值,修改cpsr的狀態(tài)標志位;
rn為r0~r7
cmn rn,rm;
根據(jù)rn+rm的值,修改cpsr的狀態(tài)標志位;
rn、rm為r0~r7
tst rn,rm;
根據(jù)rn&rm的值,修改cpsr的狀態(tài)標志位;
rn、rm為r0~r7
跳轉指令
格 式
功 能
b{cond} label
pc=label;
若有cond,則label必須在當前指令的-256~+256字節(jié)范圍內;
否則,label必須在當前指令的-2kb~+2kb范圍內
bl label
r14=pc+4,pc=label;
label必須在當前指令的-4mb~+4mb范圍內
bx rn
pc=rn,且切換處理器狀態(tài)
load/store指令
格 式
功 能
ldr rd,[rn,imm];
rd=地址(rn+imm)中的字數(shù)據(jù);rd為r0~r7,rn為r0~r7或sp或pc;若rn為pc或sp,imm為5位立即數(shù),否則imm為8位立即數(shù)
ldr rd,[rn,rm];
rd=地址(rn+rm)中的字數(shù)據(jù);rd、rn、rm為r0~r7
ldrh rd,[rn,imm_5];
rd=地址(rn+imm_5)中的無符號半字數(shù)據(jù);rd、rn為r0~r7,imm_5為5位立即數(shù)
ldrh rd,[rn,rm];
rd=地址(rn+rm)中的無符號半字數(shù)據(jù);rd,rn,rm為r0~r7
ldrb rd,[rn,imm_5];
rd=地址(rn+imm_5)中的無符號字節(jié)數(shù)據(jù);rd、rn為r0~r7
ldrb rd,[rn,rm];
rd=地址(rn+rm)中的無符號字節(jié)數(shù)據(jù);rd,rn,rm為r0~r7
ldrsh rd,[rn,rm];
rd=地址(rn+rm)中的有符號半字數(shù)據(jù);rd,rn,rm為r0~r7
ldrsb rd,[rn,rm];
rd=地址(rn+rm)中的有符號字節(jié)數(shù)據(jù);rd,rn,rm為r0~r7
ldr rd,label;
rd=地址(label)中的字數(shù)據(jù);rd為r0~r7
str rd,[rn,imm];
地址(rn+imm)處的字數(shù)據(jù)=rd;rd為r0~r7,rn為r0~r7或sp或pc;若rn為pc或sp,imm為5位立即數(shù),否則imm為8位立即數(shù)
軟件中斷指令
格 式
功 能
swi 8位立即數(shù)
8位立即數(shù)為中斷號