第2章ARM7TDMI處理器編程基礎(chǔ)課件_第1頁
第2章ARM7TDMI處理器編程基礎(chǔ)課件_第2頁
第2章ARM7TDMI處理器編程基礎(chǔ)課件_第3頁
第2章ARM7TDMI處理器編程基礎(chǔ)課件_第4頁
第2章ARM7TDMI處理器編程基礎(chǔ)課件_第5頁
已閱讀5頁,還剩183頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第2章ARM7TDMI處理器編程基礎(chǔ).2.1ARM7TDMI內(nèi)核架構(gòu)

ARM7TDMI是目前使用最廣泛的32位嵌入式RISC處理器,屬于低端ARM處理器核。

ARM7TDMI是內(nèi)核主要由32位ALU、指令譯碼器與邏輯控制、指令流水線、讀/寫數(shù)據(jù)寄存器、移位器、乘法器、地址遞增單元、地址寄存器等構(gòu)成。本書選取的是韓國三星公司生產(chǎn)的ARM7TDMI內(nèi)核處理器S3C4510B作為開發(fā)實例。.ARM內(nèi)核架構(gòu)框圖.1.ARM7TDMI內(nèi)核特點(1)具有嵌入式ICE-RT邏輯,調(diào)試開發(fā)方便。(2)極低的功耗,適合對功耗要求較高的應(yīng)用,如便攜式產(chǎn)品。(3)能夠提供0.9MIPS/MHz的三級流水線結(jié)構(gòu)。(4)代碼密度高并兼容16位的Thumb指令集。(5)對操作系統(tǒng)的支持廣泛,包括WindowsCE、Linux、PalmOS等。(6)指令系統(tǒng)與ARM9系列、ARM9E系列和ARM10系列兼容,便于用戶的產(chǎn)品升級換代。(7)主頻最高可達(dá)130MHz,高速的運算處理能力能勝任絕大多數(shù)的復(fù)雜應(yīng)用。.

ARM7TDMI的名稱含義為:

ARM7:32位ARM體系結(jié)構(gòu)4T版本,ARM632位整型核的3V兼容的版本;

T:支持16位壓縮指令集Thumb;

D:支持片上調(diào)試(Debug);

M:內(nèi)嵌硬件乘法器(Multiplier);

I:嵌入式ICE,支持片上斷點和調(diào)試點。.ARM720T

ARM720T是在ARM7TDMI處理器核的基礎(chǔ)上增加了一個8KB的指令和數(shù)據(jù)混合的Cache。外部存儲器和外圍器件通過AMBA總線主控單元訪問,同時還集成了寫緩沖器以及全性能的MMU。ARM720T最適合于有低功耗和小體積要求的應(yīng)用。

ARM7EJ

ARM7EJ是Jazelle和DSP指令集的最小和最低功耗的實現(xiàn)。

ARM7系列微處理器的主要應(yīng)用領(lǐng)域為:工業(yè)控制、Internet設(shè)備、網(wǎng)絡(luò)和調(diào)制解調(diào)器設(shè)備、移動電話等多種多媒體和嵌入式應(yīng)用。

.

流水線ARM7系列的處理器采用三級流水線的組織結(jié)構(gòu),ARM9系列的處理器采用五級流水線的組織結(jié)構(gòu)。流水線技術(shù)是現(xiàn)代微處理器普遍采用的一種技術(shù),它可以使得幾條指令并行執(zhí)行,因此可以大大提高處理器的運行效率。三級流水線分為以下三級:(1)取指:從程序存儲器中讀取指令,放入流水線中。(2)譯碼:操作碼和操作數(shù)被譯碼,決定執(zhí)行什么功能,為下一個時鐘周期準(zhǔn)備數(shù)據(jù)路徑所需要的控制信號。(3)執(zhí)行:執(zhí)行已譯碼的指令。具體過程是,指令進(jìn)入數(shù)據(jù)路徑,寄存器堆被讀取,操作數(shù)被移位,ALU進(jìn)行相應(yīng)的運算,將結(jié)果寫到目的寄存器,同時ALU運算的結(jié)果還會根據(jù)指令的要求改變寄存器的條件位。.

在正常情況下,每條指令都被劃分成3個時鐘周期來完成,即取指、譯碼和執(zhí)行。但對于流水線來講,可以使得每個時鐘周期完成一條指令,即每個周期流水線都有一條指令的吞吐量(Throughput)。通常將這種情況稱為單周期指令的三級流水線操作,如圖所示。

.2.處理器工作狀態(tài)ARM處理器具有兩種特殊的工作狀態(tài):(1)ARM狀態(tài):32位,執(zhí)行字對準(zhǔn)的ARM指令。(2)Thumb狀態(tài):16位,執(zhí)行半字對準(zhǔn)的Thumb指令。ARM處理器可以在兩種工作狀態(tài)之間切換:

Thumb狀態(tài):當(dāng)操作數(shù)寄存器的狀態(tài)位[0]為1時,執(zhí)行BX指令將進(jìn)入Thumb狀態(tài)。如果ARM處理器在Thumb狀態(tài)進(jìn)入異常,則異常處理返回時,自動切換到Thumb狀態(tài)。

ARM狀態(tài):當(dāng)操作數(shù)寄存器的狀態(tài)位

[0]為0時,執(zhí)行BX指令將進(jìn)入ARM狀態(tài)。當(dāng)ARM處理器進(jìn)行異常處理時,如果把PC指針放入異常模式鏈接寄存器中,則程序從異常向量地址開始執(zhí)行,也可以使處理器進(jìn)入ARM狀態(tài)。

.3.處理器數(shù)據(jù)存儲格式存儲器格式包括小端和大端兩種格式。.在小端存儲格式下,字或半字地址的低字節(jié)(對準(zhǔn)字節(jié))存放在低地址;在大端存儲格式下,字或半字地址的低字節(jié)(對準(zhǔn)字節(jié))存放在高地址。下面舉例說明大、小端存儲格式對程序的影響,如圖所示。

.圖中,指令STRR0,[R1]將R0中的字存入R1的地址,指令LDRBR2,[R1]將R1中的一個字節(jié)加載到R2??梢钥吹剑瑢τ赗0=0x11223344,如果配置成小端存儲格式,則R2的值為0x44;如果配置成大端存儲格式,則R2的值為0x11。ARM處理器的大、小端存儲格式是通過硬件配置的,如果連接有系統(tǒng)控制協(xié)處理器,則另當(dāng)別論。小端存儲格式是ARM處理器的缺省格式。

.4.處理器數(shù)據(jù)類型和長度ARM處理器支持以下數(shù)據(jù)類型:

Byte 字節(jié),8位

Halfword

半字,16位

(半字必須與2字節(jié)邊界對準(zhǔn),地址低兩位總為0)

Word 字,32位(字必須與4字節(jié)邊界對準(zhǔn),地址的最低位為0).說明:

(1)數(shù)據(jù)類型被說明成unsigned類型時,N位數(shù)據(jù)值表示范圍是0~2N-1的非負(fù)整數(shù),使用通常的二進(jìn)制格式。(2)數(shù)據(jù)類型被說明成signed類型時,N位數(shù)據(jù)值表示范圍是-2N-1~2N-1-1的整數(shù),使用二進(jìn)制的補(bǔ)碼格式。(3)所有的數(shù)據(jù)操作,如ADD,都以字進(jìn)行處理。

(4)加載和存儲操作,以字節(jié)、半字或字的大小與存儲器交換數(shù)據(jù)。加載時自動進(jìn)行字節(jié)或半字的零擴(kuò)展或符號擴(kuò)展。(5)ARM指令的長度為一個字(與4字節(jié)邊界對準(zhǔn)),Thumb指令的長度為一個半字(與2字節(jié)邊界對準(zhǔn))。

.5.處理器模式.說明:(1)外部中斷或異常處理可以引起處理器模式的改變,采用軟件控制的方式也可以人為改變處理器模式。(2)應(yīng)用程序一般在用戶模式下運行,此時程序不能訪問某些被保護(hù)的系統(tǒng)資源,也不能改變處理器模式。(3)除用戶模式外的其他模式稱為特權(quán)模式,在特權(quán)模式下用戶可以自由地訪問系統(tǒng)資源和改變處理器模式。(4)每種模式都有某些附加的寄存器,用來避免異常出現(xiàn)時用戶模式的狀態(tài)不可靠。(5)系統(tǒng)模式僅存在于ARM體系結(jié)構(gòu)v4以上的版本中,它與用戶模式擁有完全相同的寄存器,供需要訪問系統(tǒng)資源的操作系統(tǒng)任務(wù)所使用,與異常的發(fā)生無關(guān)。

.6.寄存器組織ARM處理器共有37個寄存器:31個通用寄存器,32位,含程序計數(shù)器PC;6個狀態(tài)寄存器,32位,只使用了其中的12位。雖然這些寄存器都參與指令的執(zhí)行,但在指令執(zhí)行前后只有可見寄存器的值才具有意義。因此,我們僅關(guān)注ARM處理器的可見寄存器,如圖所示。

當(dāng)編寫用戶程序時,37個寄存器中只有通用寄存器r0~r14、程序計數(shù)器PC(r15)和當(dāng)前程序狀態(tài)寄存器CPSR需要考慮,其余寄存器僅用于系統(tǒng)級編程和異常處理(如中斷)。.ARM狀態(tài)下寄存器組織.當(dāng)編寫用戶程序時,37個寄存器中只有通用寄存器r0~r14、程序計數(shù)器PC(r15)和當(dāng)前程序狀態(tài)寄存器CPSR需要考慮,其余寄存器僅用于系統(tǒng)級編程和異常處理(如中斷)。

(1)不分組寄存器r0~r7。不分組意味著在所有處理器模式下,r0~r7都可被同樣訪問,沒有體系結(jié)構(gòu)所隱含的特殊用途。

(2)分組寄存器r8~r14。分組意味著r8~r14的訪問與當(dāng)前處理器的模式相關(guān)。如果要訪問r8~r14,而不依賴于當(dāng)前處理器的模式,就必須使用規(guī)定的寄存器名稱。名稱的形式為:r8_<mode>~r14_<mode>。

.從ARM寄存器組織的圖中可以看出r8~r12各有兩組物理寄存器:一組為FIQ模式,另一組為FIQ以外的模式。寄存器r8~r12沒有指定特殊用途,而使用r8_fiq~r12_fiq則允許快速中斷。

寄存器r13和r14的用途比較特殊:

①r13通常用作堆棧指針SP,被初始化成指向異常模式分配的堆棧。處理異常時,在程序入口處將異常處理程序用到的其他寄存器的值壓入堆棧,返回時重新將這些值加載到寄存器中。這樣就可以保證出現(xiàn)異常時不導(dǎo)致程序狀態(tài)不可靠。②r14通常用作子程序鏈接寄存器LR。當(dāng)執(zhí)行分支指令BL時,r15的內(nèi)容拷貝到r14中,從而成為子程序調(diào)用后的返回地址。采用這種方式可以類似地用來處理異常的返回。

.(3)程序計數(shù)器r15。寄存器r15通常被用作程序計數(shù)器PC。在ARM狀態(tài)下,由于ARM指令始終是字對準(zhǔn)的,因此PC的值保存在位[31:2],而位[1:0]為0;在Thumb狀態(tài)下,由于Thumb指令是半字對準(zhǔn)的,因此PC的值保存在位[31:1],而位[0]為0。

①讀程序計數(shù)器PC:用指令讀出的r15的值為指令地址加8個字節(jié)。讀PC主要用于快速對臨近的指令和數(shù)據(jù)進(jìn)行位置無關(guān)的尋址。

寫程序計數(shù)器PC:寫r15的結(jié)果是將寫到r15的值作為指令地址,并根據(jù)這個地址發(fā)生轉(zhuǎn)移。

.(4)當(dāng)前程序狀態(tài)寄存器CPSR。當(dāng)前程序狀態(tài)寄存器(CPSR,CurrentProgramStatusRegister)在用戶級編程時用于存儲條件碼。CPSR還包含了中斷禁止位、當(dāng)前處理器模式以及其他的一些狀態(tài)和控制信息。同時,為了在異常出現(xiàn)時能夠保存CPSR的狀態(tài),每種異常模式都設(shè)置了一個程序狀態(tài)保存寄存器(SPSR,SavedProgramStatusRegister)。顯然,CPSR和SPSR具有相同的格式,如圖所示。

.

N、Z、C、V、Q是條件碼標(biāo)志,可通過比較指令以及算術(shù)、邏輯運算和傳送指令進(jìn)行修改。條件碼標(biāo)志的含義為:

N:負(fù)數(shù)。對于結(jié)果是帶符號的二進(jìn)制補(bǔ)碼,如果結(jié)果為負(fù)數(shù),則N=1;如果結(jié)果為正數(shù)或0,則N=0。

Z:零。如果結(jié)果為0,則Z置1,通常表示比較的結(jié)果相等。

C:進(jìn)位。無論是算術(shù)運算還是移位操作,只要指令操作產(chǎn)生進(jìn)位輸出,則C被設(shè)置。

V:溢出。算術(shù)運算產(chǎn)生到符號位的溢出,則V被設(shè)置。

Q:指示增強(qiáng)型DSP指令中是否出現(xiàn)溢出或飽和,僅出現(xiàn)在ARM體系結(jié)構(gòu)v5以上版本的E變量中。

.I、F、T和M[4:0]是控制位??刂莆坏母淖兣c異常的出現(xiàn)有關(guān),另外在特權(quán)模式下,也可由軟件改變。

I:置1則禁止IRQ中斷。

F:置1則禁止FIQ中斷。

T:對于ARM體系結(jié)構(gòu)v4以上版本,T=0指示ARM執(zhí)行,T=1指示Thumb執(zhí)行;對于ARM體系結(jié)構(gòu)v5以上版本,T=0指示ARM執(zhí)行,T=1指示下一條指令引起未定義的指令異常。

M[4:0]:模式位。決定處理器的工作模式,即用戶、FIQ、IRQ、管理、中止、未定義、系統(tǒng)。

.

(5)Thumb狀態(tài)的寄存器集。Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下寄存器集的子集。具體情況如圖所示。

..

異常(exception)是指由內(nèi)部或外部源產(chǎn)生從而需要處理器處理的一個事件。例如,外部中斷或試圖實行未定義的指令都會引起異常的發(fā)生。處理異常之前,處理器必須保存當(dāng)前的狀態(tài),以便在異常處理完成后,能夠使原來的操作重新執(zhí)行。ARM支持7種類型的異常。對于每種異常,處理器將強(qiáng)制從異常對應(yīng)的某個固定地址開始執(zhí)行程序。這些固定地址稱為異常向量。

7.異常模式.異常出現(xiàn)時,相應(yīng)異常模式下的r14和SPSR用來保存當(dāng)前狀態(tài),其過程如下:r14_<exception_mode>=returnlink/*將下一條指令的地 址存入相應(yīng)連接寄存器LR*/SPSR_<exception_mode>=CPSR/*將CPSR復(fù)制到相應(yīng)的SPSR*/CPSR[4:0]=exceptionmodenumber/*根據(jù)異常類型,強(qiáng)制設(shè)置CPSR的運行模式*/CPSR[5]=0 /*使處理器在ARM狀態(tài)下執(zhí)行*/CPSR[7]=1 /*禁止新的IRQ中斷*/If<exception_mode>==ResetorFIQthenCPSR[6]=1 /*禁止新的FIQ中斷*/PC=exceptionvectoraddress/*強(qiáng)制PC從相關(guān)的異常向量地址取下一條指令執(zhí)行,跳轉(zhuǎn)到相應(yīng)的異常處理程序處*/.

異常處理完成后返回的過程與進(jìn)入異常處理的過程相逆,主要是需要將SPSR的內(nèi)容恢復(fù)到CPSR,將r14的內(nèi)容恢復(fù)到PC。具體做法主要有兩種:使用帶S位的數(shù)據(jù)處理指令,將PC作為目的寄存器;使用帶恢復(fù)CPSR的多加載指令。多個異常可能會同時發(fā)生,因此在ARM中就通過給各個異常賦予不同的優(yōu)先級來確定處理異常的順序。優(yōu)先級按照從高到低的順序排列如下:

復(fù)位→數(shù)據(jù)異常中止→FIQ→IRQ→預(yù)取指異常中止→SWI、未定義指令(這兩種異常的指令編碼互斥,不可能同時發(fā)生)

.

1.寄存器尋址指令地址碼給出寄存器的編號,寄存器中的內(nèi)容為操作數(shù)。

ADDR0,R1,R2 ;R0←R1+R2這條指令的含義是將寄存器R1和R2的內(nèi)容相加,結(jié)果放入寄存器R0中。注意寫操作數(shù)的順序為:第1個寄存器R0為結(jié)果寄存器,第2個寄存器R1為第一操作數(shù)寄存器,第3個寄存器R2為第二操作數(shù)寄存器。

2.2ARM指令系統(tǒng)2.2.1ARM尋址方式.指令操作碼后的地址碼是立即數(shù),即操作數(shù)本身。例:

ADDR3,R3,#1 ;R3←R3+1ANDR8,R7,#&FF ;R8←R7[7:0]立即數(shù)的表示以“#”為前綴,十六進(jìn)制的立即數(shù)在“#”后面加“&”符號。第1條指令將R3的內(nèi)容加1,結(jié)果放入R3中;第2條指令將R7的32位值與立即數(shù)0FFH邏輯與,結(jié)果是將R7的低8位放入R8中。

2.立即尋址.

3.寄存器移位尋址

寄存器移位尋址是ARM指令集特有的尋址方式。第2個操作數(shù)與第1個操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。例:

ADDR3,R2,R1,LSL#3 ;R3←R2+8×R1寄存器R1的內(nèi)容邏輯左移3位,再與寄存器R2的內(nèi)容相加,結(jié)果放入R3中??刹扇〉囊莆徊僮靼ǎ?/p>

LSL:邏輯左移(LogicalShiftLeft)。寄存器中字的低端空出的位補(bǔ)0。

.

LSR:邏輯右移(LogicalShiftRight)。寄存器中字的高端空出的位補(bǔ)0。

ASR:算術(shù)右移(ArithmeticShiftRight)。算術(shù)移位的對象是帶符號數(shù)。在移位過程中必須保持操作數(shù)的符號不變。若源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ)0;若源操作數(shù)為負(fù)數(shù),則字的高端空出的位補(bǔ)1。

ROR:循環(huán)右移(ROtateRight)。從字的最低端移出的位填入字的高端空出的位。

RRX:擴(kuò)展為1的循環(huán)右移(RotateRighteXtendedby1place)。操作數(shù)右移1位,空位(位[31])用“C”標(biāo)志填充。

..

4.寄存器間接尋址指令地址碼給出寄存器的編號,寄存器為地址指針,存放操作數(shù)的有效地址。例:LDRR0,[R1] ;R0←[R1]STRR0,[R1] ;R0→[R1]第1條指令將寄存器R1所指向的地址單元的內(nèi)容加載到寄存器R0中。第2條指令將寄存器R0的內(nèi)容存入寄存器R1指向的地址單元。

.

5.基址尋址

基址尋址是將基址寄存器的內(nèi)容與指令中給出的位移量相加,形成操作數(shù)有效地址。基址尋址用于訪問基址附近的存儲單元,包括基址加偏移量尋址和基址加索引尋址,可以將寄存器間接尋址看作是位移量為0的基址加偏移量尋址。

1)基址加偏移量尋址

基址加偏移量尋址中的偏移量最大為4KB,可分為前索引尋址和后索引尋址。

.

前索引尋址舉例:

LDRR0,[R1,#4] ;R0←[R1+4]

這條指令是把基址R1的內(nèi)容加上偏移量4后所指向的存儲單元的內(nèi)容加載到寄存器R0中。

后索引尋址舉例:

LDRR0,[R1],#4 ;R0←[R1] ;R1←R1+4后索引尋址是指基址不帶偏移作為傳送的地址,傳送后自動索引。.

這種改變基址寄存器指向下一個傳送的地址對數(shù)據(jù)塊傳送很有用,還可以采用帶自動索引的前索引尋址實現(xiàn)。例:

LDRR0,[R1,#4]! ;R0←[R1] ;R1←R1+4

這兩條指令功能相同,符號“!”表明指令在完成數(shù)據(jù)傳送后更新基址寄存器。ARM的這種自動索引不消耗額外的時間。

.

2)基址加索引尋址基址加索引尋址是指先指定一個基址寄存器,再指定另一個寄存器(稱為索引),其值作為位移加到基址上形成存儲器地址。例:

LDRR0,[R1,R2] ;R0←[R1+R2]

這條指令是將R1和R2的內(nèi)容相加得到操作數(shù)的地址,再將此地址單元的內(nèi)容加載到R0。

.

6.多寄存器尋址多寄存器尋址是指一次可以傳送多個寄存器的值,允許一條指令一次傳送16個寄存器的任何子集,包括16個寄存器。例:

LDMIAR1,{R0,R2,R5} ;R0←[R1] ;R2←[R1+4] ;R5←[R1+8]

由于傳送的數(shù)據(jù)總是32位的字,因此基址寄存器R1應(yīng)當(dāng)字對準(zhǔn)。這條指令是將R1指向的連續(xù)存儲單元的內(nèi)容送到寄存器R0、R2和R5。

.7.堆棧尋址

堆棧是一種按照特定順序進(jìn)行存取的存儲區(qū)。這種特定的順序是指“后進(jìn)先出”(LIFO)或“先進(jìn)后出”(FILO)。使用堆棧時需要使用一個專門的寄存器作為堆棧指針,堆棧指針?biāo)付ǖ拇鎯卧褪嵌褩5臈m?。如果堆棧指針指向最后壓入堆棧的有效?shù)據(jù)項,就稱為滿堆棧(fullstack);如果堆棧指針指向下一個數(shù)據(jù)項放入的空位置,就稱為空堆棧(emptystack)。另外,根據(jù)堆棧存儲區(qū)地址增長的方向,可將堆棧分為遞增堆棧(ascendingstack)和遞減堆棧(descendingstack)。

.以上表示遞增、遞減、滿、空的堆棧的各種組合就產(chǎn)生了4種堆棧類型。ARM支持所有這4種類型的堆棧,即滿遞增、空遞增、滿遞減、空遞減。

ARM指令使用push向堆棧寫數(shù)據(jù),稱為進(jìn)棧;使用pop從堆棧讀數(shù)據(jù),稱為出棧。.8.塊拷貝尋址

從堆棧的角度來看,多寄存器傳送指令是把一塊數(shù)據(jù)從存儲器的某一個位置拷貝到另一位置。從塊拷貝的角度來看,具體使用哪條指令還要基于數(shù)據(jù)存儲在基址寄存器地址之上還是之下,地址在存儲第一個值之前或之后增加或減少。這兩種角度的映射均取決于執(zhí)行加載操作還是存儲操作。表列出了多寄存器加載和存儲指令映射。

.表多寄存器加載和存儲指令映射

.例:LDMIAR0!,{R2-R9} ;將數(shù)據(jù)加載到R2~R9STMIAR1,{R2-R9} ;將數(shù)據(jù)存入存儲器執(zhí)行指令后,由于引用自動索引“!”,R0的值共增加32,而R1不變。若R2~R9的內(nèi)容有保存價值,就需要把它們壓棧,即STMFDR13!,{R2-R9} ;存儲寄存器到堆棧LDMIAR0!,{R2-R9}STMIAR1,{R2-R9}LDMFDR13!,{R2-R9} ;從堆?;謴?fù)

.多寄存器指令的后綴含義如下:I:IncrementD:DecrementorDescendingstackA:AfterorAscendingstackB:BeforeF:FullE:Empty例如“FD”即表明是滿遞減堆棧尋址方式(fulldescendingstack)。

.

9.相對尋址可以將相對尋址看作是以程序計數(shù)器PC為基址的一種基址尋址方式。指令的地址碼作為位移量,與PC相加得到操作數(shù)的有效地址。位移量指出了操作數(shù)與當(dāng)前指令之間的相對位置。例: BLSUBR ;轉(zhuǎn)移到SUBR ... ;返回到此SUBR ... ;子程序入口地址 MOVPC,R14 ;返回

.1.ARM指令集編碼ARM指令集采用32位二進(jìn)制編碼方式,大部分指令編碼中定義了第一操作數(shù)、第二操作數(shù)、目的操作數(shù)、條件標(biāo)志影響位以及每條指令所對應(yīng)的不同功能實現(xiàn)的二進(jìn)制位。每條ARM指令都具有不同的編碼方式,與不同的指令功能相對應(yīng),如圖2-16所示。

2.2.2ARM指令集..2.條件執(zhí)行條件執(zhí)行是指只有在當(dāng)前程序狀態(tài)寄存器CPSR中的條件碼標(biāo)志滿足指定的條件時,帶條件碼的指令才能執(zhí)行。條件轉(zhuǎn)移是絕大多數(shù)指令集的標(biāo)準(zhǔn)特征,但ARM指令集將條件執(zhí)行擴(kuò)展到所有指令,包括監(jiān)控調(diào)用和協(xié)處理器指令。條件域占據(jù)32個指令域的高4位,如圖2-17所示。

條件域共有16個值,即16個條件碼,如表2-5所示,其中AL(Always)條件是缺省條件。

.表2-5條

.

對于條件執(zhí)行,需要說明的有以下兩點:(1)幾乎所有的ARM數(shù)據(jù)處理指令都可以根據(jù)執(zhí)行結(jié)果來選擇是否更新條件碼標(biāo)志。當(dāng)指令中包含后綴“S”時,指令將更新條件碼標(biāo)志。(2)可以根據(jù)另一條指令設(shè)置的標(biāo)志,有條件地執(zhí)行某條指令。

.

3.ARM指令格式ARM指令集是Load/Store型的,只能通過Load/Store指令實現(xiàn)對存儲器的訪問,其他類型的指令都基于寄存器完成。ARM指令使用的基本格式如下:

<opcode>{<cond>}{S} <Rd>,<Rn>{,<operand2>}其中:

opcode:操作碼,指令助記符,如LDR、STR等。

cond:可選的條件碼,執(zhí)行條件,如EQ、NE等。

S:可選后綴,若指定S,則根據(jù)指令執(zhí)行結(jié)果更新CPSR中的條件碼。

.

Rd:目標(biāo)寄存器。

Rn:存放第1操作數(shù)的寄存器。

operand2:第2操作數(shù)。

“<>":必需項。

“{}":可選項。例:

LDR R0,[R1] ;將R1地址上的存儲器單元的內(nèi)容加載到R0,執(zhí)行條件AL.BEQDATAEVEN ;條件執(zhí)行的分支指令,執(zhí)行條件EQ,相等則跳轉(zhuǎn)到DATAEVEN

ADDSR2,R1,#1 ;加法指令,R2←R1+1,影響CPSR

SUBNESR2,R1,#0x20 ;條件執(zhí)行的減法指令,執(zhí)行條件NE,R2←R1-0x20,影響CPSR.

4.ARM存儲器訪問指令

1)LDR、STRLDR和STR為單一數(shù)據(jù)傳送指令,可傳送字和無符號字節(jié)、半字和帶符號字節(jié)、雙字。

(1)字和無符號字節(jié)。*句法:op{cond}{B}{T}Rd,[Rn] ;零偏移op{cond}{B}Rd,[Rn,Flexoffset]{!};前索引偏移op{cond}{B}Rd,label ;程序相對偏移op{cond}{B}{T}Rd,[Rn],Flexoffset ;后索引偏移

.*符號說明:op:操作碼,LDR或STR。

cond:可選的條件碼。

B:可選后綴。若有B,則傳送Rd的最低有效字節(jié)。若op是LDR,則將Rd的其他字節(jié)清零。

T:可選后綴。若有T,則即使處理器處于特權(quán)模式下,對存儲系統(tǒng)的訪問也將處理器看作是在用戶模式下。T在用戶模式下無效,不能與前索引偏移一起使用。

Rd:用于加載或存儲的ARM寄存器。

.

Rn:基址寄存器。若指令是帶有寫回的前索引或后索引,或使用后綴T,則不允許Rn與Rd相同。

Flexoffset:加到Rn上的偏移量。

label:程序相對偏移表達(dá)式。其值必須在當(dāng)前指令的±4KB范圍內(nèi)。

?。嚎蛇x后綴。若有“!”,則將包含偏移量的地址寫回到Rn。若Rn是R15,則不能使用“!”。

.*指令說明:指令用于加載或存儲寄存器32位字或8位無符號字節(jié)。字節(jié)加載用“0”擴(kuò)展到32位。對于零偏移形式,Rn的值作為傳送數(shù)據(jù)的地址。對于前索引偏移形式,在傳送數(shù)據(jù)之前,將偏移量加到Rn中,結(jié)果作為傳送數(shù)據(jù)的存儲器地址。若使用“!”,則結(jié)果寫回到Rn,且Rn不允許是R15。對于程序相對偏移形式,匯編器由PC計算偏移量,并將PC作為Rn生成前索引指令。不能使用后綴“!”。

.對于后索引形式,Rn的值作為傳送數(shù)據(jù)的存儲器地址。數(shù)據(jù)傳送之后,將偏移量加到Rn中,結(jié)果寫回到Rn。Rn不允許是R15。大多數(shù)情況下,必須保證用于32位傳送的地址按照字對準(zhǔn)。關(guān)于非字對準(zhǔn)的情況比較復(fù)雜,可參考ARM編程模型中非字對準(zhǔn)的敘述或相關(guān)手冊。加載到R15會引起處理器轉(zhuǎn)移到所加載地址處的指令。對于加載值的位[1:0],不同的ARM體系結(jié)構(gòu),有不同規(guī)定。當(dāng)加載R15時,不允許使用后綴“B”或“T”。

.應(yīng)盡量避免從R15存儲。例:LDR R8,[R10] ;R8←[R10]LDRNE R2,[R5,#960]! ;R2←[R5+960],R5←R5+960,條件執(zhí)行STR R2,[R9,#CON] ;R2→[R9+CON],CON為常量表達(dá)式,且值不超過4KBSTRB R0, [R3,-R8,ASR#2] ;R0→[R3-R8/4],存儲R0最低有效字節(jié),R3和R8不變

.(2)半字和帶符號字節(jié)。*句法:op{cond}typeRd,[Rn] ;零偏移op{cond}typeRd,[Rn,offset]{!} ;前索引偏移op{cond}typeRd,label ;程序相對偏移op{cond}typeRd,[Rn],offset ;后索引偏移.

*符號說明:

type:包括SH(帶符號半字,僅LDR)、H(無符號半字)和SB(帶符號字節(jié),僅LDR)。*指令說明:指令用于加載寄存器16位半字或帶符號8位字節(jié),存儲寄存器16位半字。帶符號加載是指帶符號擴(kuò)展到32位。無符號半字加載是指零擴(kuò)展到32位。

半字傳送的地址必須是偶數(shù),即按照半字對準(zhǔn)。關(guān)于非對準(zhǔn)的情況比較復(fù)雜,可參考ARM編程模型中非對準(zhǔn)的敘述或相關(guān)手冊。

.不能將半字或字節(jié)加載到R15。例:LDREQSH R11,[R6] ;R11←[R6],條件執(zhí)行,加載半字,帶符號擴(kuò)展到32位LDRH R1,[R0,#12] ;R1←[R0+12],加載半字,零擴(kuò)展到32位STRH R4,[R0,R1]! ;R4→[R0+R1],存儲R4最低有效半字到R0+R1地址開始的兩個字節(jié), ;地址寫回到R0LDRSB R1,[R6],R3,LSL#4 ;錯誤,這種格式只對字和無符號字節(jié)傳送有效

.(3)雙字。*句法:op{cond}DRd,[Rn] ;零偏移op{cond}DRd,[Rn,offset]{!} ;前索引偏移op{cond}DRd,label ;程序相對偏移op{cond}DRd,[Rn],offset ;后索引偏移

.*指令說明:指令用于加載或存儲兩個相鄰寄存器64位雙字。對于雙字傳送,地址必須是8的倍數(shù)。例:LDRD R6,[R11] ;R6←[R11],R7←[R11]+4LDRD R1,[R6] ;錯誤,Rd必須是偶數(shù)STRD R4,[R9,#24] ;R4→[R9+24],R5→[R9+24]+4STRD R14,[R9,#24] ;錯誤,Rd不允許是R14STRD R2,[R3],R6 ;錯誤,Rn不允許是Rd或R(d+1).2)LDM、STM*句法:op{cond}modeRn{!},reglist{^}*符號說明:mode:包括IA——每次傳送后地址加1IB——每次傳送前地址加1DA——每次傳送后地址減1DB——每次傳送前地址減1FD——滿遞減堆棧ED——空遞減堆棧FA——滿遞增堆棧EA——空遞增堆棧

.

Reglist:加載或存儲的寄存器列表,包含在括號中,也可以包含寄存器的范圍,必須用逗號隔開。

^:可選后綴。

不允許在用戶模式或系統(tǒng)模式下使用。

用途包括以下兩點:

若op是LDM,且reglist中包含R15,則進(jìn)行多寄存器傳送時,也將SPSR拷貝到CPSR;用于從異常返回,僅在異常模式下使用。數(shù)據(jù)傳送的是用戶模式的寄存器,而不是當(dāng)前模式的寄存器。

.*指令說明:指令用于加載或存儲多個寄存器,可傳送R0~R15的任何組合。指令忽略地址的位[1:0]。到R15的加載將引起處理器轉(zhuǎn)移到加載地址處的指令。如果Rn包含在寄存器列表中,且用“!”表明要寫回,那么若op是STM,且Rn是寄存器列表中數(shù)字最小的寄存器,則Rn的初值被保存;否則,Rn的加載和存儲值不可預(yù)知。

.例:LDMIA R8,{R0,R2,R9}STMDB R1!,{R3-R6,R11,R12}STMFD R13!,{R0,R4-R7,LR};寄存器進(jìn)棧LDMFD R13!,{R0,R4-R7,PC};寄存器出棧,從子程序返回STMIA R5!,{R5,R4,R9} ;錯誤,R5的值不可預(yù)知LDMDA R2,{} ;錯誤,列表中至少要有一個寄存器

.

5.ARM數(shù)據(jù)處理指令

ARM數(shù)據(jù)處理指令的特點包括:

(1)操作數(shù)為32位,來自寄存器或定義的立即數(shù)。對于操作數(shù)可進(jìn)行符號擴(kuò)展和零擴(kuò)展。

(2)處理結(jié)果除了長乘法指令為64位之外,其余均為32位,存放在寄存器中。

(3)大多數(shù)ARM通用數(shù)據(jù)處理指令都有一個靈活的第二操作數(shù)(flexiblesecondoperand)。

.第二操作數(shù)operand2可以是立即數(shù)形式或寄存器形式。立即數(shù)形式——#32位立即數(shù)??梢允侨≈禐閿?shù)字常量的表達(dá)式。有效的立即數(shù)必須可由8位立即數(shù)循環(huán)右移偶數(shù)位得到。寄存器形式——Rm,{#shift}??蓪m進(jìn)行移位或循環(huán)移位。shift用來指定移位類型和移位位數(shù)。移位位數(shù)可以是5位立即數(shù)或寄存器。

.移位操作包括:

ASR:算術(shù)右移,即將寄存器內(nèi)容除以2n,寄存器內(nèi)容看作帶符號的補(bǔ)碼整數(shù)。

LSR:邏輯右移,即將寄存器內(nèi)容除以2n,寄存器內(nèi)容看作無符號整數(shù)。

LSL:邏輯左移,即將寄存器內(nèi)容乘以2n,寄存器內(nèi)容看作無符號整數(shù)。

ROR:循環(huán)右移。

RRX:帶擴(kuò)展的循環(huán)右移。將寄存器內(nèi)容循環(huán)右移1位,進(jìn)位標(biāo)志拷貝到位[31]。..ARM數(shù)據(jù)處理指令可以完成的功能包括:數(shù)據(jù)傳送、算術(shù)運算、邏輯運算、比較、測試、乘法等。

1)算術(shù)運算指令——ADD、SUB、RSB、ADC、SBC、RSC

*句法:

op{cond}{S}Rd,Rn,Operand2

*符號說明:

S:可選后綴。若指定S,則根據(jù)操作結(jié)果更新條件碼標(biāo)志(N、Z、C、V)。

Rd:ARM結(jié)果寄存器。

Rn:ARM第一操作數(shù)寄存器。

Operand2:靈活的第二操作數(shù)。.

*指令說明:指令用于加、減、反減等算術(shù)運算,包括帶進(jìn)位的算術(shù)運算。ADD指令用于將Rn和Operand2的值相加。SUB指令用于從Rn的值中減去Operand2的值。RSB指令用于從Operand2的值中減去Rn的值。反減的優(yōu)點在于Operand2的可選范圍寬,因此擴(kuò)展了減數(shù)的使用范圍。ADC、SBC和RSC指令分別是ADD、SUB和RSB指令帶進(jìn)位的減法運算??捎糜诙鄠€字的運算。算術(shù)運算中如果使用R15作為Rn,則其值為指令的地址加8。如果使用R15作為Rd,則執(zhí)行轉(zhuǎn)移到結(jié)果相應(yīng)的地址;或者在使用“S”的情況下,拷貝SPSR到CPSR,利用這點可從異常返回。.

在有寄存器控制移位的任何數(shù)據(jù)處理指令中,不能將R15作為Rd或任何操作數(shù)來使用。例:ADD R2,R1,R3SUBS R8,R6,#240 ;根據(jù)結(jié)果設(shè)置標(biāo)志RSB R4,R4,#1280 ;R4←1280-R4ADCHI R11,R0,R3 ;只有標(biāo)志C置位且標(biāo)志Z清零時才執(zhí)行RSCLESR0,R5,R0,LSLR4;條件執(zhí)行,設(shè)置標(biāo)志,第二操作數(shù)邏輯左移RSCLESR0,R15,R0,LSLR4 ;錯誤,R15不允許與被控制移位的寄存器同時使用.下面兩條指令將R2和R3中的64位整數(shù)與R0和R1中的64位整數(shù)相加,結(jié)果放在R4和R5中:ADDS R4,R0,R2 ;加低有效字

ADC R5,R1,R3 ;加高有效字下面的指令進(jìn)行96位減法:

SUBS R3,R6,R9

SBCS R4,R7,R10SBC R5,R8,R11.

2)邏輯運算指令——AND、ORR、EOR、BIC*句法:

op{cond}{S}Rd,Rn,Operand2*指令說明:

指令用于與、或、異或、位清零等邏輯運算。其中,AND、ORR、和EOR指令分別完成邏輯與、邏輯或、邏輯異或的運算,操作數(shù)是Rn和Operand2的值;BIC指令用于將Rn中的位與Operand2值中的相應(yīng)位的反碼進(jìn)行“與”操作。若指定S,則指令將根據(jù)結(jié)果更新標(biāo)志N和Z;計算Operand2時更新標(biāo)志C;不影響標(biāo)志V。關(guān)于R15的使用與算術(shù)運算指令相同。.例:

AND R9,R2,#0xFF00

ORREQ R2,R0,R5 ;條件執(zhí)行

EORS R0,R0,R3,RORR6 ;設(shè)置標(biāo)志,第二操作數(shù)循環(huán)右移

BICNES R8,R10,R0,RRX;第二操作數(shù)帶擴(kuò)展循環(huán)右移

EORS R0,R15,R3,RORR6 ;錯誤,R15不允許與被控制移位的寄存器同時使用.

3)數(shù)據(jù)傳送指令——MOV、MVN

*句法:

op{cond}{S}Rd,Operand2*指令說明:

指令用于數(shù)據(jù)傳送。其中,MOV指令將Operand2的值拷貝到Rd;MVN指令對Operand2的值按位取非后,將結(jié)果拷貝到Rd。關(guān)于條件碼標(biāo)志的影響與邏輯運算指令相同。關(guān)于R15的使用與算術(shù)運算指令相同。.例:MOV R5,R2MVNNE R11,#0x0F000000

;條件執(zhí)行MOVS R0,R0,ASRR3

;設(shè)置標(biāo)志,第二操作數(shù) 算術(shù)右移.4)比較指令——CMP、CMN*句法:

op{cond}{S}Rd,Operand2

*指令說明:

指令用于比較操作,根據(jù)結(jié)果更新條件碼標(biāo)志,結(jié)果并不放入寄存器。其中,CMP指令從Rn的值中減去Operand2的值,結(jié)果丟棄;CMN指令將Operand2的值加到Rn的值中,結(jié)果丟棄。如果將R15用作Rn,則使用的值是指令的地址加8。在控制寄存器移位的操作中,不能使用R15。.例:CMP R2,R9CMN R0,#6400CMPGT R13,R7,LSL#2

;條件執(zhí)行,第二操作數(shù)邏輯左移CMP R2,R15,ASRR0

;錯誤,R15不允許與控制移位的寄存器同時使用.

5)測試指令——TST、TEQ

*句法:

op{cond}{S}Rd,Operand2

*指令說明:

指令用于測試操作,根據(jù)結(jié)果更新條件碼標(biāo)志,結(jié)果不放入寄存器。其中,TST指令對Rn的值與Operand2的值進(jìn)行按位“與”操作,結(jié)果丟棄;TEQ指令對Rn的值與Operand2的值進(jìn)行按位“異或”操作,結(jié)果丟棄。關(guān)于條件碼標(biāo)志的影響與算術(shù)運算指令相同。.關(guān)于R15的使用與比較指令相同。例:TST R0,#0x3F8TEQEQ R10,R9 ;條件執(zhí)行TSTNE R1,R5,ASRR1

;條件執(zhí)行,第二操作數(shù)算術(shù)右移TEQ R15,R1,RORR0

;錯誤,R15不允許與控制移位的寄存器同時使用.6)乘法指令——MUL、MLA*句法:MUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,Rn*符號說明:Rd:結(jié)果寄存器。Rm、Rs、Rn:操作數(shù)寄存器。

.

*指令說明:

指令用于進(jìn)行乘法和乘加32位×32位運算,結(jié)果為低32位。其中,MUL指令將Rm和Rs中的值相乘,并將最低有效的32位結(jié)果放入Rd中;MLA指令將Rm和Rs中的值相乘,再加上Rn的值,并將最低有效的32位結(jié)果放入Rd中。如果指定S,則指令根據(jù)結(jié)果更新標(biāo)志N和Z;不影響標(biāo)志V;在ARMv4之前版本中標(biāo)志C不可靠;在ARMv5以后版本中不影響標(biāo)志C。R15不能用作Rd、Rm、Rs或Rn。Rd不能與Rm相同。.例:MUL R10,R2,R5MLA R10,R2,R1,R5MULS R0,R2,R2

;影響標(biāo)志MULLT R2,R3,R2

;條件執(zhí)行MLAVCS R8,R6,R3,R8 ;條件執(zhí)行,影響標(biāo)志MUL R15,R0,R3

;錯誤,不允許使用R15MLA R1,R1,R6

;錯誤,Rd不能與Rm相同

.7)CLZ

*句法:CLZ{cond}Rd,Rm

*指令說明:

指令用于對Rm中值的前導(dǎo)零的個數(shù)進(jìn)行計數(shù),結(jié)果放入Rd中。若Rm內(nèi)容為0,則結(jié)果為32;若Rm位[31]為1,則結(jié)果為0。指令不影響條件碼標(biāo)志。Rd不允許是R15。.

6.ARM分支指令1)B、BL

*句法:B {cond} labelBL{cond}label*指令說明:

指令用于分支和帶鏈接分支的操作。其中,B指令引起處理器轉(zhuǎn)移到label;BL指令將下一條指令的地址拷貝到R14(LR,鏈接寄存器),并引起處理器轉(zhuǎn)移到label。.

2)BX

*句法:BX {cond} Rm

*符號說明:

Rm:含轉(zhuǎn)移地址的寄存器。Rm的位[0]不用來作為地址的一部分。若Rm的位[0]為1,則指令將CPSR中的標(biāo)志T置位,且將目標(biāo)地址的代碼解釋為Thumb代碼。若Rm的位[0]為0,則位[1]就不能為1。.*指令說明:指令用于實現(xiàn)分支,并可選地交換指令集。BX指令將引起處理器轉(zhuǎn)移到Rm中的地址。若Rm的位[0]為1,則指令集變換到Thumb指令集。

例:

BX R6.

3)BLX

*句法:

BLX{cond}Rm*指令說明:

指令用于實現(xiàn)帶鏈接分支,并可選地交換指令集。指令有兩種形式:帶鏈接無條件轉(zhuǎn)移到程序相對偏移地址;帶鏈接有條件轉(zhuǎn)移到寄存器中的絕對地址。

BLX指令具體用途有:將下一條指令的地址拷貝到R14(LR,鏈接寄存器)中;轉(zhuǎn)移到label或Rm中的地址;切換到Thumb指令集,條件是Rm的位[0]為1或者使用“BLXlabel”的形式。.

7.ARM協(xié)處理器指令

1)協(xié)處理器的數(shù)據(jù)操作指令——CDP

2)協(xié)處理器的數(shù)據(jù)傳送指令——LDC3)協(xié)處理器的寄存器傳送指令——MCR、MRC.

8.ARM雜項指令

1)軟件中斷指令——SWI

*句法:

SWI {cond}immed_24

*符號說明:

immed_24: 表達(dá)式,其值為0~224-1范圍內(nèi)的整數(shù)。*指令說明:

SWI指令引起處理器SWI異常,即處理器變?yōu)楣芾砟J剑珻PSR內(nèi)容保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量。這條指令不影響條件碼標(biāo)志。.

2)斷點指令——BKPT

*句法:BKPTimmed_16*符號說明:

immed_16:表達(dá)式,其值為0~216范圍內(nèi)的整數(shù)。*指令說明:

BKPT指令使處理器進(jìn)入調(diào)試模式,調(diào)試工具可利用這條指令到達(dá)特定的地址時查詢系統(tǒng)狀態(tài)。.3)PSR操作指令——MRS、MSR*句法:MRS {cond}Rd,psrMSR {cond}psr_fields,#immed_8rMSR {cond}psr_fields,Rm*符號說明:psr:CPSR或SPSR。fields:指定傳送的區(qū)域,包括:

c 控制域屏蔽字節(jié)(PSR[7:0]) x 擴(kuò)展域屏蔽字節(jié)(PSR[15:8]) s 狀態(tài)域屏蔽字節(jié)(PSR[23:16]) f 標(biāo)志域屏蔽字節(jié)(PSR[31:24])

.immed_8r:表達(dá)式,其值為對應(yīng)8位位圖的數(shù)字常量,該位圖在32位字中循環(huán)移位,每次移動偶數(shù)位。*指令說明:

PSR操作指令MRS和MSR配合使用,可用來更新PSR的讀-修改-寫序列的一部分,如改變處理器模式或清除標(biāo)志Q。其中MRS指令將PSR的內(nèi)容傳送到通用寄存器;MSR指令用立即數(shù)或通用寄存器的內(nèi)容加載PSR的指定區(qū)域。.9.ARM偽指令

顧名思義,偽指令并不是真正的指令。偽指令在編譯器對程序進(jìn)行匯編處理時被替換成相應(yīng)的指令序列。使用偽指令的目的在于簡化程序編寫。

ARM偽指令包括ADR、ADRL、LDR和NOP。

1)ADR、ADRL、LDR*句法:

ADR{cond}register,exprADRL{cond}register,exprLDR{cond}register,=[expr|label-expr].

*符號說明:

register:加載的寄存器。expr:PC或寄存器相對偏移表達(dá)式。對于LDR指令,被賦值成數(shù)字常量。label-expr:程序相對偏移或外部表達(dá)式。.2)空操作——NOP*句法:NOP*指令說明:NOP偽指令在匯編時被替換成ARM的空操作,如“MOVR0,R0”等。NOP偽指令不能有條件執(zhí)行。NOP偽指令不影響CPSR中的條件標(biāo)志位。

.2.4.4Thumb指令集

1.Thumb指令集概述

Thumb指令集是ARM指令集壓縮形式的子集。由于Thumb指令是16位的,因此使用Thumb指令可以提高代碼密度。所有的Thumb指令都有相對應(yīng)的ARM指令,Thumb編程模型也對應(yīng)ARM編程模型。在ARM指令流水線中實現(xiàn)Thumb指令必須先進(jìn)行動態(tài)解壓縮,然后再作為標(biāo)準(zhǔn)ARM指令執(zhí)行。.1)Thumb指令集編碼Thumb指令集編碼如圖所示。.

2)Thumb編程模型Thumb指令集只能對限定的ARM寄存器進(jìn)行操作。Thumb編程模型如圖所示。

說明:

R13~R15被擴(kuò)展作為特殊應(yīng)用,R13用作堆棧指針SP,R14用作鏈接寄存器LR,R15用作程序計數(shù)器PC。陰影寄存器R8~R12訪問受限。

CPSR的條件標(biāo)志位由算術(shù)和邏輯操作設(shè)置并控制轉(zhuǎn)移。

..

3)Thumb狀態(tài)切換CPSR的T位決定ARM處理器執(zhí)行的是ARM指令流還是Thumb指令流。若T置1,則認(rèn)為是Thumb指令流;若T置0,則認(rèn)為是ARM指令流。

(1)進(jìn)入Thumb狀態(tài)。系統(tǒng)復(fù)位后,處理器處于ARM狀態(tài)。執(zhí)行BX指令,將轉(zhuǎn)移地址寄存器的位[0]置1,其他位放入PC,即可進(jìn)入Thumb狀態(tài)。

(2)退出Thumb狀態(tài)。退出Thumb狀態(tài)的方法與進(jìn)入Thumb狀態(tài)的方法相對應(yīng),使用BX指令,將轉(zhuǎn)移地址寄存器的位[1:0]置為b00,即可退出Thumb狀態(tài)。如果發(fā)生異常,無論處理器當(dāng)前的工作狀態(tài)如何,異常都會使處理器返回到ARM狀態(tài)。.

4)Thumb指令集與ARM指令集的區(qū)別

(1)Thumb指令除了分支B指令外大多是無條件執(zhí)行的。

(2)大多數(shù)Thumb指令采用2地址格式,即目的寄存器和源寄存器。(3)Thumb指令集沒有協(xié)處理器指令、信號量(semaphore)指令和訪問PSR的指令。(4)Thumb分支指令與ARM分支指令相比,在尋址范圍上有更多限制。(5)Thumb數(shù)據(jù)處理指令訪問R8~R15受限。除MOV和ADD指令訪問R8~R15外,數(shù)據(jù)處理指令總是更新CPSR的ALU狀態(tài)標(biāo)志。訪問R8~R15的Thumb數(shù)據(jù)處理指令不能更新標(biāo)志。.

(6)Thumb的寄存器Load/Store指令只能訪問R0~R7。PUSH和POP指令使用堆棧指針R13(SP)作為基址實現(xiàn)滿遞減堆棧。除傳送R0~R7外,PUSH還可用于存儲鏈接寄存器R14(LR),POP還可用于加載程序計數(shù)器指針PC。(7)Thumb偽指令不支持ADRL。.2.Thumb存儲器訪問指令

1)LDR、STR——立即數(shù)偏移

*句法:

op Rd,[Rn,#immed_5×4]opH Rd,[Rn,#immed_5×2]opB Rd,[Rn,#immed_5×1]

*符號說明:

H:指明無符號半字傳送的參數(shù)。B:指明無符號字節(jié)傳送的參數(shù)。Rd:加載和存儲寄存器。Rd只能在R0~R7范圍內(nèi)。immed_5×N:偏移量表達(dá)式。其取值是N的倍數(shù),在0~31N范圍內(nèi)。.

*指令說明:指令用于加載和存儲寄存器,寄存器的地址用一個寄存器的立即數(shù)偏移(immediateoffset)指明。字傳送的地址必須可被4整除,半字的傳送必須可被2整除。例:LDR R3,[R5,#0]STRB R0,[R3,#31] ;字節(jié)傳送STRH R7,[R3,#16] ;半字傳送LDR R13,[R3,#40] ;錯誤,只能使用R0~R7STRB R0,[R3,#32] ;錯誤,32超出了字節(jié)傳送的范圍STRH R7,[R3,#15] ;錯誤,半字傳送的偏移量必須是偶數(shù)LDRH R6,[R0,#-6] ;錯誤,不支持負(fù)偏移量.2)LDR、STR——寄存器偏移*句法:op Rd,[Rn,Rm]*符號說明:op:op可以是LDR 加載寄存器,4字節(jié)字;STR 存儲寄存器,4字節(jié)字;LDRH 加載寄存器,2字節(jié)無符號半字;LDRSH 加載寄存器,2字節(jié)帶符號半字;STRH 存儲寄存器,2字節(jié)半字;LDRB 加載寄存器,無符號字節(jié);LDRSB 加載寄存器,帶符號半字;STRB 存儲寄存器,字節(jié)。

.*指令說明:

指令用于加載和存儲寄存器,存儲器的地址用基址尋址方式指明,即Rn中的基址加上偏移量形成存儲器的地址。數(shù)據(jù)傳送可以是字、半字或字節(jié)。加載的數(shù)據(jù)被放到Rd的最低有效位。對于無符號加載,Rd的其余位補(bǔ)0;對于帶符號加載,Rd的其余位拷貝符號位。注意,存儲指令帶符號和無符號沒有區(qū)別。字傳送的地址必須可被4整除,半字傳送的地址必須可被2整除。.例:LDR R2,[R1,R5]LDRSH R0,[R0,R6] ;加載帶符號半字STRB R1,[R7,R0] ;存儲字節(jié)LDR R13,[R5,R3] ;錯誤,只能使用R0~R7STRSH R7,[R3,R1] ;錯誤,沒有帶符號的存儲指令.3)LDR、STR——PC或SP相對偏移*句法:LDR Rd,[PC,#immed_8×4]LDR Rd,labelLDR Rd,[SP,#immed_8×4]LDR Rd,[SP,#immed_8×4].*符號說明:immed_8×4:偏移量表達(dá)式。取值為4的整數(shù)倍,范圍在0~1020內(nèi)。label:程序相對偏移表達(dá)式。必須在當(dāng)前指令之后1KB范圍內(nèi)。

*指令說明:

指令用于加載和存儲寄存器,存儲器的地址用PC或SP的立即數(shù)偏移指明,即PC或SP的基址加上偏移量形成存儲器地址。其中,PC的位[1]被忽略,確保了地址字對準(zhǔn)。注意,沒有PC相對偏移的STR指令;地址必須是4的整數(shù)倍。.例:LDR R2,[PC,#1016]LDR R5,localdataLDR R0,[SP,#920]STR R1,[SP,#20]LDR R13,[PC,#8] ;錯誤,Rd只能使用R0~R7STR R7,[PC,#64] ;錯誤,STR指令沒有PC相對偏移STRH R0,[SP,#16] ;錯誤,半字或字節(jié)傳送沒有PC或SP相對偏移LDR R2,[PC,#81] ;錯誤,立即數(shù)必須是4的整數(shù)倍LDR R1,[PC,#-24] ;錯誤,立即數(shù)不能是負(fù)數(shù)STR R1,[SP,#1024] ;錯誤,立即數(shù)最大為1020.

4)PUSH、POP

*句法:

PUSH {reglist}POP {reglist}PUSH {reglist,LR}POP {reglist,PC}

*符號說明:

reglist:寄存器列表。只能使用R0~R7。列表中至少必須有1個寄存器。.

*指令說明:

指令用于寄存器和可選的LP進(jìn)棧以及寄存器和可選的PC出棧。Thumb堆棧是滿遞減堆棧,即堆棧向下增長,SP指向堆棧的最后入口。寄存器以數(shù)字順序存儲在堆棧中,最低數(shù)字的寄存器其地址最低。對于ARMv5以上版本,若加載PC位[1:0]的值是b00,則處理器轉(zhuǎn)換到ARM狀態(tài),其中PC位[1]不允許是1。對于ARMv4T以前版本,PC位[1:0]被忽略,因此POP指令不能改變處理器工作狀態(tài)。這些指令不影響條件碼標(biāo)志。.例:PUSH {R1,R4-R7}PUSH {R0,LR}POP {R0-R7,PC} ;出棧并從子程序返回PUSH {R3,R5-R8} ;錯誤,不允許使用高寄存器PUSH {} ;錯誤,列表中至少必須有1個寄存器PUSH {R1-R4,PC} ;錯誤,PC不能入棧POP {R1-R4,LR} ;錯誤,不能彈出LR.

5)LDMIA、STMIA

*句法:

opRn!,{reglist}

*指令說明:

指令用于加載和存儲多個寄存器。寄存器以數(shù)字順序加載或存儲,最低數(shù)字的寄存器存儲在Rn的初始化地址中。Rn的值以reglist中寄存器個數(shù)的4倍增加。

.例:LDMIA R5!,{R0-R7}STMIA R3!,{R3,R5,R7}LDMIA R3!,{R0,R9} ;錯誤,不允許使用高寄存器STMIA R5!,{} ;錯誤,列表中至少必須有1個寄存器STMIA R5!,{R1-R6} ;錯誤,從R5存儲的值不可預(yù)知.3.Thumb數(shù)據(jù)處理指令1)算術(shù)運算指令——ADD、SUB、ADC、SBC、MUL*句法:op Rd,Rn,Rm ;對低寄存器操作,Rd←Rn+Rm或Rd←Rn-Rmop Rd,Rn,#expr3 ;對低寄存器操作,Rd←Rn+expr3或Rd←Rn-expr3op Rd,#expr8 ;對低寄存器操作,Rd←Rd+expr8或Rd←Rd-expr8op SP,#expr ;SP←SP+expr或SP←SP-expropp Rd,Rm ;對低寄存器操作,ADC帶進(jìn)位加、SBC帶進(jìn)位減、MUL乘法ADD Rd,Rp,#expr ;Rd必須為低寄存器,Rd←Rp+exprADD Rd,Rm ;對高/低寄存器操作,Rd←Rd+Rm.*符號說明:expr3:取值為在-7~+7范圍內(nèi)的整數(shù)。expr8:取值為在-255~+255范圍內(nèi)的整數(shù)。Rp:SP或PC。op:ADD或SUB。opp:ADC、SBC或MUL。

*指令說明:

指令用于算術(shù)運算,具體含義可參見每句注釋。需要說明的是,如果使用的是低寄存器,則會影響到條件碼標(biāo)志。

.例:ADDR3,R1,R5SUB R0,R4,#5ADDR7,#201ADDSP,#312SUB SP,#96ADCR2,R4ADDR6,SP,#64ADDR2,PC,#980ADDR2,R4ADDR12,R4ADDR9,R2,R6 ;錯誤,不允許使用高寄存器SUBR4,R5,#201 ;錯誤,立即數(shù)超出范圍

.

2)邏輯運算指令——AND、ORR、EOR、BIC

*句法:

op Rd,Rm

*指令說明:

指令用于邏輯運算。其中,AND指令進(jìn)行邏輯“與”運算,ORR指令進(jìn)行邏輯“或”運算,EOR指令進(jìn)行邏輯“異或”運算,BIC指令進(jìn)行“RdANDNOTRm”運算。Rd和Rm必須使用低寄存器。這些指令根據(jù)結(jié)果更新標(biāo)志N和Z。

例:

AND R2,R4.

3)移位指令——ASR、LSL、LSR、ROR

*句法:op Rd,Rs ;寄存器控制移位op Rd,Rm,#expr ;立即數(shù)移位

*符號說明:

Rs:包含移位量的寄存器。expr:立即數(shù)偏移量表達(dá)式。取值范圍是:若執(zhí)行LSL,則為0~31的整數(shù);其余為1~32的整數(shù)。

.*指令說明:

指令用于移位操作。其中,ASR指令進(jìn)行算術(shù)右移,LSL指令進(jìn)行邏輯左移,LSR指令進(jìn)行邏輯右移,ROR指令進(jìn)行循環(huán)右移。Rd、Rs、Rm必須使用低寄存器。ROR指令僅能與寄存器控制的移位一起使用。這些指令根據(jù)結(jié)果更新標(biāo)志N和Z,不影響標(biāo)志V。若移位量為0,則標(biāo)志C不受影響;否則,C將包含源寄存器的最后移出位。

.例:ASR R3,R5LSR R0,R2,#6LSR R0,R4,#0 ;除了不影響標(biāo)志C和V外,等同于“MOVR0,R4”RORR2,R7,#3 ;ROR不能使用立即數(shù)移位LSL R9,R1 ;錯誤,不允許使用高寄存器LSL R0,R7,#32 ;錯誤,立即數(shù)移位超出范圍ASR R0,R7,#0 ;錯誤,立即數(shù)移位超出范圍

.4)比較指令——CMP、CMN*句法:CMPRn,#exprCMPRn,RmCMNRn,Rm*符號說明:expr:取值范圍為在0~255范圍內(nèi)的整數(shù)。

.*指令說明:

指令用于比較操作。其中,CMP指令從Rn的值中減去expr或Rm的值,CMN指令將Rn和Rm的值相加。對于第1、3條指令,Rn和Rm必須使用低寄存器;對于第2條指令,Rn和Rm可以使用R0~R15中的任何寄存器。這些指令更新條件碼標(biāo)志,但不在寄存器保存結(jié)果。

.例:CMPR2,#255CMPR7,R12CMNR1,R0CMPR2,#508 ;錯誤,立即數(shù)超出范圍CMPR9,#24 ;錯誤,立即數(shù)不允許和高寄存器一起出現(xiàn)CMNR1,R10 ;錯誤,CMN不允許與高寄存器一起出現(xiàn)

.5)數(shù)據(jù)傳送指令——MOV、MVN、NEG*句法:Op Rd,RmMOV Rd,#expr*符號說明:expr:取值范圍為在0~255范圍內(nèi)的整數(shù)。

.

*指令說明:

指令用于進(jìn)行數(shù)據(jù)傳送。其中,MOV指令將#expr或Rm的值放入Rd;MVN指令從Rm取值,按位邏輯“非”后,將結(jié)果放入Rd;NEG指令取Rm的值,乘以-1后,將結(jié)果放入Rd。除了“MOVRd,Rm”指令中Rd和Rm可以使用R0~R15中的任何寄存器之外,其余指令Rd和Rm必須使用低寄存器?!癕OVRd,#expr”和MVN指令更新標(biāo)志N和Z,對標(biāo)志C和V無影響。NEG指令更新標(biāo)志N、Z、C和V。

.對于“MOVRd,Rm”指令,如果Rd或Rm使用高寄存器,則標(biāo)志不受影響;如果Rd和Rm都使用低寄存器,則更新標(biāo)志N和Z,清除標(biāo)志C和V。如果希望在低寄存器之間傳送數(shù)據(jù)而不清除標(biāo)志C和V,可使用移位為0的LSL指令。例:

MOVR3,#0MOVR0,R12 ;不更新標(biāo)志MVNR7,R1NEGR2,R2MOVR2,#256 ;錯誤,立即數(shù)超出范圍MOVR8,#3 ;錯誤,不能傳送立即數(shù)到高寄存器MVNR8,R2 ;錯誤,MVN和NEG指令不允許使用高寄存器NEGR0,#3 ;錯誤,MVN和NEG指令不允許使用立即數(shù)

.

6)測試指令——TST

*句法:

TST Rn,Rm

*指令說明:

指令用于測試位操作。TST指令將Rn和Rm中的值按位“與”操作,更新條件碼標(biāo)志N和Z,不影響C和V,結(jié)果不放入寄存器。Rn和Rm必須使用低寄存器。例:

TST R2,R4.

4.Thumb分支指令

1)B*句法:

B{cond} label

*符號說明:label:程序相對轉(zhuǎn)移表達(dá)式,通常是在同一代碼塊內(nèi)的標(biāo)號。如果有條件,則label必須在當(dāng)前指令的-252~+256B范圍內(nèi);如果無條件,則label必須在±2KB范圍內(nèi)。.*指令說明:

這是Thumb指令集中唯一的有條件指令。如果條件滿足(或不使用條件),則B指令使處理器轉(zhuǎn)移到label。B指令使用的條件與ARM指令集中的條件基本相同。例:B dloopBEG sectB.

2)BL

*句法:

BL label

*指令說明:

BL指令是帶鏈接的長分支指令,它將下一條指令的地址拷貝到鏈接寄存器R14(LR),并使處理器轉(zhuǎn)移到label。機(jī)器級指令不能轉(zhuǎn)移到當(dāng)前指令±4KB范圍以外的地址。必要時,可使用ARM鏈接器插入代碼以允許更長的轉(zhuǎn)移。

例:BL extract

.

3)BX

*句法:

BX Rm

*指令說明:

BX指令除了完成分支外,還可以可選地交換指令集。其中,Rm的位[0]不用于地址部分,若Rm的位[0]清零,則位[1]也必須清零,指令將清除CPSR中的標(biāo)志T,目的地址的代碼被解釋為ARM代碼。例:

BX R5.

4)BLX

*句法:

BLX RmBLX label

*指令說明:

BLX指令是帶鏈接的分支指令,且可以可選地交換指令集。關(guān)于轉(zhuǎn)移范圍的說明同BL指令,關(guān)于Rm的說明同BX指令。.BLX指令可用于:拷貝下一條指令的地址到R14;引起處理器轉(zhuǎn)移到label或Rm存儲的地址;如果Rm的位[0]清零,或使用“BLXlabel”的形式,則指令集切換到ARM狀態(tài)。例:BLX R6BLX armsub.5.Thumb中斷和斷點指令1)SWI*句法:SWIimmed_8*符號說明:immed_8:取值范圍為0~255范圍內(nèi)的整數(shù)。

.

*指令說明:SWI指令引起SWI異常。處理器切換到ARM狀態(tài)、管理模式,CPSR保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量地址。異常處理程序利用immed_8來確定正在請求何種服務(wù)。該指令不影響條件碼標(biāo)志。

例:

SWI12.

2)BKPT

*句法:

BKPT immed_8

*指令說明:

BKPT指令使處理器進(jìn)入調(diào)試模式。調(diào)試工具可利用該指令查詢到達(dá)特定地址的指令時的系統(tǒng)狀態(tài)。調(diào)試器利用immed_8來保存有關(guān)斷點的附加信息。

例:BKPT 67.

6.Thumb偽指令

1)ADR

*句法:ADR register,expr*符號說明:

expr:程序相對偏移量表達(dá)式。偏移量必須是正數(shù),且小于1KB。expr必須局部定義,不能被導(dǎo)入。

*指令說明:

ADR偽指令將程序相對偏移地址加載到寄存器中。在Thumb狀態(tài),ADR僅可以產(chǎn)生字對準(zhǔn)地址。使用ALIGN指令來確保expr是對準(zhǔn)的。expr必須被賦值成與ADR偽指令在同一代碼區(qū)域的地址。

.例:ADR R4,txampl ;=>ADDR4,PC,#nn;codeALIGNtxampl DCW 0,0,0,0.

2)LDR

*句法:

LDR register,=[expr|label-exp]

*符號說明:

expr:賦值成數(shù)字常量。若expr值在MOV

溫馨提示

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

評論

0/150

提交評論