Thumb 指令集
Thumb指令集概述
ARM開發(fā)工具完全支持Thumb指令,應(yīng)用程序可以靈活的將ARM和Thumb子程序混合編程以便在例程的基礎(chǔ)上提高性能或代碼密度。在編寫Thumb指令時(shí),先要用偽指令CODE16聲明(ADS的編譯環(huán)境下),而且在ARM指令中要使用BX指令跳轉(zhuǎn)到Thumb指令,以切換處理器狀態(tài)。
Thumb指令集特點(diǎn)
? 采用16位二進(jìn)制編碼,而ARM指令是32位的。
? Thumb是壓縮指令,先動(dòng)態(tài)解壓縮,然后作為標(biāo)準(zhǔn)的ARM指令執(zhí)行。
? 由CPSR的T位決定指令流。T置位,執(zhí)行Thumb指令流,T清0,執(zhí)行ARM指令流
? 由ARM模式進(jìn)入Thumb模式時(shí),是顯式或隱式的進(jìn)入;由Thumb進(jìn)入ARM模式時(shí),也是顯式或隱式的進(jìn)入。
? Thumb指令集沒有協(xié)處理器指令、信號(hào)量指令、乘加指令、64位乘法指令以及訪問CPSR和SPSR的指令,而且指令的第2操作數(shù)受到限制。
? 除了分支指令B有條件執(zhí)行功能外,其他指令均無條件執(zhí)行。
? 大多數(shù)Thumb數(shù)據(jù)處理指令采用2地址格式。
Thumb指令集編碼如下:
Thumb狀態(tài)切換
在任何時(shí)刻,CPSR的第5位(位T)決定了ARM微處理器執(zhí)行的是ARM指令流還是Thumb指令流。當(dāng)T置1,則認(rèn)為是16位的Thumb指令流;當(dāng)T清0,則認(rèn)為是32位的ARM指令流。
? 進(jìn)入Thumb模式
進(jìn)入Thumb指令模式有兩種方法:一種是執(zhí)行一條交換轉(zhuǎn)移指令BX,另一種方法是利用異常返回,也可以把微處理器從ARM模式轉(zhuǎn)換為Thumb模式。
? 退出Thumb模式
退出Thumb指令模式也有兩種方法:一種是執(zhí)行Thumb指令中的交換轉(zhuǎn)移BX指令可以顯式的返回到ARM指令流。另一種是利用異常進(jìn)入ARM指令流 。
編程模型
Thumb指令集是ARM指令集的一個(gè)子集,并只能對(duì)限定的ARM寄存器進(jìn)行操作。
16位Thumb指令集是從32位ARM指令集提取指令格式的,每條Thumb指令有相同處理器模型所對(duì)應(yīng)的32位ARM指令。
Thumb數(shù)據(jù)處理指令包括一組高度優(yōu)化且相當(dāng)復(fù)雜的指令,范圍涵蓋編譯器通常需要的大多數(shù)操作。ARM指令支持在單條指令中完成一個(gè)操作數(shù)的移位及一個(gè)ALU操作,但Thumb指令集將移位操作和ALU操作分離為不同的指令。本部分從以下幾個(gè)方面介紹:
? 數(shù)據(jù)處理指令的二進(jìn)制編碼
? 數(shù)據(jù)處理指令的分類
? ARM指令與Thumb指令比較
數(shù)據(jù)處理指令
按照數(shù)據(jù)處理指令的功能,可以將其分為以下幾類:
? 算術(shù)運(yùn)算指令,它又分為以下幾類:
? ADD與SUB—低寄存器加法和減法
? ADD—高或低寄存器
? ADD與SUB—SP
? ADD—PC或SP相對(duì)偏移
? ADC,SBC和MUL
? 移位和循環(huán)移位操作(ASR,LSL,LSR和ROR)
? 比較指令(CMP和CMN)
? 傳送和取負(fù)指令(MOV,MVN和NEG)
? 測(cè)試指令(TST)
算術(shù)運(yùn)算指令
ADD與SUB--低寄存器加法和減法
句法:
op Rd,Rn,Rm
op Rd,Rn,#expr3
op Rd,#expr8
用法:
指令中Rd、Rn、Rm必須是低寄存器(R0~R7)。指令更新NZCV標(biāo)志。
例子:
ADD R3,R1,R5
ADD R9,R2,R6
SUB R0,R4,#5
SUB R4,R5,#201
ADD--高或低寄存器
句法:
ADD Rd,Rm
用法:
Rd←Rd+Rm
Rd和Rm是低寄存器時(shí),更新標(biāo)志NZCV
例子:
ADD R12,R4
ADD R10,R11
ADD R2,R4
ADD與SUB--SP
句法:
ADD SP,#expr
SUB SP,#expr
用法:
SP←SP+expr
不影響條件標(biāo)志碼
例子:
ADD SP,#312
ADD--PC或SP偏移量
句法:
ADD Rd,Rp,#expr
Rp:SP或PC
用法:
Rd←Rp+#expr
不影響條件標(biāo)志碼
例子:
ADD R6,SP,#64
ADD R2,PC,#980
ADC、SBC和MUL
(帶進(jìn)位位的加法、帶進(jìn)位位的減法、乘法)
句法:
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
用法:
AND邏輯“與”操作
ORR邏輯“或”操作
EOR邏輯“異或”操作
BIC:Rd AND NOT Rm
必須是低寄存器,影響NZ標(biāo)志
ASR、LSL、LSR和ROR(邏輯和循環(huán)位移)
句法:
op Rd,Rs
op Rd,Rm,#expr
Rd、Rs、Rm必須是R0~R7范圍內(nèi)的寄存器
例子:
ASR R3,R5
LSR R0,R2,#6
ROR R2,R7,#2
LSL R9,R1
CMP和CMN(比較和比較負(fù)值)
句法:
CMP Rn,#expr
CMP Rn,Rm
CMN Rn,Rm
用法:
只更新條件碼標(biāo)志,不存放結(jié)果
CMP:Rn-expr(或Rm)
CMN:Rm+Rn
其中:CMP Rn,Rm指令允許使用高寄存器
例子:
CMP R2,#255 CMP R9,#24
CMN R1,R5 CMN R0,R10
MOV、MVN和NEG(傳送、傳送非和取負(fù))
句法:
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(測(cè)試)
句法:
TST Rn,Rm
用法:
Rm AND Rn,丟棄結(jié)果,更新條件碼標(biāo)志NZ
Rn、Rm必須在R0~R7范圍內(nèi)
轉(zhuǎn)移指令
轉(zhuǎn)移指令的二進(jìn)制編碼如下:
轉(zhuǎn)移指令分類如下:
? B-分支指令,Thumb指令集惟一可條件執(zhí)行的指令。
? BL-帶鏈接的長分支。
? BX-分支指令,并可選擇地切換指令集。
? BLX-帶鏈接分支,并可選地交換指令集。
B <cond> <label> ;格式1 目標(biāo)為Thumb代碼
B <label> ;格式2 目標(biāo)為Thumb代碼
BL <label> ;格式3 目標(biāo)為Thumb代碼
BLX <label> ;格式3a 目標(biāo)為ARM代碼
B{L}X Rm ;格式4 目標(biāo)為ARM或Thumb代碼
Thumb的數(shù)據(jù)存取指令又可以分為:
單寄存器數(shù)據(jù)存取指令(LDR和STR)
多寄存器數(shù)據(jù)存取指令 (LDM和STM)
匯編格式如下:
<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位
多寄存器數(shù)據(jù)存取指令
匯編格式如下:
LDMIA Rn!,{}
STMIA Rn!,{}
POP {{,PC}}
PUSH {{,LR}}
異常中斷指令
Thumb軟件中斷指令
Thumb軟件中斷指令的二進(jìn)制編碼如下
Thumb軟件中斷指令的匯編格式如下:
SWI <8位立即數(shù)>;<8位立即數(shù)>為數(shù)字表達(dá)式,其取值為0~255范圍內(nèi)的整數(shù)。
Thumb斷點(diǎn)指令文章來源:http://www.zghlxwxcb.cn/news/detail-421385.html
Thumb斷點(diǎn)指令的二進(jìn)制編碼如下:
Thumb斷點(diǎn)指令的匯編格式如下:
BKPT immed_8文章來源地址http://www.zghlxwxcb.cn/news/detail-421385.html
到了這里,關(guān)于【嵌入式】Thumb指令集(學(xué)習(xí)筆記)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!