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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

32bit指令可以在同一程序模塊出現(xià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)條件碼助記符標志含義EQZ=1相等NEZ=0不相等CS/HSC=1無符號數(shù)大于或等于CC/LOC=0無符號數(shù)小于MIN=1負數(shù)(minus

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

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

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

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

功能描述將8位立即數(shù)傳送到目標寄存器將低寄存器值傳送給低目標寄存器將高或低寄存器值傳送給高或低目標寄存器將寄存器值取反后傳送給目標寄存器<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用于特權級別條件下訪問特殊功能寄存器。指令語法如下:MRS<Rn>,<SReg>;加載特殊功能寄存器的值到RnMSR<Sreg>,<Rn>;存儲Rn的值到特殊功能寄存器其中,SReg可以是下表中的一個。4.常用的Thumb-2指令集(1)數(shù)據(jù)傳送指令

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

符號IPSREPSRAPSRIEPSRIAPSREAPSRPSRMSPPSPPRIMASKBASEPRIBASEPRI_MAXFAULTMASKCONTROL

功能當前服務中斷號寄存器執(zhí)行狀態(tài)寄存器(讀回來的總是0)。它里面含T位,在CM3中T位必須是1。上條指令結(jié)果的標志IPSR+EPSRIPSR+APSREPSR+APSRxPSR=APSR+EPSR+IPSR主堆棧指針進程堆棧指針常規(guī)異常屏蔽寄存器常規(guī)異常的優(yōu)先級閾值寄存器等同BASEPRI,但是施加了寫的限制:新的優(yōu)先級比較比舊的高(更小的數(shù))fault屏蔽寄存器(同時還包含了PRIMASK的功能,因為faults的優(yōu)先級更高)控制寄存器(堆棧選擇,特權等級)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處讀取一個字節(jié)到Rd從地址Rn+offset處讀取一個半字到Rd從地址Rn+offset處讀取一個字到Rd從地址Rn+offset處讀取一個雙字(64位整數(shù))到Rd1(低32位)和Rd2(高32位)中。把Rd中的低字節(jié)存儲到地址Rn+offset處把Rd中的低半字存儲到地址Rn+offset處把Rd中的低字存儲到地址Rn+offset處把Rd1(低32位)和Rd2(高32位)表達的雙字存儲到地址Rn+offset處4.常用的Thumb-2指令集(2)Load/Store指令預索引(Pre‐indexing):LDR.WR0,[R1,#20]!;預索引該指令先把地址R1+20處的值加載到R0,然后,R1=R1+20;這里的“!”就是指在傳送后更新基址寄存器R1的值。即:步驟①:R0←[R1+20]

步驟②:R1=R1+20,4.常用的Thumb-2指令集(2)Load/Store指令預索引(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é)/半字/雙字的帶預索引加載(不做帶符號擴展,沒有用到的高位全清0)字節(jié)/半字的帶預索引加載,并且在加載后執(zhí)行帶符號擴展成32位整數(shù)字/字節(jié)/半字/雙字的帶預索引存儲4.常用的Thumb-2指令集(2)Load/Store指令?后索引(Post‐indexing):STR.WR0,[R1],#-12;后索引?該指令是把R0的值存儲到地址R1處。在

存儲完畢后,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é)/半字/雙字的帶后索引加載(不做帶符號擴展,沒有用到的高位全清0)字節(jié)/半字的帶后索引加載,并且在加載后執(zhí)行帶符號擴展成32位整數(shù)字/字節(jié)/半字/雙字的帶后索引存儲4.常用的Thumb-2指令集(3)批量數(shù)據(jù)Load/Store指令

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

功能描述從Rd處讀取多個字。每讀一個字后Rd自增一次,16位寬度存儲多個字到Rd處。每存一個字后Rd自增一次,16位寬度從Rd處讀取多個字。每讀一個字后Rd自增一次,32位寬度從Rd處讀取多個字。每讀一個字前Rd自減一次,32位寬度存儲多個字到Rd處。每存一個字后Rd自增一次,32位寬度存儲多個字到Rd處。每存一個字前Rd自減一次,32位寬度4.常用的Thumb-2指令集(3)批量數(shù)據(jù)Load/Store指令Rd后面的“!”表示在每次訪問前(Before)或訪問后(After),要自增(Increment)或自減(Decrement)基址寄存器Rd的值,增/減單位:1個字(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,每存一次增一次,先存儲后自增STMDB.WR8,{R0-R3};R8值的“一個內(nèi)部復本”先自減后存儲,但是R8的值不變4.常用的Thumb-2指令集(4)算術四則運算指令

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

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

SDIVRd,Rn,Rm;Rd=Rn/Rm(帶符號除法)例如:LDRr0,=300MOVR1,#7UDIV.WR2,R0,R1則R2=300/7=44為了捕捉被零除的非法操作,可以在NVIC的配置控制寄存器中置位DIVBZERO位。如果出現(xiàn)了被零除的情況,將會引發(fā)一個用法fault異常。果沒有任何措施,Rd將在除數(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邏輯左移邏輯右移算術右移循環(huán)右移帶進位的右移一格亦可寫作RRX{S}Rd。此時,Rd也要擔當Rn的角色——譯注如果在移位和循環(huán)指令上加上“S”后綴,這些指令會更新進位位C。如果是16位Thumb-2指令,則總是更新C的。4.常用的Thumb-2指令集(7)符號擴展指令?二進制補碼表示法中,最高位是符號位。?把一個8位或16位負數(shù)擴展成32位時:

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

指令SXTBRd,Rm ;Rd=Rm的帶符號擴展SXTHRd,Rm ;Rd=Rm的帶符號擴展

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

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

功能描述在字中調(diào)整字節(jié)序在高低半字中調(diào)整字節(jié)序在低半字中調(diào)整字節(jié)序,并做帶符號擴展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)序指令可專門服務于小端模式和大端模式的轉(zhuǎn)換,最常用于網(wǎng)絡應用程序中(網(wǎng)絡字節(jié)序是大端,主機字節(jié)序常是小端)。REVSH在REVH的基礎上,還把轉(zhuǎn)換后的半字做帶符號擴展。例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

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

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

RBIT.WR0,R1二進制數(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也抽取任意的位域,但是以帶符號的方式進行擴展。

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

①B,BL,BLX,BX ②MOV、LDR指令實現(xiàn)程序轉(zhuǎn)移?主要指令格式有:BLabelBXregBLLabel;轉(zhuǎn)移到Label處對應的地址;轉(zhuǎn)移到由寄存器reg給出的地址;轉(zhuǎn)移到Label處對應的地址,并且把轉(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)移地址存儲在R0所指向的存儲器中;把返回地址以彈出堆棧的風格送給PC,;從而實現(xiàn)轉(zhuǎn)移LDMIASP!,{…,PC};POP的另一種等效寫法4.常用的Thumb-2指令集(11)程序狀態(tài)寄存器標志位的更新指令①16位算術運算指令②32位帶S后綴的算術邏輯指令③比較指令(如,CMP/CMN)和測試指令(如TST/TEQ)④直接寫PSR/APSR(MSR指令)4.常用的Thumb-2指令集(11)程序狀態(tài)寄存器標志位的更新指令1)算術運算指令大多數(shù)16位算術運算指令會自動更新標志位(不是所有,例如ADD.NRd,Rn,Rm是16位指令,但不會更新標志位),32位指令都可以通過使用S后綴來控制。如:ADDS.WR0,R1,R2;使用32位T2指令,更新標志位

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

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

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

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

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

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

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

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

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

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

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

指令中相同的條件,E對應的指令必須使用和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

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

溫馨提示

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

評論

0/150

提交評論