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位立即數為中斷號