嵌入式原理-學(xué)生課件-2014 .第3章thumb2指令系統(tǒng)_第1頁
嵌入式原理-學(xué)生課件-2014 .第3章thumb2指令系統(tǒng)_第2頁
嵌入式原理-學(xué)生課件-2014 .第3章thumb2指令系統(tǒng)_第3頁
嵌入式原理-學(xué)生課件-2014 .第3章thumb2指令系統(tǒng)_第4頁
嵌入式原理-學(xué)生課件-2014 .第3章thumb2指令系統(tǒng)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章Thumb-2指令系統(tǒng)本章主要內(nèi)容:Thumb-2指令系統(tǒng)概述Thumb-2指令集分類統(tǒng)一的匯編語言常用的Thumb-2指令集第3章Thumb-2指令系統(tǒng)嵌入式系統(tǒng)指令集演進(jìn):22位的ARM指令集。對(duì)應(yīng)處理器狀態(tài):ARM狀態(tài)16位的Thumb指令集。對(duì)應(yīng)處理器狀態(tài):Thumb狀態(tài)Thumb-2指令集1.Thumb-2指令系統(tǒng)概述1.Thumb-2指令系統(tǒng)概述?對(duì)于確定的微處理器而言,編寫緊湊的代碼以降低消耗顯得至關(guān)重要。?通常,存儲(chǔ)器的大小是固定的,而產(chǎn)品的 功能特性卻各異,選擇恰當(dāng)?shù)奶幚砥鞑⒕?心調(diào)整指令代碼是明智的。1.Thumb-2指令系統(tǒng)概述對(duì)于ARM體系架構(gòu)的來說:①微處理器有兩種工作狀態(tài):ARM工作狀態(tài)Thumb工作狀態(tài)②Thumb指令集是添加到ARM的標(biāo)準(zhǔn)RISC指令集之上的獨(dú)立指令集;③Thumb指令集包括了基本的加法、減法、循環(huán)移位以及跳轉(zhuǎn)等大約36條16位指令;④Thumb指令集作為ARM指令集的壓縮方案,簡(jiǎn)潔、有效,應(yīng)用廣泛并得到很好的支持,通過Thumb指令替換ARM指令,可以將某些代碼的規(guī)模減小大約20%到30%。1.Thumb-2指令系統(tǒng)概述對(duì)于ARM體系架構(gòu)的來說(續(xù)):⑤但是,有限的Thumb指令僅對(duì)基本的算術(shù)和邏輯操作有用:Thumb狀態(tài)下,處理器將僅可使用有限數(shù)量的寄存器,R8-R12的使用受到限制,無法完成諸如處理中斷、長(zhǎng)跳轉(zhuǎn)、原子存儲(chǔ)器(atomicmemory)操作,或協(xié)處理器操作等等復(fù)雜任務(wù),也無法像ARM模式那樣進(jìn)行條件執(zhí)行和移位或循環(huán)移位等操作。⑥Thumb代碼和標(biāo)準(zhǔn)ARM代碼不能混雜使用,必須顯式地在兩種工作狀態(tài)間進(jìn)行切換,這迫使程序員必須將所有的16位代碼與32位代碼分開并隔離到獨(dú)立的模1.Thumb-2指令系統(tǒng)概述對(duì)于ARM體系架構(gòu)的來說(續(xù)):⑦其次,兩種工作狀態(tài)之間來回切換需要消耗時(shí)間,導(dǎo)致代碼運(yùn)行速度降低大約15%,不僅要增加代碼,而且還需要幾十個(gè)前導(dǎo)(preamble)以及后同步指令(postamble)來組織指針并清空CPU的流水線。⑧雖然Thumb指令能夠?qū)崿F(xiàn)較高密度的代碼,緩存使用效率更高,但實(shí)現(xiàn)ARM指令代碼的功能往往需要較多的Thumb指令代碼,相比較而言,ARM指令使用起來更靈活。1.Thumb-2指令系統(tǒng)概述?Thumb-2并不是Thumb的升級(jí)?它是另起爐灶,繼承并集成了傳統(tǒng)的Thumb指 令集和ARM指令集的各自優(yōu)點(diǎn),可以完全代 替Thumb和原先的ARM指令集?是Thumb指令集和ARM指令集的一個(gè)超集。?Thumb-2指令集體系架構(gòu),無需處理器進(jìn)行工 作狀態(tài)的顯示切換,就可運(yùn)行16位與32位混合 代碼。?與ARM體系架構(gòu)相比,速度提高大約15%到20%。1.Thumb-2指令系統(tǒng)概述?Cortex-M3處理器使用的指令集是Thumb-2

指令集的子集,它的(指令)工作狀態(tài)只 有一個(gè),那就是Thumb-2狀態(tài)。?Cortex-M3處理器的兩種工作狀態(tài):①Thumb-2狀態(tài)②調(diào)試狀態(tài)?按照指令的長(zhǎng)度分類,Thumb-2指令集可分為兩種:(1)16-bit指令集;(2)32-bit指令集。2.Thumb-2指令集分類2.Thumb-2指令集分類?基于Thumb-2指令體系架構(gòu)編寫的代碼在執(zhí)行過程中,處理器不存在ARM工作狀態(tài)和Thumb工作狀態(tài)之間的切換。?那么,處理器必須能夠自動(dòng)識(shí)別當(dāng)前指令長(zhǎng)度,是16-bit還是32-bit,以正確地執(zhí)行Thumb-2指令代碼,它是如何識(shí)別呢?2.Thumb-2指令集分類?指令長(zhǎng)度的確定

PC寄存器指向的半字中,Bits<15:11>決定該半字是16-bit指令,還是屬于32-bit指令的一部分。圖3-1說明了Bits<15:11>確定指令長(zhǎng)度的功能。2.Thumb-2指令集分類不同指令長(zhǎng)度的Bits<15:11>編碼格式?PC寄存器所指向半字的Bits<15:11>的編碼格式?jīng)Q定了

CPU所處理指令的長(zhǎng)度。?Thumb-2指令集空間被劃分為16-bit和32-bit兩個(gè)子集。 其中,x原則上可以為“0”、“1”任意值,但x的取值 不能使得0b111xx=0b11100,以及0bxxxxx=0b111xx或者

0bxxxxx=0b11100。Halfword1Bits<15:11>0b11100

功能16-bit無條件分支Thumb-2指令,在所有Thumb-2體系結(jié)構(gòu)中定義0b111xx0bxxxxx(xx≠00) (xxxxx≠111xx)32-bitThumb-2指令,在Thumb-2中定義16-bitThumb-2指令3.統(tǒng)一的匯編語言?ARM指令集體系架構(gòu)下,ARM指令與Thumb指令分屬不同的程序模塊,由不同的匯編器對(duì)其分別進(jìn)行匯編。?Thumb-2指令集體系架構(gòu)下,16bit指令與

32bit指令可以在同一程序模塊出現(xiàn),并由同一匯編器對(duì)其進(jìn)行匯編。ASMr8r9r10r11r13(sp)(sp)(lr)r13r12r13(sp)r14r14(lr)r13(sp)r13(sp)r15(pc)spsrspsrcpsrASMr13(sp)r14 spsr(lr)r0r1r2r3r4r5ARMC/C++CompilerC/C++Files

ToolchainflowwithARM7ARM7TDMIC/C++FilesStateChangeeg.ISRentry/exit

r6 r7 r8 r9 r10 r11 r12 r14(lr) r14(lr)r14(lr) spsr spsrUser/SystemUserRegisterFileOptimizedCodewhichoperatesonthevisibleRegisterfileNB:MostcompilersautomaticallyprovidetheAssemblercodestubsshownhere,allowingmajorityofcodeinHighLevel‘C’language Assembler ThumbC/C++ CompilerARMCortex-M3ToolchainFlowUser/SystemUnifiedAssemblerThumb(2)C/C++Compiler(UAL)UnifiedAssemblerLanguage

C/C++ FilesRegisterFile Codewhich operatesonthe visibleRegister fileNoStateChange:AutomatedbyNVICr13(psp) r14(lr) spsr

r10 r11 r12r13(msp)r14(lr)r15(pc) cpsrARMCortex-M3

r0 r1 r2r3r4r5r6r7r8r9

(HandOptimizedCode/PreviouslyWritten32-BitARMAssemblerFiles)

ASMThecombinationofaconditionalinstructionsequenceIT(If/Then)withthesamevisibleregisterfilesetasARM7enabledthecreationofa‘UnifiedAssembler’whichallowsThumb-2tomimic32-bitARMinstructions指令的條件執(zhí)行

大部分Thumb-2指令都是無條件執(zhí)行的,除了以下指令:32位條件跳轉(zhuǎn)指令B,跳轉(zhuǎn)范圍為±1MB16位的IF-THEN指令

16位的比較跳轉(zhuǎn)指令CBZ,跳轉(zhuǎn)范圍為+4~+130B16位的比較跳轉(zhuǎn)指令CBNZ,跳轉(zhuǎn)范圍為+4~+130B指令條件碼表(1)條件碼助記符標(biāo)志含義EQZ=1相等NEZ=0不相等CS/HSC=1無符號(hào)數(shù)大于或等于CC/LOC=0無符號(hào)數(shù)小于MIN=1負(fù)數(shù)(minus

)PLN=0正數(shù)或零VSV=1上溢出VCV=0沒有上溢出指令條件碼表(2)條件碼助記符標(biāo)志含義HIC=1且Z=0無符號(hào)數(shù)大于LSC=0或Z=l無符號(hào)數(shù)小于或等于GEN=V有符號(hào)數(shù)大于或等于LTN!=V有符號(hào)數(shù)小于GTZ=0且N=V有符號(hào)數(shù)大于LEZ=1或N!=V有符號(hào)數(shù)小于或等于AL任何無條件執(zhí)行(指令默認(rèn)條件)NVARMv3之前該指令從不執(zhí)行4.常用的Thumb-2指令集(1)數(shù)據(jù)傳送指令(2)Load/Store指令(3)批量Load/Store指令(4)算術(shù)四則運(yùn)算指令(5)邏輯操作指令(6)移位和循環(huán)指令(7)符號(hào)擴(kuò)展指令(8)字節(jié)調(diào)序指令REV,REVH,REV16,REVSH(9)位域處理指令(10)子程序調(diào)用與無條件轉(zhuǎn)移指令(11)程序狀態(tài)寄存器標(biāo)志位的更新指令(12)隔離(barrier)指令(13)飽和運(yùn)算指令(14)If‐Then指令(15)比較跳轉(zhuǎn)指令(16)SXTB,SXTH,UXTB,UXTH指令(17)TBB,TBH指令4.常用的Thumb-2指令集(1)數(shù)據(jù)傳送指令

Cortex-M3中的數(shù)據(jù)傳送類型包括:

①兩個(gè)寄存器間傳送數(shù)據(jù) ②寄存器與特殊功能寄存器間傳送數(shù)據(jù) ③把一個(gè)立即數(shù)加載到寄存器

指令MOV<Rd>,#<immed_8>MOV<Rd>,<Rn>MOV<Rd>,<Rm>MVN<Rd>,<Rm>

功能描述將8位立即數(shù)傳送到目標(biāo)寄存器將低寄存器值傳送給低目標(biāo)寄存器將高或低寄存器值傳送給高或低目標(biāo)寄存器將寄存器值取反后傳送給目標(biāo)寄存器<Rd>,MOV{S}.W#<modify_constant(immed_12)>MOV{S}.W<Rd>,<Rm>{,<shift>}MOVT.W<Rd>,#<immed_16>MOVW.W<Rd>,#<immed_16>MRS<c><Rd>,<psr>MSR<c><psr>_<fields>,<Rn>將12位立即數(shù)傳送到寄存器中將移位后的寄存器值傳送到寄存器中將16位立即數(shù)傳送到寄存器的高半字[31:16]中將16位立即數(shù)傳送到寄存器的低半字[15:0]中,并將高半字[31:16]清零將狀態(tài)傳送到寄存器中傳送到狀態(tài)寄存器中4.常用的Thumb-2指令集(1)數(shù)據(jù)傳送指令MRS/MSR用于特權(quán)級(jí)別條件下訪問特殊功能寄存器。指令語法如下:MRS<Rn>,<SReg>;加載特殊功能寄存器的值到RnMSR<Sreg>,<Rn>;存儲(chǔ)Rn的值到特殊功能寄存器其中,SReg可以是下表中的一個(gè)。4.常用的Thumb-2指令集(1)數(shù)據(jù)傳送指令

MRS/MSR指令中的Sreg寄存器:

符號(hào)IPSREPSRAPSRIEPSRIAPSREAPSRPSRMSPPSPPRIMASKBASEPRIBASEPRI_MAXFAULTMASKCONTROL

功能當(dāng)前服務(wù)中斷號(hào)寄存器執(zhí)行狀態(tài)寄存器(讀回來的總是0)。它里面含T位,在CM3中T位必須是1。上條指令結(jié)果的標(biāo)志IPSR+EPSRIPSR+APSREPSR+APSRxPSR=APSR+EPSR+IPSR主堆棧指針進(jìn)程堆棧指針常規(guī)異常屏蔽寄存器常規(guī)異常的優(yōu)先級(jí)閾值寄存器等同BASEPRI,但是施加了寫的限制:新的優(yōu)先級(jí)比較比舊的高(更小的數(shù))fault屏蔽寄存器(同時(shí)還包含了PRIMASK的功能,因?yàn)閒aults的優(yōu)先級(jí)更高)控制寄存器(堆棧選擇,特權(quán)等級(jí))MOV指令舉例如下:

MOV R1,#0x10 ;R1=0x10

MOV R0,R1 ;R0=R1

MVNR3,R1;R3=~R1

MOV PC,LR ;PC=LR,子程序返回MSR指令舉例如下:

LDRR0,=0x20008000

MSRPSP,R0

BXLR4.常用的Thumb-2指令集(1)數(shù)據(jù)傳送指令4.常用的Thumb-2指令集(2)Load/Store指令

指令LDRBRd,[Rn,#offset]LDRHRd,[Rn,#offset]LDRRd,[Rn,#offset]LDRDRd1,Rd2,[Rn,#offset]STRBRd,[Rn,#offset]STRHRd,[Rn,#offset]STRRd,[Rn,#offset]LDRDRd1,Rd2,[Rn,#offset]

功能描述從地址Rn+offset處讀取一個(gè)字節(jié)到Rd從地址Rn+offset處讀取一個(gè)半字到Rd從地址Rn+offset處讀取一個(gè)字到Rd從地址Rn+offset處讀取一個(gè)雙字(64位整數(shù))到Rd1(低32位)和Rd2(高32位)中。把Rd中的低字節(jié)存儲(chǔ)到地址Rn+offset處把Rd中的低半字存儲(chǔ)到地址Rn+offset處把Rd中的低字存儲(chǔ)到地址Rn+offset處把Rd1(低32位)和Rd2(高32位)表達(dá)的雙字存儲(chǔ)到地址Rn+offset處4.常用的Thumb-2指令集(2)Load/Store指令預(yù)索引(Pre‐indexing):LDR.WR0,[R1,#20]!;預(yù)索引該指令先把地址R1+20處的值加載到R0,然后,R1=R1+20;這里的“!”就是指在傳送后更新基址寄存器R1的值。即:步驟①:R0←[R1+20]

步驟②:R1=R1+20,4.常用的Thumb-2指令集(2)Load/Store指令預(yù)索引(Pre‐indexing):

指令LDR.WRd,[Rn,#offset]!LDRB.WRd,[Rn,#offset]!LDRH.WRd,[Rn,#offset]!LDRD.WRd1,Rd2,[Rn,#offset]!LDRSB.WRd,[Rn,#offset]!LDRSH.WRd,[Rn,#offset]!STR.WRd,[Rn,#offset]!STRB.WRd,[Rn,#offset]!STRH.WRd,[Rn,#offset]!STRD.WRd1,Rd2,[Rn,#offset]!

功能描述字/字節(jié)/半字/雙字的帶預(yù)索引加載(不做帶符號(hào)擴(kuò)展,沒有用到的高位全清0)字節(jié)/半字的帶預(yù)索引加載,并且在加載后執(zhí)行帶符號(hào)擴(kuò)展成32位整數(shù)字/字節(jié)/半字/雙字的帶預(yù)索引存儲(chǔ)4.常用的Thumb-2指令集(2)Load/Store指令?后索引(Post‐indexing):STR.WR0,[R1],#-12;后索引?該指令是把R0的值存儲(chǔ)到地址R1處。在

存儲(chǔ)完畢后,R1=R1+(‐12)。?注意,[R1]后面是沒有“!”的。4.常用的Thumb-2指令集(2)Load/Store指令?后索引(Post‐indexing):

指令LDR.WRd,[Rn],#offsetLDRB.WRd,[Rn],#offsetLDRH.WRd,[Rn],#offsetLDRD.WRd1,Rd2,[Rn],#offsetLDRSB.WRd,[Rn],#offsetLDRSH.WRd,[Rn],#offsetSTR.WRd,[Rn],#offsetSTRB.WRd,[Rn],#offsetSTRH.WRd,[Rn],#offsetSTRD.WRd1,Rd2,[Rn],#offset

功能描述字/字節(jié)/半字/雙字的帶后索引加載(不做帶符號(hào)擴(kuò)展,沒有用到的高位全清0)字節(jié)/半字的帶后索引加載,并且在加載后執(zhí)行帶符號(hào)擴(kuò)展成32位整數(shù)字/字節(jié)/半字/雙字的帶后索引存儲(chǔ)4.常用的Thumb-2指令集(3)批量數(shù)據(jù)Load/Store指令

指令LDMIARd!,{寄存器列表}STMIARd!,{寄存器列表}LDMIA.WRd!,{寄存器列表}LDMDB.WRd!,{寄存器列表}STMIA.WRd!,{寄存器列表}STMDB.WRd!,{寄存器列表}

功能描述從Rd處讀取多個(gè)字。每讀一個(gè)字后Rd自增一次,16位寬度存儲(chǔ)多個(gè)字到Rd處。每存一個(gè)字后Rd自增一次,16位寬度從Rd處讀取多個(gè)字。每讀一個(gè)字后Rd自增一次,32位寬度從Rd處讀取多個(gè)字。每讀一個(gè)字前Rd自減一次,32位寬度存儲(chǔ)多個(gè)字到Rd處。每存一個(gè)字后Rd自增一次,32位寬度存儲(chǔ)多個(gè)字到Rd處。每存一個(gè)字前Rd自減一次,32位寬度4.常用的Thumb-2指令集(3)批量數(shù)據(jù)Load/Store指令Rd后面的“!”表示在每次訪問前(Before)或訪問后(After),要自增(Increment)或自減(Decrement)基址寄存器Rd的值,增/減單位:1個(gè)字(4字節(jié))。STMDBSP!,{R0-R3,LR}等效于PUSH{R0-R3,LR}LDMIASP!,{R0-R3,PC}等效于POP{R0-R3,PC}例2:記R8=0x8000,則下面兩條指令:STMIA.WR8!,{r0-R3};R8值變?yōu)?x8010,每存一次增一次,先存儲(chǔ)后自增STMDB.WR8,{R0-R3};R8值的“一個(gè)內(nèi)部復(fù)本”先自減后存儲(chǔ),但是R8的值不變4.常用的Thumb-2指令集(4)算術(shù)四則運(yùn)算指令

指令A(yù)DDRd,Rn,Rm;Rd=Rn+RmADDRd,Rm;Rd+=RmADDRd,#imm;Rd+=immADCRd,Rn,Rm;Rd=Rn+Rm+CADCRd,Rm;Rd+=Rm+CADCRd,#imm;Rd+=imm+CADDWRd,#imm12;Rd+=imm12SUBRd,Rn;Rd-=RnSUBRd,Rn,#imm3;Rd=Rn-imm3SUBRd,#imm8;Rd-=imm8SUBRd,Rn,Rm;Rd=Rm-RmSBCRd,Rm;Rd-=Rm+CSBC.WRd,Rn,#imm12;Rd=Rn-imm12-CSBC.WRd,Rn,Rm;Rd=Rn-Rm-CRSB.WRd,Rn,#imm12;Rd=imm12-RnRSB.WRd,Rn,Rm;Rd=Rm-RnMULRd,Rm;Rd*=RmMUL.WRd,Rn,Rm;Rd=Rn*RmMLARd,Rm,Rn,Ra;Rd=Ra+Rm*RnMLSRd,Rm,Rn,Ra;Rd=Ra-Rm*RnUDIVRd,Rn,Rm;Rd=Rn/Rm(無符號(hào)除法)SDIVRd,Rn,Rm;Rd=Rn/Rm(帶符號(hào)除法)SMULLRL,RH,Rm,Rn;[RH:RL]=Rm*RnSMLALRL,RH,Rm,Rn;[RH:RL]+=Rm*RnUMULLRL,RH,Rm,Rn;[RH:RL]=Rm*RnSMLALRL,RH,Rm,Rn;[RH:RL]+=Rm*Rn

功能描述常規(guī)加法imm的范圍是im8(16位指令)或im12(32位指令)帶進(jìn)位的加法imm的范圍是im8(16位指令)或im12(32位指令)帶12位立即數(shù)的常規(guī)加法常規(guī)減法帶借位的減法反向減法常規(guī)乘法乘加與乘減硬件支持的除法,余數(shù)被丟棄帶符號(hào)的64位乘法無符號(hào)的64位乘法4.常用的Thumb-2指令集(4)算術(shù)四則運(yùn)算指令例3:以加法為例說明16bit、32bit的算術(shù)四則運(yùn)算指令:ADDR0,R1ADDR0,#0x12ADD.WR0,R1,R2;R0+=R1;R0+=12;R0=R1+R2雖然助記符都是ADD,但是二進(jìn)制機(jī)器碼是不同的。當(dāng)使用16位加法時(shí),會(huì)自動(dòng)更新APSR中的標(biāo)志位。然而,在使用了“.W”顯式指定了32位指令后,就可以通過“S”

后綴控制對(duì)APSR的更新:ADD.WR0,R1,R2ADDS.WR0,R1,R2;不更新標(biāo)志位;更新標(biāo)志位4.常用的Thumb-2指令集(4)算術(shù)四則運(yùn)算指令UDIVRd,Rn,Rm;Rd=Rn/Rm(無符號(hào)除法)

SDIVRd,Rn,Rm;Rd=Rn/Rm(帶符號(hào)除法)例如:LDRr0,=300MOVR1,#7UDIV.WR2,R0,R1則R2=300/7=44為了捕捉被零除的非法操作,可以在NVIC的配置控制寄存器中置位DIVBZERO位。如果出現(xiàn)了被零除的情況,將會(huì)引發(fā)一個(gè)用法fault異常。果沒有任何措施,Rd將在除數(shù)為零時(shí)被清零4.常用的Thumb-2指令集(5)邏輯操作指令指令功能描述ANDRd,RnAND.WRd,Rn,#imm12AND.WRd,Rm,RnORRRd,RnORR.WRd,Rn,#imm12ORR.WRd,Rm,RnBICRd,RnBIC.WRd,Rn,#imm12BIC.WRd,Rm,RnORN.WRd,Rn,#imm12ORN.WRd,Rm,RnEORRd,RnEOR.WRd,Rn,#imm12EOR.WRd,Rm,Rn

;Rd&=Rn ;Rd=Rn&imm12 ;Rd=Rm&Rn ;Rd|=Rn ;Rd=Rn|imm12 ;Rd=Rm|Rn ;Rd&=~Rn ;Rd=Rn&~imm12;Rd=Rm&~Rn ;Rd=Rn|~imm12 ;Rd=Rm|~Rn ;Rd^=Rn ;Rd=Rn^imm12 ;Rd=Rm^Rn按位與按位或位清零按位或反碼(按位)異或,異或總是按位的4.常用的Thumb-2指令集(6)移位和循環(huán)指令指令功能描述LSLRd,Rn,#imm5LSLRd,RnLSL.WRd,Rm,RnLSRRd,Rn,#imm5LSRRd,RnLSR.WRd,Rm,RnASRRd,Rn,#imm5ASRRd,RnASR.WRd,Rm,RnRORRd,RnROR.WRd,Rm,RnRRX.WRd,RnRRXS.WRd,Rn;Rd=Rn<<imm5;Rd<<=Rn ;Rd=Rm<<Rn ;Rd=Rn>>imm5 ;Rd>>=Rn ;Rd=Rm>>Rn ;Rd=Rn·>>imm5 ;Rd·>>=Rn ;Rd=Rm·>>Rn ;Rd>>=Rn ;Rd=Rm>>Rn ;Rd=(Rn>>1)+(C<<31) ;tmpBit=Rn&1 ;Rd=(Rn>>1)+(C<<31) ;C=tmpBit邏輯左移邏輯右移算術(shù)右移循環(huán)右移帶進(jìn)位的右移一格亦可寫作RRX{S}Rd。此時(shí),Rd也要擔(dān)當(dāng)Rn的角色——譯注如果在移位和循環(huán)指令上加上“S”后綴,這些指令會(huì)更新進(jìn)位位C。如果是16位Thumb-2指令,則總是更新C的。4.常用的Thumb-2指令集(7)符號(hào)擴(kuò)展指令?二進(jìn)制補(bǔ)碼表示法中,最高位是符號(hào)位。?把一個(gè)8位或16位負(fù)數(shù)擴(kuò)展成32位時(shí):

①對(duì)于負(fù)數(shù),必須把所有高位全填1,其數(shù)值不變; ②至于正數(shù)或無符號(hào)數(shù),則只需簡(jiǎn)單地把高位清0。

指令SXTBRd,Rm ;Rd=Rm的帶符號(hào)擴(kuò)展SXTHRd,Rm ;Rd=Rm的帶符號(hào)擴(kuò)展

功能描述把帶符號(hào)字節(jié)整數(shù)擴(kuò)展到32位把帶符號(hào)半字整數(shù)擴(kuò)展到32位4.常用的Thumb-2指令集(8)字節(jié)調(diào)序指令

指令REV.WRd,RnREV16.WRd,RnREVSH.WRd,Rn

功能描述在字中調(diào)整字節(jié)序在高低半字中調(diào)整字節(jié)序在低半字中調(diào)整字節(jié)序,并做帶符號(hào)擴(kuò)展4.常用的Thumb-2指令集(8)字節(jié)調(diào)序指令例4:記R0=0x12345678,在執(zhí)行下列指令后:

REVR1,R0 REVHR2,R0 REV16R3,R0則R1=0x78563412,R2=0x12347856,R3=0x34127856。

字節(jié)調(diào)序指令可專門服務(wù)于小端模式和大端模式的轉(zhuǎn)換,最常用于網(wǎng)絡(luò)應(yīng)用程序中(網(wǎng)絡(luò)字節(jié)序是大端,主機(jī)字節(jié)序常是小端)。REVSH在REVH的基礎(chǔ)上,還把轉(zhuǎn)換后的半字做帶符號(hào)擴(kuò)展。例5:記R0=0x33448899,則

REVSHR1,R0執(zhí)行后,R1=0xFFFF9988。4.常用的Thumb-2指令集(9)位域處理指令

指令

BFC.WRd,#<lsb>,#<width> BFI.WRd,Rn,#<lsb>,#<width> CLZ.WRd,Rn RBIT.WRd,Rn SBFX.WRd,Rn,#<lsb>,#<width> UBFX.WRd,Rn,#<lsb>,#<width>例6:(1)BFC(位域清零)指令

LDRR0,=0x1234FFFF BFCR0,#4,#10執(zhí)行完后,R0=0x1234C00F

功能描述位域清零將一個(gè)寄存器的位域插入另一個(gè)寄存器中計(jì)算前導(dǎo)0的數(shù)目按位旋轉(zhuǎn)180度拷貝位域,并帶符號(hào)擴(kuò)展到32位拷貝位域,并無符號(hào)擴(kuò)展到32位4.常用的Thumb-2指令集(2)BFI(位域插入指令)

LDRR0,=0x12345678 LDRR1,=0xAABBCCDD BFI.WR1,R0,#8,#16則執(zhí)行后,R1=0xAA5678DD(3)RBIT指令,記R1=0xB4E10C23(二進(jìn)制數(shù)值為1011,0100,1110,0001,0000,1100,0010,0011),指令

RBIT.WR0,R1二進(jìn)制數(shù)值為執(zhí)行后,則R0=0xC430872D(1100,0100,0011,0000,1000,0111,0010,1101)。(4)UBFX/SBFX

LDRR0,=0x5678ABCD UBFX.WR1,R0,#12,#16;R0=0x0000678A。類似地,SBFX也抽取任意的位域,但是以帶符號(hào)的方式進(jìn)行擴(kuò)展。

LDRR0,=0x5678ABCD SBFX.WR1,R0,#8,#4;R0=0xFFFFFFFB4.常用的Thumb-2指令集(10)子程序調(diào)用與無條件轉(zhuǎn)移指令

①B,BL,BLX,BX ②MOV、LDR指令實(shí)現(xiàn)程序轉(zhuǎn)移?主要指令格式有:BLabelBXregBLLabel;轉(zhuǎn)移到Label處對(duì)應(yīng)的地址;轉(zhuǎn)移到由寄存器reg給出的地址;轉(zhuǎn)移到Label處對(duì)應(yīng)的地址,并且把轉(zhuǎn)移前的下條指令地址保存到LR

BLXreg;轉(zhuǎn)移到由寄存器reg給出的地址,根據(jù)REG的LSB切換處理器狀態(tài),并且把轉(zhuǎn)移前的下條指令地址保存到LR。MOVPC,R0LDRPC,[R0]POP{…,PC}

;轉(zhuǎn)移地址由R0給出;轉(zhuǎn)移地址存儲(chǔ)在R0所指向的存儲(chǔ)器中;把返回地址以彈出堆棧的風(fēng)格送給PC,;從而實(shí)現(xiàn)轉(zhuǎn)移LDMIASP!,{…,PC};POP的另一種等效寫法4.常用的Thumb-2指令集(11)程序狀態(tài)寄存器標(biāo)志位的更新指令①16位算術(shù)運(yùn)算指令②32位帶S后綴的算術(shù)邏輯指令③比較指令(如,CMP/CMN)和測(cè)試指令(如TST/TEQ)④直接寫PSR/APSR(MSR指令)4.常用的Thumb-2指令集(11)程序狀態(tài)寄存器標(biāo)志位的更新指令1)算術(shù)運(yùn)算指令大多數(shù)16位算術(shù)運(yùn)算指令會(huì)自動(dòng)更新標(biāo)志位(不是所有,例如ADD.NRd,Rn,Rm是16位指令,但不會(huì)更新標(biāo)志位),32位指令都可以通過使用S后綴來控制。如:ADDS.WR0,R1,R2;使用32位T2指令,更新標(biāo)志位

ADD.WR0,R1,R2;使用32位T2指令,不更新標(biāo)志ADDR0,R1;使用16位T2指令,更新標(biāo)志位對(duì)于32位指令而言,若沒有寫后綴,匯編器一定會(huì)生產(chǎn)部不更新標(biāo)志位的機(jī)器指令,但16位的Thumb指令,則可能會(huì)更新標(biāo)志位,也可能不更新標(biāo)志位。為了代碼能在不同匯編器下有相同的行為,當(dāng)需要更新標(biāo)志位以作為條件執(zhí)行指令的判斷依據(jù)時(shí),一定不能忘記加上后綴S。4.常用的Thumb-2指令集(11)程序狀態(tài)寄存器標(biāo)志位的更新指令2)比較和測(cè)試指令CMP指令

CMP指令在內(nèi)部做兩個(gè)數(shù)的減法,并依據(jù)計(jì)算結(jié)果來設(shè)置標(biāo)志位,但不把結(jié)果寫回寄存器如:CMPR0,R1CMPR0,#0x12CMN指令

CMN指令在內(nèi)部做兩個(gè)數(shù)的加法,并依據(jù)計(jì)算結(jié)果來設(shè)置標(biāo)志位,但不把結(jié)果寫回寄存器如:CMNR0,R1CMNR0,#0x124.常用的Thumb-2指令集(11)程序狀態(tài)寄存器標(biāo)志位的更新指令2)比較和測(cè)試指令TST指令

TST指令在內(nèi)部做兩個(gè)數(shù)的AND運(yùn)算,并依據(jù)計(jì)算結(jié)果來設(shè)置標(biāo)志位,但不把結(jié)果寫回寄存器如:TSTR0,R1;計(jì)算R0&R1,并根據(jù)結(jié)果更新標(biāo)志位TSTR0,#0x12TEQ指令

TEQ指令在內(nèi)部做兩個(gè)數(shù)的EOR運(yùn)算,并依據(jù)計(jì)算結(jié)果來設(shè)置標(biāo)志位,但不把結(jié)果寫回寄存器如:TEQR0,R1;計(jì)算R0&R1,并根據(jù)結(jié)果更新標(biāo)志位TEQR0,#0x124.常用的Thumb-2指令集(12)隔離(barrier)指令

針對(duì)結(jié)構(gòu)比較復(fù)雜的存儲(chǔ)器系統(tǒng)流水線作業(yè)和寫緩 沖,Cortex-M3引進(jìn)了隔離指令,以避免系統(tǒng)可能發(fā)生競(jìng)爭(zhēng)冒險(xiǎn)現(xiàn)象(racecondition)。指令DMBDSBISB

功能描述數(shù)據(jù)存儲(chǔ)器隔離。DMB指令保證:僅當(dāng)所有在它前面的存儲(chǔ)器訪問都執(zhí)行完畢后,才提交(commit)在它后面的存儲(chǔ)器訪問動(dòng)作。數(shù)據(jù)同步隔離。比DMB嚴(yán)格:僅當(dāng)所有在它前面的存儲(chǔ)器訪問都執(zhí)行完畢后,才執(zhí)行它在后面的指令。指令同步隔離。最嚴(yán)格:它會(huì)清洗流水線,以保證所有它前面的指令都執(zhí)行完畢之后,才執(zhí)行它后面的指令。4.常用的Thumb-2指令集(13)飽和運(yùn)算指令?Cortex-M3中的飽和運(yùn)算指令分為兩種:一種是帶符號(hào)飽和運(yùn)算;另一種是無符號(hào)飽和運(yùn)算。多用于信號(hào)處理,如信號(hào)放大?飽和運(yùn)算的結(jié)果可以用于更新應(yīng)用程序狀態(tài)寄存器APSR

中Q標(biāo)志。Q標(biāo)志在寫入后可以通過寫APSR清0。?Rn存儲(chǔ)“放大后的信號(hào)(32位帶符號(hào)整數(shù))”;Rd存儲(chǔ)飽和運(yùn)算的結(jié)果;#imm5用于指定飽和邊界——該由多少位的帶符號(hào)整數(shù)來表達(dá)允許的范圍,取值范圍是1-32。

指令名SSAT.WRd,#imm5,Rn,{,shift}USAT.WRd,#imm5,Rn,{,shift}

功能描述以帶符號(hào)數(shù)的邊界進(jìn)行飽和運(yùn)算(交流)以無符號(hào)數(shù)的邊界進(jìn)行飽和運(yùn)算(帶紋波的直流)4.常用的Thumb-2指令集(14)If-Then(IT)指令?If-Then(IT)指令圍起一個(gè)塊,里面最多有4條指令,它里面的指令可以 條件執(zhí)行。?IT已經(jīng)帶了一個(gè)“T”,因此還可以最多再帶3個(gè)“T”或者“E”。并且對(duì)T

和E的順序沒有要求。?其中T對(duì)應(yīng)條件成立時(shí)執(zhí)行的語句,E對(duì)應(yīng)條件不成立時(shí)執(zhí)行的語句。?在If-Then塊中的指令必須加上條件后綴,且T對(duì)應(yīng)的指令必須使用和IT

指令中相同的條件,E對(duì)應(yīng)的指令必須使用和IT指令中相反的條件。?IT的使用形式總結(jié)如下:IT<cond>IT<x><cond>IT<x><y><cond>IT<x><y><z><cond>;圍起1條指令的If-Then塊

;圍起2條指令的If-Then塊;圍起3條指令的If-Then塊;圍起4條指令的If-Then塊?其中<x>,<y>,<z>的取值可以是“T”或者“E”。而<cond>為條件。4.常用的Thumb-2指令集(14)If-Then(IT)指令例7:IT指令優(yōu)化C代碼的例子如下面?zhèn)未a所示:

if(R0==R1) { R3=R4+R5; R3=R3/2; } else { R3=R6+R7; R3=R3/2; }可以寫作:CMPR0,R1ITTEEEQ;比較R0和R1;如果R0==R1,Then-Then-Else-ElseADDEQR3,R4,R5ASREQR3,R3,#1

;相等時(shí)加法;相等時(shí)算術(shù)右移ADDNER3,R6,R7;不等時(shí)加法ASRNER3,R3,#1;不等時(shí)算術(shù)右移4.常用的Thumb-2指令集(15)比較條件跳轉(zhuǎn)指令CBZ和CBNZ比較并條件跳轉(zhuǎn)指令專為循環(huán)結(jié)構(gòu)的優(yōu)化而設(shè),它只能做前向跳轉(zhuǎn)。語法格式為:CBZ<Rn>,<label>CBNZ<Rn>,<label>它們的跳轉(zhuǎn)范圍較窄,只有0‐126。典型范圍如下所示:while(R0!=0){Function1();}變成LoopCBZR0,LoopExitBLFunction1BLoopLoopExit:與其它的比較指令不同,CBZ/CBNZ不會(huì)更新標(biāo)志位。4.常用的Thumb-2指令集(16)SXTB,SXTH,UXTB,UXTH指令這4個(gè)指令是為優(yōu)化C的強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換而設(shè)的,把數(shù)據(jù)寬度轉(zhuǎn)換成處理器喜歡的32位長(zhǎng)度(處理器字長(zhǎng)是多少,就喜歡多長(zhǎng)的整數(shù),其操作效率和存儲(chǔ)效率都最高)。它們的語法如下:SXTBRd,RnSXTHRd,RnSXTBRd,RnUXTHRd,Rn對(duì)于SXTB/SXTH,數(shù)據(jù)帶符號(hào)位擴(kuò)展成32位整數(shù)。對(duì)于UXTB/UXTH,高位清零。例如,記R0=0x55aa8765,則SXTBR1,R0;R1=0x00000065SXTHR1,R0;R1=0xffff8765UXTBR1,R0;R1=0x00000065UXTHR1,R0;R1=0x000087654.常用的Thumb-2指令集(17)TBB,TBH指令TBB(查表跳轉(zhuǎn)字節(jié)范圍的偏移量)指令和TBH(查表跳轉(zhuǎn)半字范圍的偏移量)指令,分別用于從一個(gè)字節(jié)數(shù)組表中查找轉(zhuǎn)移地址,和從半字?jǐn)?shù)組表中查找轉(zhuǎn)移地址。因?yàn)镃M3的指令至少是按半字對(duì)齊的,表中的數(shù)值都是在左移一位后才作為前向跳轉(zhuǎn)的偏移量的。又因?yàn)镻C的值為當(dāng)前地址+4,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論