《嵌入式系統(tǒng)》課件-第3章-ARM指令系統(tǒng)及程序設計基礎_第1頁
《嵌入式系統(tǒng)》課件-第3章-ARM指令系統(tǒng)及程序設計基礎_第2頁
《嵌入式系統(tǒng)》課件-第3章-ARM指令系統(tǒng)及程序設計基礎_第3頁
《嵌入式系統(tǒng)》課件-第3章-ARM指令系統(tǒng)及程序設計基礎_第4頁
《嵌入式系統(tǒng)》課件-第3章-ARM指令系統(tǒng)及程序設計基礎_第5頁
已閱讀5頁,還剩156頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、楊詞慧 ,2015.4,嵌入式系統(tǒng),ARM指令系統(tǒng)及程序設計基礎,第3章 ARM指令系統(tǒng)及程序設計基礎,3.1 ARM尋址方式 3.2 ARM指令集 3.3 Thumb指令集 3.4 ARM程序設計基礎,尋址方式 處理器根據(jù)指令中給出的地址信息尋找物理地址的方式。 尋找操作數(shù)或操作數(shù)地址的方式。,3.1 ARM尋址方式,尋址方式(續(xù)),3.1 ARM尋址方式,ARM尋址方式,立即尋址 寄存器尋址 寄存器間接尋址 基址變址尋址 多寄存器尋址 寄存器移位尋址 相對尋址 堆棧尋址,立即尋址 也叫立即數(shù)尋址,操作數(shù)本身在指令中給出,該操作數(shù)被稱為立即數(shù)。 例如:ADDR0, R0, #1; R0 R0

2、+1 立即數(shù)須以“#”為前綴,對于十六進制表示的立即數(shù),還需在“#”后加上“0 x”或“ R0 R1+R2 寄存器間接尋址 以寄存器的值作為操作數(shù)地址。例如:ADDR0, R1, R2; R0 R1+R2,3.1 ARM尋址方式,基址變址尋址 將寄存器的內(nèi)容與指令中給出的地址偏移量相加,得到操作數(shù)的地址。 包括 基址加偏移量尋址方式 基址加索引尋址方式,3.1 ARM尋址方式,基址變址尋址(續(xù)) 基址加偏移量尋址方式 將寄存器內(nèi)容與指令中給出的地址偏移量相加,得到操作數(shù)的有效地址。如:LDRR0, R1, #4; R0 R1+4 前變址:基址加變址作為操作數(shù)地址。后變址:基址作為操作數(shù)的地址,

3、傳送后自動更新基址寄存器的值。,3.1 ARM尋址方式,基址變址尋址(續(xù)),3.1 ARM尋址方式,STR R0,R1, #12 ; R1+12R0,前變址,基址變址尋址(續(xù)),3.1 ARM尋址方式,STR R0,R1, #12; R1R0, R1R1+12,后變址,基址變址尋址(續(xù)) 基址加索引尋址方式 將基址寄存器的值與索引寄存器的值相加,形成操作數(shù)的有效地址。例如: LDRR0, R1, R2 ; R0 R1+R2,3.1 ARM尋址方式,多寄存器尋址 一次完成多個(最多16)寄存器值的傳送 例如:LDMIA R0, R1, R2, R4; R1 R0; R2 R0+4; R4 R0+

4、8,3.1 ARM尋址方式,多寄存器尋址(續(xù)),3.1 ARM尋址方式,IA,r1,地址 增加,r4,r0,r1,r4,r0,r1,r4,r0,r1,r4,r0,r10,IB,DA,DB,STMxx r10, r0,r1,r4,基址寄存器 (Rn),地址遞減,指針最后位置,地址遞增,指針最后位置,寄存器移位尋址 操作數(shù)為寄存器中數(shù)做相應的移位而得到 例如:ADDR0, R1, R2, LSL #3; R0 R1+8R2,3.1 ARM尋址方式,寄存器移位尋址(續(xù)) ARM中的移位或循環(huán)移位操作 LSL:邏輯左移(Logical Shift Left) LSR:邏輯右移(Logical Shif

5、t Right),3.1 ARM尋址方式,0,0,寄存器移位尋址(續(xù)) ASR:算術(shù)右移(Arithmetic Shift Right)。移位過程中保持符號位不變,若源操作數(shù)為正數(shù),則字的高端空出的位補0。若源操作數(shù)為負數(shù),則字的高端空出的位補1。,3.1 ARM尋址方式,寄存器移位尋址(續(xù)) ROR:循環(huán)右移(Rotate Right)。從字的最低端移出的位依次填入字的高端空出的位。,3.1 ARM尋址方式,寄存器移位尋址(續(xù)) RRX:擴展的循環(huán)右移(Rotate Right Extended )。操作數(shù)向右移一位,左側(cè)空位由狀態(tài)寄存器C位填充。 當移位的類型為RRX時,無需指定移位的位數(shù)

6、,其它的則須指定移位的位數(shù)。,3.1 ARM尋址方式,相對尋址 以PC當前值作為基地址,指令中的地址標號作為位移量,兩者相加后得到操作數(shù)的有效地址。例如:BLNEXT ; 跳轉(zhuǎn)至子程序 NEXTNEXTMOVPC, LR ; 從子程序返回,3.1 ARM尋址方式,堆棧尋址 堆棧:按先進后出(FILO)的方式工作,使用堆棧指針(Stack Pointer, SP) 指示當前操作位置。 根據(jù)棧指針的指向位置可將堆棧分為 滿堆棧:SP指向最后壓入堆棧的數(shù)據(jù)。 空堆棧:SP指向下個將放入數(shù)據(jù)空位置,3.1 ARM尋址方式,堆棧尋址,3.1 ARM尋址方式,來源:王亮的PPT,堆棧尋址(續(xù)) 根據(jù)堆棧的

7、生成方式可將堆棧分為 遞增堆棧(Ascending Stack):堆棧由低地址向高地址生成。 遞減堆棧(Descending Stack) :由高地址向低地址生成。,3.1 ARM尋址方式,堆棧尋址(續(xù)),3.1 ARM尋址方式,來源:王亮的PPT,3.1 ARM尋址方式,堆棧尋址(續(xù)) ARM支持四種類型堆棧工作方式 滿遞增堆棧:SP指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。 滿遞減堆棧:SP指向最后壓入的數(shù)據(jù),且由高地址向低地址生產(chǎn)。,3.1 ARM尋址方式,堆棧尋址(續(xù)),3.1 ARM尋址方式,來源:王亮的PPT,堆棧尋址(續(xù)) 堆棧工作方式 空遞增堆棧:SP指向下個將放入數(shù)據(jù)的空位

8、置,且由低地址向高地址生成。 空遞減堆棧:SP指向下個將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。,3.1 ARM尋址方式,堆棧尋址(續(xù)),3.1 ARM尋址方式,來源:王亮的PPT,ARM指令集分類 加載/存儲指令 數(shù)據(jù)處理指令 分支指令 狀態(tài)寄存器訪問指令 異常/中斷指令 協(xié)處理器指令,3.2 ARM指令集,ARM指令的特點 所有指令都是32bit; 大多數(shù)指令都在單周期內(nèi)完成; 所有指令都可以條件執(zhí)行; load/store體系結(jié)構(gòu); 指令集可以通過協(xié)處理器擴展。,3.2 ARM指令集,ARM指令的格式,3.2 ARM指令集,s , , ,Cond,xxx,Opcode,S,Rn,Rd

9、,Operand2,0,11,12,15,16,19,20,21,24,25,27,28,31,7,8,條件碼,指令操作碼,操作是否影響CPSR,第1操作數(shù),目標寄存器,第2操作數(shù),3.2 ARM指令集,ARM指令集1, Datasheet P39,3.2 ARM指令集,ARM指令集2,ARM指令的條件執(zhí)行 所有ARM指令都可包含一個可選的條件碼,只有當CPSR中條件標志位滿足指定條件時,指令才會被執(zhí)行。否則以NOP指令通過流水線。,3.2 ARM指令集,3.2 ARM指令集,3.2 ARM指令集,加載/存儲指令 Load:將內(nèi)存中數(shù)據(jù)裝載到寄存器Store:將寄存器中的數(shù)據(jù)存入內(nèi)存,3.2

10、ARM指令集,內(nèi)存,寄存器,Load,Store,加載/存儲指令(續(xù)) 單寄存器傳輸指令 B Rd, addressing1 SB | H | SHRd, addressing2 B Rd, LABEL,3.2 ARM指令集,加載/存儲指令(續(xù)) 單寄存器傳輸指令(續(xù)),3.2 ARM指令集,加載/存儲指令(續(xù)) 單寄存器傳輸指令 LDR B|SB|H|SH 目的寄存器, STR B|SB|H|SH 源寄存器, ,3.2 ARM指令集,加載/存儲指令(續(xù)) 單寄存器傳輸指令(續(xù)) LDR/STR:讀/寫一個32bit字到/從一個32位寄存器,要求讀/寫地址字對齊。 LDRB:內(nèi)存8bit字節(jié)3

11、2bit寄存器;不要求地址對齊,寄存器高24位清零。 STRB:寄存器低8位內(nèi)存的某個地址;不要求地址對齊。,3.2 ARM指令集,加載/存儲指令(續(xù)) 單寄存器傳輸指令 LDRH:16bit半字 32bit寄存器;要求地址半字對齊,寄存器的高16bit清零。 STRH:寄存器低16bit內(nèi)存;要求地址半字對齊。,3.2 ARM指令集,加載/存儲指令(續(xù)) 單寄存器傳輸指令 LDRSH:有符號16bit半字32bit寄存器中;要求地址半字對齊,寄存器高16bit根據(jù)符號位擴展。 LDRSB:有符號8bit字節(jié)32bit寄存器中;不要求地址對齊,寄存器高24bit根據(jù)符號位擴展。,3.2 ARM

12、指令集,加載/存儲指令(續(xù)),3.2 ARM指令集,單寄存器傳輸指令助詞符,加載/存儲指令(續(xù)),3.2 ARM指令集,LDR/STR指令的變址模式,3.2 ARM指令集,Rn, # +-,0 0 0 0 0 0 0 0 0 0,Rm,0,3,4,11,方式2:Rm 例子:LDR R0, R1, R2,0,11,#immed_12,方式1:#immed_12(取值范圍0 0 xfff) 例子:LDR R0, R1, #+0 xfff,shift,Rm,0,3,4,11,#immed_5,6,7,方式3:Rm LSL #immed_5(取值范圍0-31) 例子:LDR R0, R1, R2 LS

13、L #41,0,5,0/1 : STR/LDR,0/1 : 無/有(!),0/1 : 后變址/前變址,0/1 : 字/無符號字節(jié),cond,Rn,Rd,第 2 操作數(shù),0,7,8,11,12,15,16,19,20,22,01,27,28,31,23,24,U,B,W,L,21,26,P,I,25,0/1 : 減/加(第2操作數(shù)),0/1 : 立即數(shù)(方式1)/寄存器(方式2,3), Datasheet P193,加載/存儲指令(續(xù)) 多寄存器傳輸指令 Rn!, LDM / STM:從由基址寄存器指示的一片連續(xù)存儲器到寄存器列表所指示的多個寄存器之間傳送數(shù)據(jù)。,3.2 ARM指令集, 對于LD

14、M操作,如恢復的寄存器中含有PC(R15)寄存器,則指令執(zhí)行的同時CPU自動將SPSR拷貝到CPSR中,例:LDMFD R0-R12, LR, PC 數(shù)據(jù)的傳送發(fā)生在User用戶模式下的寄存器,而非當前模式寄存器,例如:LDMDB SP, R0 - LR,3.2 ARM指令集,加載/存儲指令(續(xù)) 多寄存器傳輸指令 例如:STMIA R0!, R1-R5;以R0為地址指針,將R1-R5保存到內(nèi)存,指針向上移動,3.2 ARM指令集,加載/存儲指令(續(xù)),3.2 ARM指令集,IA 每次傳送后地址加1 IB 每次傳送前地址加1 DA 每次傳送后地址減1 DB 每次傳送前地址減1 FA 滿遞增堆棧

15、 FD 滿遞減堆棧 EA 空遞增堆棧 ED 空遞減堆棧,尋址模式,加載/存儲指令(續(xù)),3.2 ARM指令集,多寄存器傳輸指令的尋址模式,加載/存儲指令(續(xù)),3.2 ARM指令集,棧操作尋址方式,加載/存儲指令(續(xù)) 交換指令 SWP B Rd, Rm, Rn SWP:字交換;SWPB:字節(jié)交換 Temp Rn, Rn Rm, Rd Temp, 例如:SWP R1, R2, R3; R1R3,R3 R2SWP R1, R1, R2; R1與R2內(nèi)容互換,3.2 ARM指令集,數(shù)據(jù)處理指令,3.2 ARM指令集,3.2 ARM指令集,ADD R0, R1, #0 xff,ADD R0, R1,

16、 R2, LSL R3,cond,S,Rn,Rd,Operand2,0,7,8,11,12,15,16,19,20,opcode,21,24,00X,25,27,28,31,#immed_8,#rot,0,7,8,11,方式1:#immed,方式2:Rm,方式3:Rm LSL Rs,方式4:Rm LSL #immed_5 (#immed_5取值范圍0-31),ADD R0, R1, R1, LSL #41,ADD R0, R1, R2, Datasheet P156,數(shù)據(jù)處理指令(續(xù)) 數(shù)據(jù)傳送指令 數(shù)據(jù)傳送指令MOV cond SRd, Operand例如:MOVR1, R0MOVEQ PC

17、, R14 ; 將R14值傳到PC,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 數(shù)據(jù)傳送指令(續(xù)) 數(shù)據(jù)取反傳送指令MVN cond SRd, Operand例如:MVN R1, #2; 將立即數(shù)2取反送至R1為什么有MVN?,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 算術(shù)運算指令 ADD、ADCADD|ADC cond S Rd, Oper1, Oper2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 例如:ADDSR0, R4, R8; 加低端的字ADCSR1, R5, R9; 帶進位加第二字ADCSR2, R6, R10; 帶進位加第三字ADCR3, R7, R11; 帶進位加第四字,3.2

18、ARM指令集,數(shù)據(jù)處理指令(續(xù)) 算術(shù)運算指令(續(xù)) SUB:減法指令SUB cond SRd, Oper1, Oper2 SBC:帶借位減法指令SBC cond SRd, Oper1, Oper2例:SBCS R0, R1, R2 ; R0=R1R2C,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 算術(shù)運算指令(續(xù)) RSB:反向減法指令RSB cond SRd, Oper1, Oper2操作數(shù)2減去操作數(shù)1,例如:RSBR0, R1, R2; R0 = R2 R1 RSC:帶借位的逆向減法指令RSC cond SRd, Oper1, Oper2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 邏輯運

19、算指令 AND:與AND cond SRd, Oper1, Oper2 ORR:或ORR cond SRd, Oper1, Oper2 EOR:異或EOR cond SRd, Oper1, Oper2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 比較指令 CMPCMP condOperand1, Operand2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 比較指令(續(xù)) CMN:反值比較CMN condOperand1, Operand2將第一個數(shù)與第二個數(shù)的反值進行比較,相當于完成兩個數(shù)相加。例如:CMNR1, R0 ; R1+R0,并設置CPSR,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 測

20、試指令 TSTTST condOperand1, Operand2 把兩個操作數(shù)按位進行與運算,根據(jù)結(jié)果更新CPSR。,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 測試指令(續(xù)) TEQTEQ condOperand1, Operand2把兩個操作數(shù)按位進行異或運算,根據(jù)結(jié)果更新CPSR,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘法指令 MULMUL cond SRd, Oper1, Oper2RdOperand1Operand2。例如:MUL R0, R1, R2; R0 =R1R2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘法指令(續(xù)) MLAMLA cond S Rd,Oper1,Op

21、er2,Oper3 RdOperand1Operand2+Operand3例如:MLA R0, R1, R2, R3; R0 = R1R2+R3,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘法指令(續(xù)) UMULL:64位無符號數(shù)乘法指令UMULL cond SRd_L, Rd_H, Operand1, Operand2Rd_H:Rd_L Operand1Operand2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘法指令(續(xù)) 例如:UMULLR0, R1, R2, R3; R0 = (R2R3) 的低32位; R1 = (R2R3) 的高32位,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘

22、法指令(續(xù)) UMLAL: 64位無符號數(shù)乘加指令UMLAL cond SRd_L, Rd_H, Operand1, Operand2Rd_H:Rd_L+= Operand1Operand2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘法指令(續(xù)) 例如:UMLAL R0, R1, R2, R3; R0 = (R2R3)的低32位+R0; R1 = (R2R3)的高32位+R1,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘法指令(續(xù)) SMULL:64位有符號數(shù)乘法指令SMULL cond SRn_L, Rn_H, Operand1, Operand2Rd_H:Rd_L Operand1Ope

23、rand2,3.2 ARM指令集,數(shù)據(jù)處理指令(續(xù)) 乘法指令(續(xù)) SMLAL: 64位有符號數(shù)乘加指令SMLAL cond SRn_L, Rn_H, Operand1, Operand2Rd_H:Rd_L+= Operand1Operand2,3.2 ARM指令集,分支指令 B (分支指令)和 BL (帶鏈接分支指令) B cond LABEL BL cond LABEL 允許向前或向后跳轉(zhuǎn)最高32MB。 BL:帶返回的分支指令,用于調(diào)用一個將其返回地址存入鏈接寄存器的函數(shù)。,3.2 ARM指令集,分支指令,3.2 ARM指令集,B 和 BL的指令編碼,分支指令(續(xù)) B 和 BL (續(xù))

24、,3.2 ARM指令集,例如: BLSUBPRG SUBPRG ; MOVPC, LR; 返回,分支指令(續(xù)) BX (分支并可選地交換指令集) BLX(帶鏈接分支并可選地交換指令集) BX cond Rm BLX cond LABEL | Rm Rm:轉(zhuǎn)移地址,bit0為0時,目標地址處為ARM指令,否則為Thumb指令。,3.2 ARM指令集,分支指令(續(xù)) BX 和 BLX指令執(zhí)行與B和BL指令相同的分支操作,并可從ARM指令集切換到THUMB指令集。,3.2 ARM指令集,分支指令(續(xù)) 長跳轉(zhuǎn) 通過向PC寄存器中寫目標地址值,可實現(xiàn)在4GB地址空間中進行任意跳轉(zhuǎn)。 例如:MOVLR,

25、 PC; 保存返回地址MOVR15, #0 x00110000 ; 無條件轉(zhuǎn)向0 x110000,3.2 ARM指令集,狀態(tài)寄存器訪問指令 MRS MRS Rd, 將狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。例如:MRSR3, CPSR; CPSRR3,3.2 ARM指令集,狀態(tài)寄存器訪問指令(續(xù)) MSR MSR _, Rm MSR _,#,3.2 ARM指令集,狀態(tài)寄存器訪問指令(續(xù)) 表示下列情況之一:c:控制域,即PSR7:0 x:擴展域,即PSR15:8 s:狀態(tài)域,即PSR23:16 f:標志域,即PSR32:24 CPSR|SPSR 通用寄存器。例如:MSR CPSR_F, #設置所有

26、標志位,3.2 ARM指令集,異常/中斷指令(續(xù)) SWI SWI 產(chǎn)生SWI異常中斷,以實現(xiàn)在用戶模式下調(diào)用操作系統(tǒng)的監(jiān)控功能程序 。它將處理器置于管理 (SVC) 模式。例如:SWI 0 x01 ;調(diào)用編號為01的系統(tǒng)例程,3.2 ARM指令集,異常/中斷指令(續(xù)) BKPT BKPT 產(chǎn)生軟件斷點中斷,可用于程序調(diào)試。 例如BKPT0 xF010,3.2 ARM指令集,協(xié)處理器指令 CDP CDP , , CRd, CRn, CRm , 編號為CP#的協(xié)處理器接受指令并執(zhí)行。具體操作由Cop1和Cop2定義,CRn和CRm為源操作數(shù),結(jié)果CRd,3.2 ARM指令集,協(xié)處理器指令(續(xù))

27、CDP (續(xù)) 例如:CDP P6, 2, C5, C10, C3, 16; 激活協(xié)處理器P6的操作,操作碼1和操作碼2值分別為2和16,目標寄存器為C5,源操作數(shù)寄存器為C10和C3,3.2 ARM指令集,協(xié)處理器指令(續(xù)) MRC和MCR MRC | MCR , , CRd, CRn, CRm , 在ARM與協(xié)處理器寄存器間傳數(shù)據(jù)。 MRC:ARM寄存器協(xié)處理器寄存器MCR:協(xié)處理器寄存器ARM寄存器,3.2 ARM指令集,協(xié)處理器指令(續(xù)) MRC和MCR 例如:MCRP3, 3, R0, C4, C5, 6; ARM處理器R0協(xié)處理器P3的寄存器C4和C5,3.2 ARM指令集,協(xié)處理

28、器指令(續(xù)) LDC和STC 在協(xié)處理器寄存器與存儲器間傳送數(shù)據(jù) LDC:協(xié)處理器寄存器存儲器 STC:存儲器協(xié)處理器寄存器,3.2 ARM指令集,協(xié)處理器指令(續(xù)) LDC和STC 前變址格式LDC | STC L , CRd, Rn, ! 后變址格式LDC | STC L , CRd, Rn, ,3.2 ARM指令集,協(xié)處理器指令(續(xù)) LDC和STC LDCP3, C4, R0;將ARM處理器的寄存器R0所指向的存儲器中的字數(shù)據(jù)傳送到協(xié)處理器P3的寄存器C4中 STC P3, C4, R0 ;將P3的C4 中的字數(shù)據(jù)傳至ARM的R0所指向的存儲器,3.2 ARM指令集,Thumb指令集的

29、特點 是ARM指令集壓縮形式的子集,所有Thumb指令均有對應的ARM指令。 采用16位二進制編碼,代碼密度小。 執(zhí)行Thumb指令時,先動態(tài)解壓縮,然后作為標準的ARM指令執(zhí)行。 如何區(qū)分指令流取決于CPSR的位T。,3.3 Thumb指令集,Thumb指令集的特點(續(xù)) 大多Thumb數(shù)據(jù)處理指令采用2地址格式。 移位操作變成單獨指令。 沒有協(xié)處理器指令、單寄存器交換指令、乘加指令、64位乘法指令及程序寄存器處理指令。 僅分支指令B有條件執(zhí)行功能。,3.3 Thumb指令集,Thumb指令集的特點(續(xù)),3.3 Thumb指令集,0,15,31,0,ADDS r2,r2,#1,ADD r2

30、,#1,32-bit ARM 指令,16-bit Thumb 指令,Thumb狀態(tài)切換 ARM狀態(tài)進入Thumb狀態(tài) 執(zhí)行帶狀態(tài)切換的轉(zhuǎn)移指令BX。例如:BX R0 ; 若R0最低位為1,則轉(zhuǎn)Thumb狀態(tài),3.3 Thumb指令集,Thumb狀態(tài)切換 ARM狀態(tài)進入Thumb狀態(tài)(續(xù)) 異常返回。通常用于返回到進入異常前所執(zhí)行的指令流,而不是特地用于切換到Thumb模式。適用于異常前執(zhí)行的是Thumb指令。,3.3 Thumb指令集,Thumb狀態(tài)切換(續(xù)) Thumb 狀態(tài)進入ARM狀態(tài) 執(zhí)行BX指令。 利用異常進入ARM指令流。,3.3 Thumb指令集,Thumb指令寄存器的使用 對R

31、0R7具有全部訪問權(quán)限。 R8R12的訪問受到限制,只能通過MOV、ADD和CMP訪問。 在每一種特權(quán)模式下都有一組SP、LR和SPSR,分別對應ARM狀態(tài)的R13、R14和R15。,3.3 Thumb指令集,Thumb指令與ARM指令的相似點 Load/Store結(jié)構(gòu)。 支持8位字節(jié)、16位半字和32位字數(shù)據(jù)類型 半字以2字節(jié)邊界對準,字以4字節(jié)邊界對準。,3.3 Thumb指令集,Thumb指令集與ARM指令集差異點 跳轉(zhuǎn)指令:條件跳轉(zhuǎn)在范圍上有更多的限制,轉(zhuǎn)向子程序只具有無條件轉(zhuǎn)移。 數(shù)據(jù)處理指令:對通用寄存器進行操作,操作結(jié)果需放入其中一個操作數(shù)寄存器。 單寄存器加載和存儲指令:只能訪

32、問R0R7。,3.3 Thumb指令集,Thumb指令集與ARM指令集差異點(續(xù)) PUSH和POP指令使用堆棧指針R13作為基址實現(xiàn)滿遞減堆棧,除R0R7外,PUSH指令還可存儲R14,POP指令可加載程序指令PC。 大多數(shù)Thumb指令是無條件執(zhí)行的,所有ARM指令都是可條件執(zhí)行的。 由于采用高密度編碼,Thumb指令格式?jīng)]有ARM指令格式規(guī)則。,3.3 Thumb指令集,存儲器訪問指令 單寄存器讀取和存儲指令 LDR | STR ARM單寄存器傳送指令的一個子集,和ARM有相同的指令格式。 多寄存器讀取和存儲指令。和ARM有相同的指令格式。,3.3 Thumb指令集,堆棧指令 POP ,

33、 PC PUSH , LR Reglist:寄存器列表,用逗號隔開 Thumb堆棧是滿遞減堆棧,寄存器以數(shù)字順序存儲在堆棧中,最低數(shù)字的寄存器其地址最低。,3.3 Thumb指令集,Thumb分支指令 B 指令目標為Thumb代碼 B 偏移量左移1位,3.3 Thumb指令集,Thumb分支指令(續(xù)) B 指令 B ,3.3 Thumb指令集,Thumb分支指令(續(xù)) BL 指令目標為Thumb代碼BL ,3.3 Thumb指令集,Thumb分支指令(續(xù)) BL 指令 (H=0) LR PC+(偏移量左移12位后符號擴展至32位); (H=1) PC LR+(偏移量左移1),同時把下一條指令的

34、地址寫入LR中。,3.3 Thumb指令集,Thumb分支指令(續(xù)) BX 指令目標為Thumb代碼或ARM代碼BX Rm,3.3 Thumb指令集,Thumb分支指令(續(xù)) BLX 指令 格式1:BLX 目標為ARM代碼,3.3 Thumb指令集,Thumb分支指令(續(xù)) BLX 指令 格式2:BLX Rm標為ARM或Thumb代碼 如果Rm的位0清0,或使用格式1,則切換到ARM狀態(tài)。,3.3 Thumb指令集,移位和循環(huán)移位操作指令 ASR,LSL,LSR和ROR和運算 格式1: Rd, Rn, Rd:目的寄存器,須在R0R7范圍內(nèi); Rn:源寄存器,須在R0R7范圍內(nèi)。,3.3 Thu

35、mb指令集,移位和循環(huán)移位操作指令(續(xù)) 格式2: Rd, Rs Rd:須在R0R7范圍內(nèi); Rs:包含移位量的寄存器,R0R7范圍,3.3 Thumb指令集,數(shù)據(jù)處理指令 對通用寄存器進行操作。 多數(shù)情況下,操作結(jié)果須放入其中一個操作數(shù)寄存器中,而不是第3個寄存器中。 例如:ADC , ADD , , #ADD , #,3.3 Thumb指令集,ARM匯編的語句格式 symbol instruction|directive|pseudo-instruction ;comment 例如:_Vectors DCD _initial_sp ; Top of Stack,3.4 ARM程序設計基礎,

36、ARM匯編的語句格式(續(xù)) 符號命名規(guī)則 由大小寫字母、數(shù)字及下劃線組成,不能以數(shù)字開頭,符號區(qū)分大小寫 符號在其作用范圍內(nèi)必須唯一 自定義符號名不能與系統(tǒng)的保留字、指令或偽指令相同,3.4 ARM程序設計基礎,ARM匯編的語句格式(續(xù)) ARM匯編語言偽操作 匯編程序中特殊的指令助記符 為完成匯編程序做各種準備工作,對源程序進行匯編程序處理,3.4 ARM程序設計基礎,ARM匯編常用偽操作列表,示例: AREA EXAMPLE, CODE, EADONLY ENTRY Start MOVR0, #10 MOVR1, #3 ADDR0, R0, R1 END LED實例演示,ARM匯編的語句格

37、式(續(xù)) ARM匯編語言偽指令 匯編程序中特殊的指令助記符 在匯編時將被合適的機器指令代替成ARM或Thumb指令,3.4 ARM程序設計基礎,ARM匯編偽指令列表,示例: LOOPMOVR0, #10 ADRR4, LOOP; 將LOOP地址放入R4 ; 由于PC值為當前指令地址值加8字節(jié)(流 ; 水線),因此ADR指令被編譯為 ; SUBR4, PC, #0 xC LDRR0, =0 x1122EF ; 匯編后將得到 ; LDRR1, PC, offset_to_add ; addDCD0 x1122EF,ARM匯編的程序結(jié)構(gòu) 以程序段為單位組織代碼 代碼段:1個匯編程序至少有1個代碼段

38、數(shù)據(jù)段:存放代碼運行時需用到的數(shù)據(jù) 每個段都以AREA為段的開始,以碰到下一個AREA作為段的結(jié)束。代碼段以ENTRY和END來標識開始和結(jié)束。,3.4 ARM程序設計基礎,示例: AREA EXAMPLE, CODE, READONLY ENTRY Start MOVR0, #10 MOVR1, #3 ADDR0, R0, R1 END,ARM匯編的程序結(jié)構(gòu) 順序程序設計 分支程序設計:B、BL 循環(huán)程序設計:B、BL 子程序:BL,3.4 ARM程序設計基礎,示例: CMPR1, #3 BHIEND ADDR0, R0, #3 END LOOPADDR0, R0, R1 CMPR0, #3

39、 BLSLOOP END,示例: BLPRINT_TEXT PRINT_TEXT MOVPC, LR END,ARM C語言基礎及混合編程 ATPCS ARM-Thumb Procedure Call Standard,過程調(diào)用規(guī)范,規(guī)定了一些子程序之間調(diào)用的基本規(guī)則 包括子程序調(diào)用過程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則、參數(shù)傳遞規(guī)則,3.4 ARM程序設計基礎,ARM C語言基礎及混合編程 (續(xù)) 基本ATPCS 寄存器的使用規(guī)則:寄存器對應的名稱 數(shù)據(jù)棧的使用規(guī)則 參數(shù)的傳遞規(guī)則,3.4 ARM程序設計基礎,ARM C語言基礎及混合編程(續(xù)) 寄存器的使用規(guī)則 R0R3:用于傳參,R0用

40、于返回值 R4R11:保存局部變量 R12:子程序間臨時過渡寄存器,IP R13:數(shù)據(jù)棧指針SP R14:LR;R15:PC,3.4 ARM程序設計基礎,ARM C語言基礎及混合編程(續(xù)) 數(shù)據(jù)棧的使用規(guī)則 ATPCS規(guī)定數(shù)據(jù)棧為FD類型 SP:指向最后入棧數(shù)據(jù)的內(nèi)存地址 數(shù)據(jù)棧的基地址:數(shù)據(jù)棧的最高地址 數(shù)據(jù)棧界限:可使用的基本低的內(nèi)存單元地址,3.4 ARM程序設計基礎,ARM C語言基礎及混合編程(續(xù)) 參數(shù)的傳遞規(guī)則 參數(shù)個數(shù)可變:不超過4個時,可使用R0R3;超過4個時,可使用數(shù)據(jù)棧 參數(shù)個數(shù)固定:各浮點參數(shù)按順序處理;為每個浮點參數(shù)分配FP寄存器 子程序結(jié)果返回規(guī)則,3.4 ARM

41、程序設計基礎,3.4 ARM程序設計基礎,子程序結(jié)果返回規(guī)則 結(jié)果為1個32位的整數(shù),可通過R0返回 如結(jié)果為1個64位的整數(shù),可通過R0和R1返回,依次類推 結(jié)果為1個浮點數(shù)時,可通過浮點運算部件的寄存器f0、d0或s0返回 結(jié)果為1個復合浮點數(shù)時,可通過f0fN或d0dN來返回 對于位數(shù)更多的結(jié)果,需通過調(diào)用內(nèi)存來傳遞,ARM C語言基礎及混合編程(續(xù)) 支持ARM和Thumb混合使用的ATPCS 使用/interwork:目標代碼支持ARM程序和Thumb程序混合使用 使用/nointerwork:程序不包含Thumb程序;用戶自己進行ARM和Thumb程序切換,3.4 ARM程序設計基

42、礎,3.4 ARM程序設計基礎,ARM C語言基礎及混合編程(續(xù)) 為什么要使用匯編語言 開機時硬件系統(tǒng)的初始化 中斷處理 對性能非常敏感的代碼塊,手工匯編可優(yōu)化代碼 對于底層的了解,3.4 ARM程序設計基礎,ARM C語言基礎及混合編程(續(xù)) 在C語言中內(nèi)嵌匯編 不能直接向PC賦值,跳轉(zhuǎn)需用B或BL 避免使用R0R3、R12R14 一般不直接使用物理寄存器,最好是聲明C局部變量,并在內(nèi)嵌語句中使用,3.4 ARM程序設計基礎, Datasheet P61,ARM C語言基礎及混合編程(續(xù)) 在C語言中內(nèi)嵌匯編 可以使用C跳轉(zhuǎn)到C/C+標簽 使用內(nèi)嵌匯編有很多其它限制,詳見Datasheet “ARM Developer Suite” P66 變量、函數(shù)名都是地址,混合編程就不難理解了,3.4 ARM程序設計基礎,ARM C語言基礎及混合編程(續(xù)) 在C語言中內(nèi)嵌匯編 _asm指令 ; 指令指令,3.4 ARM程序設計基礎,ARM C語言基礎及混

溫馨提示

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

評論

0/150

提交評論