版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、vARM處理器指令集為加載/存儲型v ARM處理器指令集分為ARM指令集(32位編碼長度) 和Thumb指令集(16位編碼長度)。v Thumb指令集是ARM指令集的一個子集,即所有的Thumb指令均有相對應(yīng)的ARM指令。v ARM指令集包括:1) 跳轉(zhuǎn)指令2) 數(shù)據(jù)處理指令3) 程序狀態(tài)寄存器處理指令4) 加載/存儲指令5) 協(xié)處理器指令6) 異常產(chǎn)生指令 vThumb指令集包括:1) 跳轉(zhuǎn)指令2) 數(shù)據(jù)處理指令3) 加載/存儲指令4) 異常產(chǎn)生指令 v 條件執(zhí)行 幾乎所有的ARM指令都是有條件執(zhí)行,不僅包括常規(guī)的跳轉(zhuǎn)指令,也包括所有其他的指令。 普通類型的指令集不同,一般情況下,只有跳轉(zhuǎn)指
2、令才會有條件執(zhí)行。 條件是否滿足要根據(jù)CPSR和指令的條件域來確定; 大多數(shù)的Thumb指令均為無條件執(zhí)行。指令的條件碼(一)v 指令的條件碼 ARM處理器指令的條件域為4位,ARM狀態(tài)指令的條件域一般為指令編碼的高4位。條件碼共有16種,每種條件碼用2個字符表示,2個字符的條件碼可以添加在指令助記符的后面,和指令同時使用。例如,BEQ,表示“相等則跳轉(zhuǎn)”。指令的條件碼(二)偏移:基址寄存器的內(nèi)容加(或減)偏移量形成存儲器地址R1,R2,R3,R4n堆棧尋址堆棧尋址堆棧是一種按特定順序進行存取的存儲區(qū),即堆棧是一種按特定順序進行存取的存儲區(qū),即“后進先出后進先出”,堆棧指針指向棧頂。堆棧指針指
3、向棧頂。 遞增堆棧(遞增堆棧(Ascending):):向高地址方向生長的堆棧;向高地址方向生長的堆棧; 遞減堆棧(遞減堆棧(Descending):):向低地址方向生長的堆棧;向低地址方向生長的堆棧; 空堆棧(空堆棧(Empty):):棧指針指向下一個數(shù)據(jù)項放入的空棧指針指向下一個數(shù)據(jù)項放入的空位置;位置; 滿堆棧(滿堆棧(Full):):棧指針指向上一個壓入堆棧的有效數(shù)棧指針指向上一個壓入堆棧的有效數(shù)據(jù)項。據(jù)項。 ARM共支持共支持4種類型的堆棧:種類型的堆棧: FA(Full Ascending):):滿遞增堆棧;滿遞增堆棧; FD(Full Descending):):滿遞減堆棧;滿遞
4、減堆棧; EA(Empty Ascending):):空遞增堆棧;空遞增堆棧; ED(Empty Descending):):空遞減堆棧;空遞減堆棧;例如(詳解見后面):例如(詳解見后面):STMFD R13,R0-R12,LR;LRR13-4;R12R13-8;LDMFD R13,R0-R12,PC ;R13R0 ; R13+4R1 ;n塊尋址塊尋址類似于堆棧尋址,但堆棧尋址要配合堆棧進行,而類似于堆棧尋址,但堆棧尋址要配合堆棧進行,而塊拷貝則應(yīng)用于普通數(shù)據(jù)傳送指令。塊拷貝則應(yīng)用于普通數(shù)據(jù)傳送指令。ARM的塊拷貝尋址支持的塊拷貝尋址支持4種方式:種方式: IB(Increment Befor
5、e):):向上前變址向上前變址 IA(Increment After):):向上后變址向上后變址 DB(Decrement Before):):向下前變址向下前變址 DA(Decrement After):):向下后變址向下后變址跳轉(zhuǎn)指令主要有以下幾種形式:跳轉(zhuǎn)指令主要有以下幾種形式:格式格式1:B/BL cond label格式格式2:BX/BLX Rm格式格式3:BLX label符號含義:符號含義: B: branch(分支)分支) L:link(鏈接鏈接, ,保保存存R14R14) X: exchange(ARMARM/Thumb/Thumb狀態(tài)切換)狀態(tài)切換) AREA pt1, C
6、ODE, READONLYAREA pt1, CODE, READONLY ENTRY ENTRY movmov r0,#6 r0,#6cmpcmp r0, #5 r0, #5blltbllt sub1 sub1;less than;less thanblgtblgt sub2 sub2 ;great than;great than sub1sub1movmov pc,lrpc,lrsub2sub2 movmov pc,lrpc,lr END ENDCODE32CODE32;ARM;ARM代碼代碼blxblx TSUB TSUB; ;調(diào)用調(diào)用ThumbThumb指令子程序指令子程序TSUBTS
7、UBCODE16CODE16;Thumb;Thumb代碼代碼TSUBTSUBbxbx R14 R14; ;返回返回ARMARM代碼代碼數(shù)據(jù)處理指令包括 3類:數(shù)據(jù)運算指令、前導(dǎo)零計數(shù)指令、乘法指令。主要包括數(shù)據(jù)傳送指令、算術(shù)邏輯運算指令和比較測試指令等。數(shù)據(jù)傳送指令用于在寄存器間進行數(shù)據(jù)傳送;算術(shù)邏輯運算指令完成常用的算術(shù)與邏輯運算,同時可以選擇更新CPSR中的相應(yīng)條件標(biāo)志位;比較測試指令不保存運算結(jié)果,僅根據(jù)運算結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令名指令含義操作ADD相加Rd=Rn+op2SUB相減Rd=Rn-op2RSB反向相減Rd=op2-RnADC帶進位加Rd=Rn+op2+CSB
8、C帶借位減Rd=Rn-op2+C-1RSC反向帶借位減Rd=op2-Rn+C-1AND位與Rd=Rn AND op2ORR位或Rd=Rn OR op2EOR位異或Rd=Rn EOR op2BIC位清零Rd=Rn AND NOT op2MOV傳送Rd=op2MVN傳送非Rd=NOT op2CMP比較Rn-op2CMN負向比較Rd=op2-RnTST測試Rn AND op2TEQ測試相等Rn EOR op2該指令不影響條件標(biāo)志位。0000 0010 1110 1101.0R0 =CLZ R1, R00 x6R1 =1011 1011 0100 0000.0Rm =MOV R0, R0 LSL R1
9、DestinationCF0DestinationCFLSL : Logical Left ShiftASR: Arithmetic Right Shift(無符號數(shù))乘2除2,并保留符號位DestinationCF.0DestinationCFLSR : Logical Shift RightROR: Rotate Right(無符號數(shù))除2位循環(huán) DestinationRRX: Rotate Right Extended位輪換,從 CF到MSB都參與操作CFARM處理器的普通乘法指令共6條:32位的運算結(jié)果64位運算結(jié)果乘法類指令的所有操作數(shù)和結(jié)果必須為通用寄存器且不能是立即數(shù)或者寄存器的
10、移位結(jié)果結(jié)果寄存器與操作數(shù)1不能相同;r15不能作為操作數(shù)寄存器或結(jié)果寄存器。32位結(jié)果的乘法:MUL cond S Rd, Rm, RsMLA cond S Rd, Rm, Rs, Rn64位結(jié)果的長乘法:MUL cond S RdH, RdL, Rm, RsMul為下列符號之一:MUL、MLA、UMULL、UMLAL、SMULL、SMLAL。指令名指令名指令含義指令含義操作操作MUL乘法Rd=Rm*RsMLA乘加Rd=Rm*Rs+RnUMULL無符號數(shù)乘法RdH: RdL = Rm*RsUMLAL無符號數(shù)乘加RdH: RdL += Rm*RsSMULL有符號數(shù)乘RdH: RdL = Rm*
11、RsSMLAL有符號數(shù)乘加RdH: RdL += Rm*Rsv 程序狀態(tài)寄存器處理指令程序狀態(tài)寄存器處理指令 該指令用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。該指令用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。包括包括2條指令:條指令:MRS 程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送;程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送;MSR 通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送。通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送。 指令格式:指令格式:MRS cond Rd,CPSR | SPSRMSR cond CPSR_field | SPSR_field, 操作數(shù)操作數(shù)n加載加載/ /存儲指令存儲指令( (loa
12、d/store)load/store) 加載加載/存儲指令完成寄存器與存儲器之間的數(shù)據(jù)傳送存儲指令完成寄存器與存儲器之間的數(shù)據(jù)傳送; ; 加載指令將存儲器中的數(shù)據(jù)傳送到寄存器;加載指令將存儲器中的數(shù)據(jù)傳送到寄存器; 存儲指令則將寄存器中的數(shù)據(jù)傳送到存儲器。存儲指令則將寄存器中的數(shù)據(jù)傳送到存儲器。 存儲器地址由存儲器地址由基址寄存器的內(nèi)容基址寄存器的內(nèi)容和和偏移量來偏移量來確定,確定,不支持不支持絕對地址尋址絕對地址尋址方式。方式。例如:例如:LDRR1,R0;R0R1 STRR1,R0, #-4;R1R0-4偏移量具有如下偏移量具有如下3種形式:種形式:無符號立即數(shù)無符號立即數(shù)通用寄存器內(nèi)容通
13、用寄存器內(nèi)容通用寄存器的移位結(jié)果通用寄存器的移位結(jié)果例如:例如:STRR1,R0, #-4;R1R0-4LDR R0,R1,R2;R1+R2R0LDR R0, R5,R7,LSR #2;R5+R7邏輯右移邏輯右移2R0存儲器尋址支持3種方式:1.寄存器間接尋址,如寄存器間接尋址,如LDR R1, R02.前變址偏移尋址前變址偏移尋址STR R1,R0,#0 x100;R1R0+0 x100STR R0,R1,R2;R0R1+R2LDR R0, R5,R7,LSR #2;R7/4 +R5R0LDR R1,R0,#4 !;R0+4-R1,R0=R0+4STR R1,R0,#0 x100 ! ;R1
14、R0+0 x100,R0=R0+0 x1003, 后變址偏移索引后變址偏移索引LDR R1,R0,#-4 ;R0-R1,R0=R0-4STR R0,R1,-R2 ;R0-R1,R1=R1-R2LDR R0, R5,R7,LSL #2 ;R5R0,R7*4+R5R50 x50 x5r10 x200基址基址寄存器寄存器0 x200r00 x5源寄存器源寄存器for STR偏移量偏移量120 x20cr10 x200原基址原基址寄存器寄存器0 x200r00 x5源寄存器源寄存器for STR偏移量偏移量120 x20cr10 x20c更新基址寄存器通過通過 STR r0,r1,#12!來自動更新基
15、址寄存器來自動更新基址寄存器n Post-indexed: STR r0,r1,#12單字/無符號字節(jié)加載/存儲指令(略)格式:格式:LDR|STR LDR|STR condcond B T B TRd,Rd,尋址方式尋址方式 B B:指無符號字節(jié)數(shù)據(jù)傳送,僅傳送最低有效位;指無符號字節(jié)數(shù)據(jù)傳送,僅傳送最低有效位; T T:強制處理器為用戶模式,用于特權(quán)模式下使用用戶強制處理器為用戶模式,用于特權(quán)模式下使用用戶寄存器;不能與前變址偏移同時寄存器;不能與前變址偏移同時 例如例如LDRB R5,R9LDRB R5,R9;傳送最低有效字節(jié),其他清零傳送最低有效字節(jié),其他清零( (大端和大端和小端不同
16、結(jié)果)小端不同結(jié)果)STRT R0,R1,R2半字/有符號字節(jié)加載/存儲指令(略)LDR|STR LDR|STR condcond H|SH|SB Rd, H|SH|SB Rd, 尋址方式;尋址方式;H: H: 無符號半字;無符號半字;SH: SH: 有符號半字;(僅有符號半字;(僅LDRLDR) SBSB:有符號字節(jié);(僅有符號字節(jié);(僅LDRLDR)例如例如LDRH R8,R3,#2LDRH R8,R3,#2; R3+2-R8,R3+2-R8,讀取低讀取低1616位,其他清零位,其他清零LDRSBLDRSB R4,R10,#0 xC1 ;R10+0 xC1-R4,讀取字節(jié),有符號讀取字節(jié),
17、有符號擴展到擴展到32位(用符號填充)位(用符號填充)LDRSHLDRSH R1,R0,#2!; R0+2-R1,R0=R0+2;讀取半字,有讀取半字,有符號擴展到符號擴展到32位位其中:其中:偏移量不支持通用寄存器的移位的格式;偏移量不支持通用寄存器的移位的格式;半字傳送的地址必須是偶數(shù);半字傳送的地址必須是偶數(shù);不能將半字或字節(jié)讀取到不能將半字或字節(jié)讀取到R15;R15;雙字加載/存儲指令(略)該指令完成相鄰寄存器與相鄰存儲單元之間的該指令完成相鄰寄存器與相鄰存儲單元之間的6464位數(shù)據(jù)傳送。位數(shù)據(jù)傳送。LDR|STR LDR|STR condcond D Rd, D Rd,尋址方式;尋址
18、方式;例如例如LDRD R6, R11, #8 ;R11+8-R6,R11+8+4-R7STRD R4, R10, #-24 ;R4-R10,R5-R10+4,R10=R10-24寄存器為寄存器為RdRd和和R(d+1)R(d+1);雙字數(shù)據(jù)傳送要求地址必須為雙字數(shù)據(jù)傳送要求地址必須為8 8的倍數(shù);的倍數(shù);這里無符號立即數(shù)的范圍在這里無符號立即數(shù)的范圍在256256以內(nèi);以內(nèi);偏移量不支持通用寄存器的移位的格式;偏移量不支持通用寄存器的移位的格式;多寄存器加載/存儲指令(一)該指令完成多個通用寄存器與存儲單元之間的數(shù)據(jù)傳送。 LDM|STM cond 尋址方式 Rn !,通用寄存器組 符號的含
19、義:尋址方式為:IA、IB、DA、DB、FD、ED、FA、EA;Rn: 基址寄存器,不允許為R15 (PC);?。褐噶顖?zhí)行后,刷新基址寄存器Rn“ ”:當(dāng)寄存器列表包含PC且為LDM指令時,同時將SPSR拷貝到CPSR,用于異常返回;當(dāng)寄存器列表不包含PC,指示指令中所有的寄存器為用戶模式下的寄存器IAr1地址地址增加增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxx r10, r0,r1,r4STMxx r10, r0,r1,r4基址寄存器基址寄存器 (Rb)存儲器增加存儲器增加r13r14r12多寄存器加載/存儲指令(二)例如:例如:STMFD R13!, R0,
20、 R4-R7, LR STMFD R13!, R0, R4-R7, LR ;寄存器進棧寄存器進棧LDMFD R13!, R0, R4-R7, PC LDMFD R13!, R0, R4-R7, PC ;寄存器返回寄存器返回注:注:基址寄存器可以出現(xiàn)在寄存器列表中,但要避基址寄存器可以出現(xiàn)在寄存器列表中,但要避免和寫回操作免和寫回操作“!”同時使用。同時使用。R15R15可以出現(xiàn)在可以出現(xiàn)在LDMLDM指令的寄存器列表中;但要指令的寄存器列表中;但要避免出現(xiàn)在避免出現(xiàn)在STMSTM指令的寄存器列表中,此時,可指令的寄存器列表中,此時,可以使用以使用R14(R14(用以保存返回地址用以保存返回地址
21、) )。 LDMFD sp!,r4-r7,pc100FF1234AOBE80341010123484209753r41r5 14544r60r712pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存儲器頂存儲器頂SPSP100FF1234A0BE8034SPOld SP100FF1234A0BE8034STMFD sp!,r4-r7,lrSWAP指令(一)(略)該指令在寄存器和存儲器之間進行單字或無符號字節(jié)數(shù)據(jù)的該指令在寄
22、存器和存儲器之間進行單字或無符號字節(jié)數(shù)據(jù)的交換交換 SWP SWP condcond B Rd, B Rd, RmRm, , RnRn 符號的含義:符號的含義:Rd:存儲器的值加載到該寄存器;存儲器的值加載到該寄存器;Rm:該寄存器的值存儲到存儲器;該寄存器的值存儲到存儲器;Rn:指向存儲器地址的存儲器;指向存儲器地址的存儲器;例如例如 SWP R1, R2, R3 ; R3-R1 且且R2-R3; R15 不能用于該指令的任何寄存器不能用于該指令的任何寄存器 SWAP指令(二)(略)例如:信號量的應(yīng)用例如:信號量的應(yīng)用I2C_SEM EQU 0 x08000000I2C_SEM EQU 0
23、x08000000;定義信號量定義信號量I2C_SEM_WAITI2C_SEM_WAITLDR R0,= I2C_SEMLDR R0,= I2C_SEM;SWP R1,R1,R0SWP R1,R1,R0;讀信號量讀信號量CMP R1,#0CMP R1,#0;判斷是否有信號判斷是否有信號BEQ I2C_SEM_WAITBEQ I2C_SEM_WAIT;沒有則等待沒有則等待PLD指令(Cache 預(yù)加載)(略)該指令指示存儲系統(tǒng)從指定的存儲器地址預(yù)先加載到該指令指示存儲系統(tǒng)從指定的存儲器地址預(yù)先加載到CacheCache,從而加速存儲器的訪問。從而加速存儲器的訪問。 PLD PLD RnRn of
24、fset offset RnRn:基址寄存器,基址寄存器,offsetoffset:偏移量。偏移量。例如例如PLD R2PLD R2PLD R15, #280PLD R15, #280PLD R4, R8, LSL #2 PLD R4, R8, LSL #2 協(xié)處理器指令(一)(略)協(xié)處理器指令的功能協(xié)處理器指令的功能協(xié)處理器內(nèi)部寄存器的數(shù)據(jù)處理;協(xié)處理器內(nèi)部寄存器的數(shù)據(jù)處理;協(xié)處理器寄存器與協(xié)處理器寄存器與ARMARM寄存器間的數(shù)據(jù)傳送;寄存器間的數(shù)據(jù)傳送;協(xié)處理器寄存器與存儲器間的數(shù)據(jù)傳送;協(xié)處理器寄存器與存儲器間的數(shù)據(jù)傳送;協(xié)處理器編號分配15用于系統(tǒng)控制14測試控制器13:8保留7:4
25、用戶3:0保留協(xié)處理器指令(二)(略)指令格式指令格式協(xié)處理器內(nèi)部寄存器的數(shù)據(jù)處理;協(xié)處理器內(nèi)部寄存器的數(shù)據(jù)處理;CDP CDP condcond cp, opcode_1,CRd, cp, opcode_1,CRd, CRn,CRmCRn,CRm, opcode_2 , opcode_2 CDP2 cp, opcode_1,CRd, CDP2 cp, opcode_1,CRd, CRn,CRmCRn,CRm, opcode_2 , opcode_2 例如:例如:CDPEQ p2,5,C1,C2,C3,2CDPEQ p2,5,C1,C2,C3,2;完成操作完成操作5 5協(xié)處理器寄存器與協(xié)處理器
26、寄存器與ARMARM寄存器間的數(shù)據(jù)傳送;寄存器間的數(shù)據(jù)傳送;MRC/MCR MRC/MCR condcond cp,opcode_1,Rd,CRn,CRm,opcode_2 cp,opcode_1,Rd,CRn,CRm,opcode_2 MRC2/MCR2 cp,opcode_1,Rd, MRC2/MCR2 cp,opcode_1,Rd, CRnCRn, , CRmCRm , opcode_2 , opcode_2 MRRC/MCRR MRRC/MCRR condcond cp, opcode_1, Rd, cp, opcode_1, Rd, RnRn, , CRmCRm協(xié)處理器指令(三)(略
27、)協(xié)處理器寄存器與存儲器間的數(shù)據(jù)傳送協(xié)處理器寄存器與存儲器間的數(shù)據(jù)傳送LDC|STC LDC|STC condcond L cp, L cp, CRdCRd, , RnRn, #offset !, #offset !LDC|STC LDC|STC condcond L cp, L cp, CRdCRd, , RnRn, #offset , #offset LDC2|STC2 cp, LDC2|STC2 cp, CRdCRd, , RnRn, #offset !, #offset !LDC2|STC2 cp, LDC2|STC2 cp, CRdCRd, , RnRn, #offset , #of
28、fset L L:指明長整數(shù);指明長整數(shù); 異常產(chǎn)生指令SWI SWI condcond 24 24位數(shù)位數(shù)SWISWI產(chǎn)生軟件中斷異常,操作系統(tǒng)在異常處理程產(chǎn)生軟件中斷異常,操作系統(tǒng)在異常處理程序中提供相應(yīng)的系統(tǒng)調(diào)用序中提供相應(yīng)的系統(tǒng)調(diào)用( (向量地址向量地址0 x08)0 x08),2424位數(shù)指明系統(tǒng)調(diào)用的類型。位數(shù)指明系統(tǒng)調(diào)用的類型。 BKPT BKPT condcond 16 16位數(shù)位數(shù)BKPTBKPT產(chǎn)生預(yù)取中止異常,可用于程序的調(diào)試。產(chǎn)生預(yù)取中止異常,可用于程序的調(diào)試。 例如:例如:SWI 0 x123456;SWI 0 x123456; BKPT 0BKPT 0Thumb指令
29、集(一)v ThumbThumb指令集的特點指令集的特點a) 16位指令長度(適于位指令長度(適于16位的存儲器,成本低)位的存儲器,成本低)b) ARM指令集的一個子集指令集的一個子集c)c) 數(shù)據(jù)處理指令的操作數(shù)和指令尋址地址仍是數(shù)據(jù)處理指令的操作數(shù)和指令尋址地址仍是3232位的位的d)d) 較高的代碼密度和較低的功耗較高的代碼密度和較低的功耗 e)e) 執(zhí)行效率相對執(zhí)行效率相對ARMARM較低較低f)f) 除條件跳轉(zhuǎn)指令外均為無條件執(zhí)行除條件跳轉(zhuǎn)指令外均為無條件執(zhí)行Thumb指令集(二)v ThumbThumb指令集包括:指令集包括:跳轉(zhuǎn)指令;跳轉(zhuǎn)指令;數(shù)據(jù)處理指令;數(shù)據(jù)處理指令;單寄存
30、器加載單寄存器加載/存儲指令;存儲指令;多寄存器加載多寄存器加載/存儲指令;存儲指令;異常產(chǎn)生指令。異常產(chǎn)生指令。Thumb指令集(三)v ThumbThumb指令訪問的寄存器指令訪問的寄存器通用寄存器通用寄存器R0R7R13(SP)、)、R14(LR)、)、R15(PC)。)??梢杂邢拗频卦L問可以有限制地訪問R8R12、CPSR。v ARM到到Thumb的狀態(tài)切換途徑:的狀態(tài)切換途徑:執(zhí)行帶狀態(tài)切換(執(zhí)行帶狀態(tài)切換(X)的跳轉(zhuǎn)指令;的跳轉(zhuǎn)指令;異常返回,使用特殊的數(shù)據(jù)處理(異常返回,使用特殊的數(shù)據(jù)處理(MOVS,SUBS)和和多寄存器加載(多寄存器加載(LDM)指令。指令。Thumb指令集(
31、四)v ThumbThumb到到ARMARM的狀態(tài)切換途徑:的狀態(tài)切換途徑:帶狀態(tài)切換(帶狀態(tài)切換(X X)的跳轉(zhuǎn)指令;的跳轉(zhuǎn)指令;進入異常;進入異常;注:注:Thumb指令系統(tǒng)需要含有指令系統(tǒng)需要含有ARM代碼代碼,例如從,例如從ARM到到Thumb的狀態(tài)切換指令。的狀態(tài)切換指令。 Thumb指令集(五)AREA HelloW,CODE,READONLYSWI_WriteCEQU &0SWI_ExitEQU &11ENTRYCODE32ADR R0, STARTBX R0CODE16STARTADR r1, TEXTLOOPLDRB r0, r1ADD r1,r1,#1ARE
32、A HelloW,CODE,READONLYSWI_WriteCEQU &0;假定參數(shù)0表示顯示輸出SWI_ExitEQU &11;參數(shù)11表示從SWI返回ENTRYSTARTADR r1, TEXTLOOPLDRB r0, r1, #1 Thumb指令集(六)CMP r0, #0BEQ DONESWI SWI_WriteCB LOOPDONE SWI SWI_ExitALIGN TEXTDATA;在代碼段使用數(shù)據(jù)在代碼段使用數(shù)據(jù)DCB“Hello World”, &0a, &0d, &00END CMP r0, #0SWINE SWI_WriteCBN
33、E LOOPSWI SWI_ExitTEXTDCB“Hello World”, &0a, &0d, 0;END子程序調(diào)用條件執(zhí)行條件判斷循環(huán)0 x00 x7FFFFFFF0 x80000000-ve+ve- 最大正數(shù)最大正數(shù)- 最小負數(shù)最小負數(shù)對于無符號飽和運算,如果整個結(jié)果將是負對于無符號飽和運算,如果整個結(jié)果將是負值,那么返回的結(jié)果是值,那么返回的結(jié)果是 0ARM宏匯編ARM宏匯編寄存器定義寄存器特殊定義 其他定義 含義R15PC程序計數(shù)器R14LR鏈接寄存器R13SP堆棧指針R12IP程序調(diào)用暫存寄存器R11v8FP變量寄存器8/幀指針(ARM狀態(tài))R10v7SL變量寄存
34、器7/堆棧上限指針(ARM狀態(tài))R9v6SB變量寄存器6/基址寄存器(進程ID/重入/共享庫中)R8v5變量寄存器5R7v4WR變量寄存器4R6v3變量寄存器3R5v2變量寄存器2R4v1變量寄存器1R3a4參數(shù)/結(jié)果/暫存寄存器4R2a3參數(shù)/結(jié)果/暫存寄存器3R1a2參數(shù)/結(jié)果/暫存寄存器2R0a1參數(shù)/結(jié)果/暫存寄存器1ARM宏匯編狀態(tài)、浮點、協(xié)處理器定義ARM宏匯編內(nèi)置變量定義PC或者.當(dāng)前指令的地址VAR或者存儲區(qū)計數(shù)器的當(dāng)前值TRUE邏輯常量為真FALSE邏輯常量為假OPT當(dāng)前設(shè)置列表選項值CONFIG在ARM狀態(tài)等于32;THUMB等于16ENDIANbig or littleC
35、ODESIZE如果匯編Thumb代碼為16,否則為32CPU選定的CPU符號,未指定則為generic ARMARCHITECTURE選定ARM結(jié)構(gòu)的值,4/4T/5ET等PCSTOREOFFSETSTR pc,或STM Rb,PC的地址和PC的存儲值之間的偏移量ARM宏匯編內(nèi)置變量舉例ARM宏匯編符號定義偽操作GBLA,GBLL,GBLS聲明全局變量LCLA,LCLL,LCLS聲明局部變量SETA,SETL,SETS給變量賦值RLIST為通用寄存器列表定義名稱CN為協(xié)處理器的寄存器定義名稱CP為協(xié)處理器定義名稱DN,SN為VFP的寄存器定義名稱FN為FPA的浮點寄存器定義名稱ARM宏匯編全局
36、變量定義(一)ARM宏匯編全局變量定義(二)ARM宏匯編局部變量定義ARM宏匯編變量賦值偽操作ARM宏匯編數(shù)據(jù)定義偽操作LTORG聲明一個數(shù)據(jù)緩沖池(literal pool)的開始MAP定義一個結(jié)構(gòu)化的內(nèi)存表(storage map)的首地址FIELD定義結(jié)構(gòu)化的內(nèi)存表中的一個數(shù)據(jù)域(field)SPACE/%分配一塊內(nèi)存單元,并用0初始化DCB分配一段字節(jié)的內(nèi)存單元,并用指定的數(shù)據(jù)初始化DCD/DCDU分配一段字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化DCDO分配一段字的內(nèi)存單元,并將各單元的內(nèi)容初始化成該但愿相對于靜態(tài)基址寄存器的偏移量DCFD/DCFDU 分配一段雙字的內(nèi)存單元,并用雙精度的浮
37、點數(shù)據(jù)初始化DCFS/DCFSU分配一段字的內(nèi)存單元,并用單精度的浮點數(shù)據(jù)初始化DCI分配一段字節(jié)的內(nèi)存單元,用指定的數(shù)據(jù)初始化,指定內(nèi)存單元中存放的是代碼而非數(shù)據(jù)DCQ/DCQU分配一段雙字的內(nèi)存單元,并用64位的整數(shù)數(shù)據(jù)初始化DCW/DCWU分配一段半字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化DATA在代碼段中使用數(shù)據(jù)。已停用,僅用于保持前向兼容ARM宏匯編MAP及FIELDARM宏匯編SPACEARM宏匯編DCBARM宏匯編匯編控制偽操作ARM宏匯編IF,ELSE及ENDIFARM宏匯編WHILE及WENDARM宏匯編MACRO,MEND及MEXIT(一)ARM宏匯編MACRO,MEND及MEX
38、IT(二)ARM宏匯編其他偽操作ALIGN通過添加補丁字節(jié)使當(dāng)前位置滿足一定的對齊方式AREA定義一個代碼段或數(shù)據(jù)段CODE16/CODE32指示后面的指令為Thumb/ARM指令END源程序結(jié)尾ENTRY程序入口點EQU為數(shù)據(jù)常量、基于寄存器的值和程序標(biāo)號定義一個字符名稱EXPORT/GLOBAL聲明一個可被其他文件引用的符號,相當(dāng)于聲明一個全局變量EXTERN當(dāng)前符號不是在本源文件定義的,如不使用不引入本源文件的符號列表IMPORT當(dāng)前符號不是在本源文件定義的,引入本源文件的符號列表GET/INCLUDE將一個源文件包含到當(dāng)前源文件中,并進行匯編處理INCBIN將一個源文件包含到當(dāng)前源文件
39、中,但被包含文件不進行匯編處理KEEP將局部符號包含在目標(biāo)文件的符號表中NOFP禁止源程序中包含浮點運算指令REQUIRE指定段之間的相互依賴關(guān)系REQUIRE8/PRESERVE8指示當(dāng)前代碼中要求/是數(shù)據(jù)棧8字節(jié)對齊RN為一個特定的寄存器定義名城ROUT定義局部變量的有效范圍1. AREA:AREA 段名 屬性,AREA用于定義一個代碼段、數(shù)據(jù)段或者特定屬性的段。屬性部分表示該代碼段/數(shù)據(jù)段的相關(guān)屬性,多個屬性可以用“,”分隔。n其他偽指令常見屬性如下:常見屬性如下: DATA:定義數(shù)據(jù)段。 CODE:定義代碼段。READONLY:表示本段為只讀。READWRITE:表示本段可讀寫。一個匯
40、編程序至少應(yīng)該包含一個段,當(dāng)程序太一個匯編程序至少應(yīng)該包含一個段,當(dāng)程序太長時,也可以將程序分為多個代碼段和數(shù)據(jù)段長時,也可以將程序分為多個代碼段和數(shù)據(jù)段。例如:例如:AREAtest,CODE,READONLYAREA |.text|, CODE, READONLY2. CODE16、CODE32:CODE16/CODE32CODE16偽操作指示編譯器后面的代碼為16位的Thumb指令。CODE32偽操作指示編譯器后面的代碼為32位的ARM指令。如果在匯編源代碼中同時包含Thumb和ARM指令時,可以用“CODE32”通知編譯器其后的指令序列為32位的ARM指令,用“CODE16”偽指令通知
41、編譯器其后的指令序列為16位的Thumb指令。在使用ARM指令和Thumb指令混合編程的代碼里,這兩條偽指令后面的代碼類型是不同的,但它們并不能對處理器進行狀態(tài)的切換。 例如:CODE32; 32位的ARM指令A(yù)REA|.text|,CODE,READONLY LDR R0,0 x8500; BXR0 ;程序跳轉(zhuǎn),并將處理器切換到Thumb狀態(tài)CODE16 ;16位的Thumb指令 ADD R3,R3,1 END ;源文件結(jié)束3. ENTRY:ENTRY用于指定匯編程序的入口。在一個完整用于指定匯編程序的入口。在一個完整的匯編程序中至少要有一個的匯編程序中至少要有一個ENTRY,程序中也程序中
42、也可以有多個可以有多個。下面的代碼使用了下面的代碼使用了ENTRY:AREA subrout, CODE, READONLYENTRY ; mark first instructionstartMOV r0, #10 MOV r1, #3BL doadd stop MOV r0, #0 x18LDR r1, =0 x20026 SWI 0 x123456 ; ARM semihosting SWI doadd ADD r0, r0, r1 ; Subroutine codeMOV pc, lr ; Return from subroutine.END ; Mark end of file4.
43、END:說明:說明:“END”告訴編譯器已經(jīng)到了源程序的結(jié)告訴編譯器已經(jīng)到了源程序的結(jié)尾。尾。例如:例如:AREAconstdata,DATA,READONLYEND;結(jié)尾結(jié)尾5. EQU:名稱名稱 EQU 表達式表達式,類型,類型EQU用于將程序中的數(shù)字常量、標(biāo)號、基于寄用于將程序中的數(shù)字常量、標(biāo)號、基于寄存器的值賦予一個等效的名稱,這一點類似于存器的值賦予一個等效的名稱,這一點類似于C語言中的語言中的define,可用可用“*”代替代替EQU。如果表達式為如果表達式為32位的常量,我們可以指定表達位的常量,我們可以指定表達式的數(shù)據(jù)類型,類型域可以有以下三種:式的數(shù)據(jù)類型,類型域可以有以下三
44、種:CODE16/CODE32/DATA例如:例如:num1EQU1234;定義定義num1為為1234addr5EQUstr1+0 x50;d1EQU0 x2400,CODE32 ;定義定義d1的值為的值為0 x2400,且該處為且該處為32位的位的ARM指令。指令。6. EXPORT:EXPORT 標(biāo)號標(biāo)號,WEAKEXPORT 在程序中聲明一個全局標(biāo)號,其他文在程序中聲明一個全局標(biāo)號,其他文件中的代碼可以引用該標(biāo)號。用戶也可以用件中的代碼可以引用該標(biāo)號。用戶也可以用GLOBAL代替代替EXPORT。,WEAK可選項聲明其他文件有同名的標(biāo)號,則可選項聲明其他文件有同名的標(biāo)號,則該同名標(biāo)號優(yōu)
45、先于該標(biāo)號被引用。該同名標(biāo)號優(yōu)先于該標(biāo)號被引用。例如:例如:AREA|.text|,CODE,READONLYmain PROC ENDPEXPORT main;聲明一個可全局引用的函數(shù)聲明一個可全局引用的函數(shù)mainEND 7. IMPORT:IMPORT 標(biāo)號標(biāo)號 ,WEAKIMPORT告訴編譯器這個標(biāo)號要在當(dāng)前源文件中告訴編譯器這個標(biāo)號要在當(dāng)前源文件中使用,但標(biāo)號是在其他的源文件中定義的。不使用,但標(biāo)號是在其他的源文件中定義的。不管當(dāng)前源文件是否使用過該標(biāo)號,這個標(biāo)號都管當(dāng)前源文件是否使用過該標(biāo)號,這個標(biāo)號都會加入到當(dāng)前源文件的符號表中。會加入到當(dāng)前源文件的符號表中。 ,WEAK選項表示
46、如果所有的源文件都沒有找選項表示如果所有的源文件都沒有找到這個標(biāo)號的定義,編譯器也不會提示錯誤信到這個標(biāo)號的定義,編譯器也不會提示錯誤信息。編譯器在多數(shù)情況下將該標(biāo)號置為息。編譯器在多數(shù)情況下將該標(biāo)號置為0,如果,如果這個標(biāo)號被這個標(biāo)號被B或或BL指令引用,則將指令引用,則將B或或BL指令指令替換為替換為NOP操作。操作。例如:例如:AREAmycode,CODE,READONLY IMPORT_printfEND 8. EXTERN: EXTERN 標(biāo)號標(biāo)號 ,WEAK說明:說明:EXTERN告訴編譯器所使用的標(biāo)號要在當(dāng)告訴編譯器所使用的標(biāo)號要在當(dāng)前源文件中引用前源文件中引用,但該標(biāo)號是在其
47、他的源文件中但該標(biāo)號是在其他的源文件中定義的。與定義的。與IMPORT不同的是,如果當(dāng)前源文件不同的是,如果當(dāng)前源文件實際上沒有引用該標(biāo)號,該標(biāo)號就不會被加入到實際上沒有引用該標(biāo)號,該標(biāo)號就不會被加入到當(dāng)前文件的符號表中。當(dāng)前文件的符號表中。,WEAK選項意義同選項意義同IMPORT。例如:例如:AREA|.text|,CODE,READONLYEXTERN _printf ;告訴編譯器當(dāng)前文件要引用標(biāo)告訴編譯器當(dāng)前文件要引用標(biāo)號號 ;如果找不到,則不提示錯誤;如果找不到,則不提示錯誤END 9. RN: 名稱RN 表達式 說明:說明:RN用于給一個寄存器定義一個別名用于給一個寄存器定義一個別
48、名,以便程序員以便程序員記憶該寄存器的功能。其中,名稱為給寄存器定義的別記憶該寄存器的功能。其中,名稱為給寄存器定義的別名,表達式為寄存器的編碼。名,表達式為寄存器的編碼。10.GET/INCLUDE:GET文件名文件名 說明:說明:GET將一個源文件包含到當(dāng)前的源文件中,并將被將一個源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置展開進行匯編處理。包含的源文件在當(dāng)前位置展開進行匯編處理。INCLUDE和和GET作用等效的。我們通常這樣使用這個偽指令:在某作用等效的。我們通常這樣使用這個偽指令:在某源文件中定義一些宏指令,用源文件中定義一些宏指令,用MAP和和FIELD定義結(jié)構(gòu)化的定義
49、結(jié)構(gòu)化的數(shù)據(jù)類型,用數(shù)據(jù)類型,用EQU定義常量的符號名稱,然后用定義常量的符號名稱,然后用GET/INCLUDE將這個源文件包含到其他的源文件中。將這個源文件包含到其他的源文件中。11. INCBIN 文件名文件名INCBIN將一個數(shù)據(jù)文件或者目標(biāo)文件包含到當(dāng)前的將一個數(shù)據(jù)文件或者目標(biāo)文件包含到當(dāng)前的源文件中,編譯時被包含的文件不作任何變動的存源文件中,編譯時被包含的文件不作任何變動的存放在當(dāng)前文件中,編譯器從后面開始繼續(xù)處理。放在當(dāng)前文件中,編譯器從后面開始繼續(xù)處理。例如:例如:AREAconstdata,DATA,READONLYINCBINdata1.datINCBIN E:DATAda
50、ta2.binEND ARM宏匯編偽指令(二)ARM宏匯編偽指令A(yù)DRARM宏匯編偽指令A(yù)DRLARM宏匯編偽指令LDRARM宏匯編Thumb偽指令v ThumbThumb偽指令偽指令 ADR register,expr LDR register,LDR register, =expr|label-exprexpr|label-expr NOPNOP:空操作空操作ARM與C語言的混和編程(一)ARMARM匯編語言與匯編語言與C/C+C/C+的混合編程的混合編程ARMARM匯編與匯編與C/C+C/C+的混合編程要遵循的混合編程要遵循ATPCSATPCS規(guī)則規(guī)則(ARM-ARM-Thumb Pro
51、cedure Call StandardThumb Procedure Call Standard)混合編程方式混合編程方式嵌入?yún)R編嵌入?yún)R編格式:格式:_ _ _asmasm 在匯編程序與在匯編程序與C/C+C/C+的程序間進行變量的互訪;的程序間進行變量的互訪;匯編程序與與匯編程序與與C/C+C/C+程序間的相互調(diào)用。程序間的相互調(diào)用。ARM與C語言的混和編程(二)IMPORT mainAREA Init,CODE, READONLYENTRYSTART LDR R1, =0 x08000000STRB, R0,R1, #1BL main ENDvoid main()do_task();re
52、turn;從匯編跳轉(zhuǎn)到從匯編跳轉(zhuǎn)到c c程序程序 程序的初始化部分(如外設(shè)等)用匯編語言編寫,然后,程序的初始化部分(如外設(shè)等)用匯編語言編寫,然后,執(zhí)行跳轉(zhuǎn)指令,轉(zhuǎn)移到執(zhí)行跳轉(zhuǎn)指令,轉(zhuǎn)移到c c程序的入口進行執(zhí)行程序的入口進行執(zhí)行 ARM與C語言的混和編程(三)extern void mystrcpy(char *d,char *r);void main()char *s=source;char *r=destionation;mystrcpy(r,s)return ;c c程序調(diào)用匯編程程序調(diào)用匯編程EXPORT mystrcpyAREA mystrcpy,CODE,READONLYloopldrb r3, r1,#1 strb r3, r0,#1 cmp r3,#0 bne loop mov pc,lr END ARM與C語言的混和編程(四)參數(shù)的傳遞規(guī)則參
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版電力工程設(shè)計咨詢合同2篇
- 二零二五年度高新技術(shù)企業(yè)承包商擔(dān)保合同3篇
- 二零二五版戶外用品促銷員活動策劃合同2篇
- 二零二五年度酒店前臺正規(guī)雇傭合同范本(含勞動合同變更及續(xù)簽規(guī)則)3篇
- 二零二五版港口安全評價與安全管理合同3篇
- 二零二五版環(huán)保工程保險合同3篇
- 二零二五版外資企業(yè)往來借款稅務(wù)籌劃合同3篇
- 二零二五年財務(wù)顧問企業(yè)財務(wù)管理咨詢合同3篇
- 二零二五版智能家居產(chǎn)品銷售安裝合同2篇
- 二零二五年度鋼筋行業(yè)購銷合同規(guī)范范本5篇
- 2024年新疆(兵團)公務(wù)員考試《行測》真題及答案解析
- 《阻燃材料與技術(shù)》課件 第8講 阻燃木質(zhì)材料
- 低空經(jīng)濟的社會接受度與倫理問題分析
- JGJ120-2012建筑基坑支護技術(shù)規(guī)程-20220807013156
- 英語代詞專項訓(xùn)練100(附答案)含解析
- GB/T 4732.1-2024壓力容器分析設(shè)計第1部分:通用要求
- 《采礦工程英語》課件
- NB-T31045-2013風(fēng)電場運行指標(biāo)與評價導(dǎo)則
- NB-T+10488-2021水電工程砂石加工系統(tǒng)設(shè)計規(guī)范
- 天津市和平區(qū)2023-2024學(xué)年七年級下學(xué)期6月期末歷史試題
- 微型消防站消防員培訓(xùn)內(nèi)容
評論
0/150
提交評論