




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 車輛掛靠與汽車俱樂部合作協(xié)議
- 智能制造基地廠房物業(yè)財產(chǎn)移交及智能設(shè)備安裝合同
- 車庫租賃與停車場車位租賃代理合同
- 互聯(lián)網(wǎng)餐飲品牌股權(quán)合作框架協(xié)議
- 北京車牌租賃公司車輛保險代購服務(wù)合同范本
- 食品安全調(diào)度會會議紀(jì)要
- 員工安全管理
- 企業(yè)安全生產(chǎn)目標(biāo)管理不應(yīng)包括
- 安全包保責(zé)任人隱患排查任務(wù)清單
- 施工安全保障措施
- GB/T 18348-2022商品條碼條碼符號印制質(zhì)量的檢驗
- GB/T 17619-1998機(jī)動車電子電器組件的電磁輻射抗擾性限值和測量方法
- GB/T 10560-2017礦用焊接圓環(huán)鏈用鋼
- 2023年山東鐵路投資控股集團(tuán)有限公司校園招聘筆試題庫及答案解析
- 音標(biāo)版中考必考英語1600單詞
- 工程竣工初驗報告表格
- 考勤及簽到表30天
- 靜脈輸液護(hù)理技術(shù)操作規(guī)范PPT
- 機(jī)械制造企業(yè)隱患排查清單(公司級、車間級、崗位級)
- 的溶劑溶解度參數(shù)表
- 夏季高溫施工安全生產(chǎn)培訓(xùn)
評論
0/150
提交評論