版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第三講ARM指令系統(tǒng)電信學(xué)院本講主要內(nèi)容ARM指令系統(tǒng)尋址方式指令簡介匯編實例本講目的概要介紹ARM、Thumb指令集,能夠達到通過查找工具書可以編寫簡單匯編程序的目的。ARM處理器指令集概述(-)ARM處理器指令集為加載/存儲型
ARM處理器指令集分為ARM指令集(32位編碼長度)和Thumb指令集(16位編碼長度)。
Thumb指令集是ARM指令集的一個子集,即所有的Thumb指令均有相對應(yīng)的ARM指令。
ARM指令集包括:跳轉(zhuǎn)指令數(shù)據(jù)處理指令程序狀態(tài)寄存器處理指令A(yù)RM處理器指令集概述(二)加載/存儲指令協(xié)處理器指令異常產(chǎn)生指令Thumb指令集包括:跳轉(zhuǎn)指令數(shù)據(jù)處理指令加載/存儲指令異常產(chǎn)生指令指令語法格式<opcode> 指令助記符,如ADD{<cond>} 指令執(zhí)行的條件{S} 決定指令的操作是否影響CPSR<Rd> 目標(biāo)寄存器<Rn> 包含第一個操作數(shù)的寄存器<shifter_operand>第二個操作數(shù)<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>ARM指令編碼格式指令的條件執(zhí)行條件執(zhí)行幾乎所有的ARM指令都是有條件執(zhí)行,不僅包括常規(guī)的跳轉(zhuǎn)指令,也包括所有其他的指令。普通類型的指令集不同,一般情況下,只有跳轉(zhuǎn)指令才會有條件執(zhí)行。條件是否滿足要根據(jù)CPSR和指令的條件域來確定;大多數(shù)的Thumb指令均為無條件執(zhí)行。指令的條件碼(一)指令的條件碼ARM處理器指令的條件域為4位,ARM狀態(tài)指令的條件域一般為指令編碼的高4位。條件碼共有16種,每種條件碼用2個字符表示,2個字符的條件碼可以添加在指令助記符的后面,和指令同時使用。例如,BEQ,表示“相等則跳轉(zhuǎn)”。指令的條件碼(二)基本尋址方式(一)寄存器尋址例:ADDR0,R1,R2;R1+R2R0立即數(shù)尋址例:ADDR3,R3,#2;R3+2R3寄存器間接尋址例:LDRR0,[R3];[R3]R0寄存器移位尋址ADDR3,R2,R1,LSL#3;R1*8+R2R3基本尋址方式(二)寄存器變址尋址,前索引偏移:基址寄存器的內(nèi)容加(或減)偏移量形成存儲器地址立即數(shù)偏移:LDRR0,[R1,#4];[R1+4]R0LDRR0,[R1,#4]!;[R1+4]R0,R1+4R1!表明數(shù)據(jù)傳送后更新基址寄存器寄存器偏移:
LDRR0,[R1,-R2] ;[R1-R2]R0移位寄存器偏移:LDRR0,[R1,R2,LSL#2];[R2*4+R1]R0基本尋址方式(三)寄存器變址尋址,后索引立即數(shù)偏移:LDRR0,[R1],
#4;[R1]R0,R1+4R1寄存器偏移:
LDRR0,[R3],-R8;[R3]R0,R3-R8R3移位寄存器偏移:LDRR0,[R3],R2,LSL#2;[R3]R0,[R2*4+R3]R3基本尋址方式(四)相對尋址例:BLabel;(PC)+LabelPC多寄存器尋址,一條指令傳遞多個寄存器值,例STMIAR1,{R2,R3,R4}
;R2[R1]
;R3[R1+4]
;R4[R1+8]基本尋址方式(五)堆棧尋址堆棧是一種按特定順序進行存取的存儲區(qū),即“后進先出”,堆棧指針指向棧頂。遞增堆棧(Ascending):向高地址方向生長的堆棧;遞減堆棧(Descending):向低地址方向生長的堆棧;空堆棧(Empty):棧指針指向下一個數(shù)據(jù)項放入的空位置;滿堆棧(Full):棧指針指向上一個壓入堆棧的有效數(shù)據(jù)項。
基本尋址方式(五)ARM共支持4種類型的堆棧:
FA(FullAscending):滿遞增堆棧;
FD(FullDescending):滿遞減堆棧;
EA(EmptyAscending):空遞增堆棧;
ED(EmptyDescending):空遞減堆棧;例如(詳解見后面):
STMFDR13, {R0-R12, LR} ;LR[R13-4]
;R12[R13-8]
;……
LDMFDR13, {R0-R12, PC} ;[R13]R0
;[R13+4]R1;……基本尋址方式(六)塊尋址類似于堆棧尋址,但堆棧尋址要配合堆棧進行,而塊拷貝則應(yīng)用于普通數(shù)據(jù)傳送指令。ARM的塊拷貝尋址支持4種方式:
IB(IncrementBefore):向上前變址
IA(IncrementAfter):向上后變址
DB(DecrementBefore):向下前變址
DA(DecrementAfter):向下后變址跳轉(zhuǎn)指令(一)跳轉(zhuǎn)指令主要有以下幾種形式:格式1:B/BL{cond}label格式2:BX/BLXRm格式3:BLXlabel符號含義:
B:branch(分支)
L:link(鏈接,保存R14)
X:exchange(ARM/Thumb狀態(tài)切換)
跳轉(zhuǎn)指令(二)
AREApt1,CODE,READONLYENTRY movr0,#6 cmpr0,#5
blltsub1
;lessthan
blgtsub2;greatthan
…
sub1
…
movpc,lrsub2
…
movpc,lrEND跳轉(zhuǎn)指令(三)CODE32 ;ARM代碼
…
blxTSUB ;調(diào)用Thumb指令子程序TSUB
… CODE16 ;Thumb代碼TSUB
… bxR14 ;返回ARM代碼數(shù)據(jù)處理指令(總述)數(shù)據(jù)處理指令包括
3類:
數(shù)據(jù)運算指令、 前導(dǎo)零計數(shù)指令、 乘法指令。數(shù)據(jù)運算指令(一)主要包括數(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+CSBC帶借位減Rd=Rn-op2+C-1RSC反向帶借位減Rd=op2-Rn+C-1AND位與Rd=RnANDop2ORR位或Rd=RnORop2EOR位異或Rd=RnEORop2BIC位清零Rd=RnANDNOTop2MOV傳送Rd=op2MVN傳送非Rd=NOTop2CMP比較Rn-op2CMN負(fù)向比較Rd=op2-RnTST測試RnANDop2TEQ測試相等RnEORop2前導(dǎo)零計數(shù)CLZ(CountLeadingZeros)CLZ{cond}Rd,Rm計算寄存器中的前導(dǎo)0(第一個1以前的0)
源寄存器從最高位開始計算。1個周期完成 (ARM9E-S/ARM102x)如果沒有任何一位是1,結(jié)果是32;如果bit31是1,結(jié)果為0。該指令不影響條件標(biāo)志位。0000001011101101...0R0=CLZR1,R00x6R1=1011101101000000...0Rm=MOVR0,R0LSLR1第2操作數(shù)移位操作ASRn 算術(shù)右移,最高位補符號LSLn 邏輯左移,右補0LSRn 邏輯右移,左補0RORn 循環(huán)右移RRX 帶進位的循環(huán)右移1位移位操作DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(無符號數(shù))乘2除2,并保留符號位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(無符號數(shù))除2位循環(huán)
DestinationRRX:RotateRightExtended位輪換,從CF到MSB都參與操作CF乘法指令A(yù)RM處理器的普通乘法指令共6條:32位的運算結(jié)果64位運算結(jié)果乘法類指令的所有操作數(shù)和結(jié)果必須為通用寄存器且不能是立即數(shù)或者寄存器的移位結(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*RsSMLAL有符號數(shù)乘加RdH:RdL+=Rm*Rs程序狀態(tài)寄存器處理指令程序狀態(tài)寄存器處理指令
該指令用于在程序狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。包括2條指令:MRS程序狀態(tài)寄存器到通用寄存器的數(shù)據(jù)傳送;MSR通用寄存器到程序狀態(tài)寄存器的數(shù)據(jù)傳送。
指令格式:MRS{cond} Rd, CPSR|SPSRMSR{cond} CPSR_field|SPSR_field,操作數(shù)加載/存儲指令(一)加載/存儲指令(load/store)加載/存儲指令完成寄存器與存儲器之間的數(shù)據(jù)傳送;加載指令將存儲器中的數(shù)據(jù)傳送到寄存器;存儲指令則將寄存器中的數(shù)據(jù)傳送到存儲器。存儲器地址由基址寄存器的內(nèi)容和偏移量來確定,不支持絕對地址尋址方式。例如:LDR R1, [R0] ;[R0]R1 STR R1, [R0,#-4] ;R1[R0-4]加載/存儲指令(二)偏移量具有如下3種形式:無符號立即數(shù)通用寄存器內(nèi)容通用寄存器的移位結(jié)果例如:STR R1, [R0,#-4] ;R1[R0-4] LDRR0,[R1,R2] ;[R1+R2]R0 LDRR0,[R5,R7,LSR#2] ;[R5+R7邏輯右移2]R0加載/存儲指令(三)存儲器尋址支持3種方式:寄存器間接尋址,如 LDRR1,[R0]前變址偏移尋址STRR1,[R0,#0x100] ;R1[R0+0x100]STRR0,[R1,R2] ;R0[R1+R2]LDRR0,[R5,R7,LSR#2] ;[R7/4+R5]R0LDRR1,[R0,#4]
!
;[R0+4]->R1,R0=R0+4STRR1,[R0,#0x100]!
;R1[R0+0x100],R0=R0+0x100
加載/存儲指令(四)3,后變址偏移索引LDRR1,[R0],#-4 ;[R0]->R1,R0=R0-4STRR0,[R1],-R2 ;R0->[R1],R1=R1-R2LDRR0,[R5],R7,LSL#2 ;[R5]R0,R7*4+R5R50x50x5r10x200基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x200原基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x20c更新
基址寄存器通過
STRr0,[r1,#12]!來自動更新基址寄存器PreorPostIndexed尋址
Pre-indexed:STRr0,[r1,#12]
Post-indexed:STRr0,[r1],#12單字/無符號字節(jié)加載/存儲指令(略)格式:LDR|STR{cond}{B}{T} Rd, 尋址方式 B:指無符號字節(jié)數(shù)據(jù)傳送,僅傳送最低有效位; T:強制處理器為用戶模式,用于特權(quán)模式下使用用戶寄存器;不能與前變址偏移同時
例如
LDRBR5,[R9];傳送最低有效字節(jié),其他清零(大端和小端不同結(jié)果) STRTR0,[R1,R2]半字/有符號字節(jié)加載/存儲指令(略)LDR|STR{cond}H|SH|SBRd, 尋址方式;H:無符號半字;SH:有符號半字;(僅LDR)
SB:有符號字節(jié);(僅LDR)例如 LDRHR8,[R3,#2] ;[R3+2]->R8,讀取低16位,其他清零 LDRSBR4,[R10,#0xC1] ;[R10+0xC1]->R4,讀取字節(jié),有符號擴展到32位(用符號填充) LDRSHR1,[R0,#2]! ;[R0+2]->R1,R0=R0+2;讀取半字,有符號擴展到32位 其中:偏移量不支持通用寄存器的移位的格式;半字傳送的地址必須是偶數(shù);不能將半字或字節(jié)讀取到R15;雙字加載/存儲指令(略)該指令完成相鄰寄存器與相鄰存儲單元之間的64位數(shù)據(jù)傳送。
LDR|STR{cond}DRd, 尋址方式;例如 LDRDR6,[R11,#8] ;[R11+8]->R6,[R11+8+4]->R7 STRDR4,[R10],#-24; R4->[R10],R5->[R10+4],R10=R10-24寄存器為Rd和R(d+1);雙字?jǐn)?shù)據(jù)傳送要求地址必須為8的倍數(shù);這里無符號立即數(shù)的范圍在256以內(nèi);偏移量不支持通用寄存器的移位的格式;多寄存器加載/存儲指令(一)該指令完成多個通用寄存器與存儲單元之間的數(shù)據(jù)傳送。LDM|STM{cond}尋址方式Rn{!},通用寄存器組{^}符號的含義:尋址方式為:IA、IB、DA、DB、FD、ED、FA、EA;Rn:基址寄存器,不允許為R15(PC);?。褐噶顖?zhí)行后,刷新基址寄存器Rn“^”:當(dāng)寄存器列表包含PC且為LDM指令時,同時將SPSR拷貝到CPSR,用于異常返回;當(dāng)寄存器列表不包含PC,指示指令中所有的寄存器為用戶模式下的寄存器LDM/STM操作語法:<LDM|STM>{<cond>}<addressing_mode>Rb{!},<寄存器list>四
種尋址操作:
LDMIA/STMIA IncrementAfter(先操作,后增加)
LDMIB/STMIB IncrementBefore(先增加,后操作)
LDMDA/STMDA DecrementAfter(先操作,后遞減)
LDMDB/STMDB DecrementBefore(先遞減,后操作)IAr1地址增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxxr10,{r0,r1,r4}STMxxr10,{r0,r1,r4}基址寄存器(Rb)存儲器塊拷貝可選項“!
”將導(dǎo)致LDM/STM
指令去自動更新基址寄存器后綴為IA,IB時,加上4乘以用于傳送的寄存器的數(shù)目的值后綴為DA,DB時,減去4乘以用于傳送的寄存器的數(shù)目的值示例:;r12指向源數(shù)據(jù)起始地址;r14指向源數(shù)據(jù)尾地址;r13指向目的數(shù)據(jù)起始地址loop LDMIA r12!,{r0-r11} ;裝載48bytes STMIA r13!,{r0-r11} ;存儲them CMP r12,r14 ;checkfortheend BNE loop ;loopuntildone此循環(huán)傳送48bytes占用了31周期時鐘為33MHz時傳輸速率超過50Mbytes/sec存儲器增加r13r14r12多寄存器加載/存儲指令(二)例如:STMFDR13!,{R0,R4-R7,LR};寄存器進棧LDMFDR13!,{R0,R4-R7,PC};寄存器返回注:基址寄存器可以出現(xiàn)在寄存器列表中,但要避免和寫回操作“!”同時使用。R15可以出現(xiàn)在LDM指令的寄存器列表中;但要避免出現(xiàn)在STM指令的寄存器列表中,此時,可以使用R14(用以保存返回地址)。
LDMFDsp!,{r4-r7,pc}100FF1234AOBE80341010123484209753r41r514544r60r712pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆棧r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存儲器頂SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆棧操作通過塊傳送指令來完成:STMFD (Push) 塊存儲-FullDescendingstack[STMDB]LDMFD
(Pop) 塊裝載-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}SWAP指令(一)(略)該指令在寄存器和存儲器之間進行單字或無符號字節(jié)數(shù)據(jù)的交換
SWP{cond}{B}Rd,Rm,[Rn]符號的含義:Rd:存儲器的值加載到該寄存器;Rm:該寄存器的值存儲到存儲器;Rn:指向存儲器地址的存儲器;例如SWPR1,R2,[R3];[R3]->R1且R2->[R3];R15不能用于該指令的任何寄存器
SWAP指令(二)(略)例如:信號量的應(yīng)用
I2C_SEMEQU0x08000000 ;定義信號量
…I2C_SEM_WAIT LDRR0,=I2C_SEM ; SWPR1,R1,[R0] ;讀信號量
CMPR1,#0 ;判斷是否有信號
BEQI2C_SEM_WAIT ;沒有則等待
…PLD指令(Cache預(yù)加載)(略)該指令指示存儲系統(tǒng)從指定的存儲器地址預(yù)先加載到Cache,從而加速存儲器的訪問。
PLD[Rn{offset}] Rn:基址寄存器,offset:偏移量。例如
PLD[R2] PLD[R15,#280] PLD[R4,R8,LSL#2]協(xié)處理器指令(一)(略)協(xié)處理器指令的功能協(xié)處理器內(nèi)部寄存器的數(shù)據(jù)處理;協(xié)處理器寄存器與ARM寄存器間的數(shù)據(jù)傳送;協(xié)處理器寄存器與存儲器間的數(shù)據(jù)傳送;協(xié)處理器編號分配15用于系統(tǒng)控制14測試控制器13:8保留7:4用戶3:0保留協(xié)處理器指令(二)(略)指令格式協(xié)處理器內(nèi)部寄存器的數(shù)據(jù)處理;CDP{cond}cp,opcode_1,CRd,CRn,CRm{,opcode_2}CDP2cp,opcode_1,CRd,CRn,CRm{,opcode_2}例如:CDPEQp2,5,C1,C2,C3,2 ;完成操作5協(xié)處理器寄存器與ARM寄存器間的數(shù)據(jù)傳送;MRC/MCR{cond}cp,opcode_1,Rd,CRn,CRm{,opcode_2}MRC2/MCR2cp,opcode_1,Rd,CRn,CRm{,opcode_2}MRRC/MCRR{cond}cp,opcode_1,Rd,Rn,CRm協(xié)處理器指令(三)(略)協(xié)處理器寄存器與存儲器間的數(shù)據(jù)傳送LDC|STC{cond}{L}cp,CRd,[Rn,#offset]{!}LDC|STC{cond}{L}cp,CRd,[Rn],#offset
LDC2|STC2cp,CRd,[Rn,#offset]{!}LDC2|STC2cp,CRd,[Rn],#offsetL:指明長整數(shù);異常產(chǎn)生指令SWI{cond}24位數(shù)
SWI產(chǎn)生軟件中斷異常,操作系統(tǒng)在異常處理程序中提供相應(yīng)的系統(tǒng)調(diào)用(向量地址0x08),24位數(shù)指明系統(tǒng)調(diào)用的類型。BKPT{cond}16位數(shù)
BKPT產(chǎn)生預(yù)取中止異常,可用于程序的調(diào)試。例如:SWI0x123456; BKPT0Thumb指令集(一)Thumb指令集的特點16位指令長度(適于16位的存儲器,成本低)
ARM指令集的一個子集數(shù)據(jù)處理指令的操作數(shù)和指令尋址地址仍是32位的較高的代碼密度和較低的功耗
執(zhí)行效率相對ARM較低除條件跳轉(zhuǎn)指令外均為無條件執(zhí)行Thumb指令集(二)Thumb指令集包括:跳轉(zhuǎn)指令;數(shù)據(jù)處理指令;單寄存器加載/存儲指令;多寄存器加載/存儲指令;異常產(chǎn)生指令。Thumb指令集(三)Thumb指令訪問的寄存器通用寄存器R0~R7R13(SP)、R14(LR)、R15(PC)??梢杂邢拗频卦L問R8~R12、CPSR。ARM到Thumb的狀態(tài)切換途徑:執(zhí)行帶狀態(tài)切換(X)的跳轉(zhuǎn)指令;異常返回,使用特殊的數(shù)據(jù)處理(MOVS,SUBS)和多寄存器加載(LDM)指令。Thumb指令集(四)Thumb到ARM的狀態(tài)切換途徑:帶狀態(tài)切換(X)的跳轉(zhuǎn)指令;進入異常;注:Thumb指令系統(tǒng)需要含有ARM代碼,例如從ARM到Thumb的狀態(tài)切換指令。
Thumb指令集(五)AREAHelloW,CODE,READONLYSWI_WriteC EQU&0 SWI_Exit EQU&11 ENTRY
CODE32
ADRR0,START
BXR0
CODE16START ADRr1,TEXTLOOP LDRBr0,[r1] ADDr1,r1,#1 AREAHelloW,CODE,READONLYSWI_WriteC EQU&0 ;假定參數(shù)0表示顯示輸出 SWI_Exit EQU&11 ;參數(shù)11表示從SWI返回 ENTRYSTART ADRr1,TEXTLOOP LDRBr0,[r1],#1Thumb指令集(六)
CMPr0,#0 BEQDONE SWISWI_WriteC BLOOPDONE SWISWI_Exit
ALIGN
TEXT DATA ;在代碼段使用數(shù)據(jù) DCB “HelloWorld”,&0a,&0d,&00 END
CMPr0,#0
SWINESWI_WriteC BNELOOP SWI SWI_Exit
TEXT DCB “HelloWorld”,&0a,&0d,0; END子程序調(diào)用…BLfunction…Function ;子程序….….MOVPC,LR ;子程序返回條件執(zhí)行Function ;子程序,求最大公約CMPR0,R1 ;比較a和bSUBGTR0,R0,R1 ;if(a>b)a=a-bSUBLTR1,R1,R0 ;if(a<b)b=b-aBNEfunction ;if(a!=b)返回MOVPC,LR ;返回條件判斷條件判斷:CMPR0,#0 ;判斷R0是否等于0CMPNER1,#1 ;如果R0!=0,判斷R1?1ADDEQR2,R3,R4;R0=0或R1=1時,R2=R3+R4循環(huán)MOVR0,#loopcountLoop….SUBSR0,R0,#1BNEloop飽和運算(一)0x7FFFFFFF+1將導(dǎo)致正數(shù)變?yōu)樨?fù)數(shù)0x80000000–1將導(dǎo)致負(fù)數(shù)變?yōu)檎龜?shù)飽和運算指令將識別上述事件,從而調(diào)整其結(jié)果為最大正數(shù)或最小負(fù)數(shù)。(補碼:原碼取反加1)0x00x7FFFFFFF0x80000000-ve+ve-最大正數(shù)-最小負(fù)數(shù)飽和運算(二)對于無符號飽和運算,如果整個結(jié)果將是負(fù)值,那么返回的結(jié)果是0ARM宏匯編與編程基礎(chǔ)ARM宏匯編偽操作對源程序進行匯編期間處理,而不是直接由計算機執(zhí)行的指令偽指令(宏指令)并非真正的指令,而是一段獨立的程序代碼;在源程序被匯編時,每個宏被展開,用宏定義體取代宏指令。也是通過偽操作定義的。ARM宏匯編-寄存器定義ARM宏匯編-狀態(tài)、浮點、協(xié)處理器定義定義的程序狀態(tài)寄存器名cpsr和CPSRspsr和SPSR定義的浮點寄存器名f0-f7F0-F7定義的協(xié)處理器名p0-p15c0-c15ARM宏匯編-內(nèi)置變量定義ARM宏匯編-內(nèi)置變量舉例內(nèi)置變量不能用SETA、SETL、SETS等指示詞來設(shè)置,只能用字符或條件表達式來設(shè)置,例IF{ARCHITECTURE}=“4T”……ARM宏匯編-符號定義偽操作ARM宏匯編-全局變量定義(一)GBLA-聲明一個全局算術(shù)變量,并初始化為0GBLL-聲明一個全局邏輯變量,并初始化為{FALSE}GBLS-聲明一個全局串變量,并初始化為空串“”ARM宏匯編-全局變量定義(二)全局變量,例:GBLAobjectsize ;聲明一個全局算術(shù)變量objectsizeSETA0xff ;賦值SPACEobjectsize ;引用該變量GBLLstatusB ;聲明一個全局邏輯變量statusBSETL{TRUE} ;賦值A(chǔ)RM宏匯編-局部變量定義定義類似全局變量作用范圍為包含該局部變量的宏代碼的一個實例。例:LCLSerrerrSETS“errorno:”ARM宏匯編-變量賦值偽操作SETA偽操作給一個算術(shù)變量賦值SETL偽操作給一個邏輯變量賦值SETS偽操作給一個串變量賦值A(chǔ)RM宏匯編-數(shù)據(jù)定義偽操作ARM宏匯編-MAP及FIELD類似C中結(jié)構(gòu)體:MAP 8,R9 ;內(nèi)存表首地址=8+R9Consta FIELD 4 ;consta長為4字節(jié),相對位置為0Constb FIELD 4 ;constb長為4字節(jié),相對位置為4X FIELD 8 ;X長為8字節(jié),相對位置為8Y FIELD 8 ;Y長為8字節(jié),相對位置為16String FIELD 256 ;string長256字節(jié),相對位置為24ARM宏匯編-SPACEDatastruct SPACE 200 ;分配200字節(jié)的內(nèi)存單元,并將內(nèi)存單元內(nèi)容初始化為0ARM宏匯編-DCBNullstring DCB “Nullstring”,0 ;構(gòu)造一個以NULL結(jié)尾的字符串ARM宏匯編-匯編控制偽操作IF,ELSE及ENDIFWHILE及WENDMACRO及MENDMEXITARM宏匯編-IF,ELSE及ENDIF例:IFVersion=“4.0”… ;指令及偽指令ELSE… ;指令及偽指令ENDIFARM宏匯編-WHILE及WEND例:CountSETA1 ;循環(huán)計數(shù)變量,初識1WHILEcount<=4 ;由count控制循環(huán)次數(shù)CountSETAcount+1 ;count+=1……WENDARM宏匯編-MACRO,MEND及MEXIT(一)語法MACRO{$label}macroname{$p1…}…MENDARM宏匯編-MACRO,MEND及MEXIT(二)例MACRO$labelmac1 $p1,$p2IFcondition1BL$p1MEXITELSEBL$p2ENDIFWENDARM宏匯編-其他偽操作1.AREA:AREA段名屬性,…… AREA用于定義一個代碼段、數(shù)據(jù)段或者特定屬性的段。屬性部分表示該代碼段/數(shù)據(jù)段的相關(guān)屬性,多個屬性可以用“,”分隔。其他偽指令Ⅰ常見屬性如下:
DATA:定義數(shù)據(jù)段。
CODE:定義代碼段。READONLY:表示本段為只讀。READWRITE:表示本段可讀寫。一個匯編程序至少應(yīng)該包含一個段,當(dāng)程序太長時,也可以將程序分為多個代碼段和數(shù)據(jù)段。例如:AREA test,CODE,READONLYAREA||.text||,CODE,READONLY2.
CODE16、CODE32:CODE16/CODE32CODE16偽操作指示編譯器后面的代碼為16位的Thumb指令。CODE32偽操作指示編譯器后面的代碼為32位的ARM指令。如果在匯編源代碼中同時包含Thumb和ARM指令時,可以用“CODE32”通知編譯器其后的指令序列為32位的ARM指令,用“CODE16”偽指令通知編譯器其后的指令序列為16位的Thumb指令。在使用ARM指令和Thumb指令混合編程的代碼里,這兩條偽指令后面的代碼類型是不同的,但它們并不能對處理器進行狀態(tài)的切換。例如:CODE32 ;32位的ARM指令A(yù)REA ||.text||,CODE,READONLY……LDR R0,=0x8500 ;BX R0 ;程序跳轉(zhuǎn),并將處理器切換到Thumb狀態(tài)……CODE16 ;16位的Thumb指令A(yù)DD R3,R3,1
END ;源文件結(jié)束3.
ENTRY:ENTRY用于指定匯編程序的入口。在一個完整的匯編程序中至少要有一個ENTRY,程序中也可以有多個。下面的代碼使用了ENTRY:AREAsubrout,CODE,READONLYENTRY;markfirstinstructionstartMOVr0,#10MOVr1,#3BLdoadd
stopMOVr0,#0x18LDRr1,=0x20026SWI0x123456;ARMsemihostingSWI
doaddADDr0,r0,r1;SubroutinecodeMOVpc,lr;Returnfromsubroutine.END;Markendoffile4.
END:說明:“END”告訴編譯器已經(jīng)到了源程序的結(jié)尾。例如:AREA constdata,DATA,READONLY……END ;結(jié)尾5.
EQU:名稱EQU 表達式[,類型]EQU用于將程序中的數(shù)字常量、標(biāo)號、基于寄存器的值賦予一個等效的名稱,這一點類似于C語言中的#define,可用“*”代替EQU。如果表達式為32位的常量,我們可以指定表達式的數(shù)據(jù)類型,類型域可以有以下三種:CODE16/CODE32/DATA例如:num1 EQU 1234 ;定義num1為1234addr5 EQU str1+0x50 ;d1 EQU 0x2400,CODE32;定義d1的值為0x2400,且該處為32位的ARM指令。6.EXPORT:EXPORT標(biāo)號[,WEAK]EXPORT在程序中聲明一個全局標(biāo)號,其他文件中的代碼可以引用該標(biāo)號。用戶也可以用GLOBAL代替EXPORT。[,WEAK]可選項聲明其他文件有同名的標(biāo)號,則該同名標(biāo)號優(yōu)先于該標(biāo)號被引用。例如:AREA ||.text||,CODE,READONLYmain PROC …… ENDP EXPORTmain ;聲明一個可全局引用的函數(shù)mainEND 7.
IMPORT:IMPORT標(biāo)號[,WEAK]IMPORT告訴編譯器這個標(biāo)號要在當(dāng)前源文件中使用,但標(biāo)號是在其他的源文件中定義的。不管當(dāng)前源文件是否使用過該標(biāo)號,這個標(biāo)號都會加入到當(dāng)前源文件的符號表中。[,WEAK]選項表示如果所有的源文件都沒有找到這個標(biāo)號的定義,編譯器也不會提示錯誤信息。編譯器在多數(shù)情況下將該標(biāo)號置為0,如果這個標(biāo)號被B或BL指令引用,則將B或BL指令替換為NOP操作。例如:AREA mycode,CODE,READONLYIMPORT _printf END8.
EXTERN:EXTERN標(biāo)號[,WEAK]說明:EXTERN告訴編譯器所使用的標(biāo)號要在當(dāng)前源文件中引用,但該標(biāo)號是在其他的源文件中定義的。與IMPORT不同的是,如果當(dāng)前源文件實際上沒有引用該標(biāo)號,該標(biāo)號就不會被加入到當(dāng)前文件的符號表中。[,WEAK]選項意義同IMPORT。例如:AREA ||.text||,CODE,READONLYEXTERN_printf;告訴編譯器當(dāng)前文件要引用標(biāo)號 ;如果找不到,則不提示錯誤END 9.
RN:
名稱 RN表達式
說明:RN用于給一個寄存器定義一個別名,以便程序員記憶該寄存器的功能。其中,名稱為給寄存器定義的別名,表達式為寄存器的編碼。10.
GET/INCLUDE:GET 文件名
說明:GET將一個源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置展開進行匯編處理。INCLUDE和GET作用等效的。我們通常這樣使用這個偽指令:在某源文件中定義一些宏指令,用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,用EQU定義常量的符號名稱,然后用GET/INCLUDE將這個源文件包含到其他的源文件中。11.INCBIN文件名INCBIN將一個數(shù)據(jù)文件或者目標(biāo)文件包含到當(dāng)前的源文件中,編譯時被包含的文件不作任何變動的存放在當(dāng)前文件中,編譯器從后面開始繼續(xù)處理。例如:AREA constdata,DATA,READONLYINCBIN data1.dat INCBIN E:\DATA\data2.bin END
ARM宏匯編-偽指令(二)四條偽指令A(yù)DR-小范圍地址讀取ADRL-中等范圍地址讀取LDR-大范圍地址讀取NOP-空操作ARM宏匯編-偽指令-ADRADR將基于PC的地址值或基于寄存器的地址值讀取到寄存器中。地址值不是字對齊時,取值范圍-255~255;是字對齊時,取值范圍-1020~1020例start MOVR0,#10ADR r4,start ;將start地址賦給r4,此時start地址為PC-0xC,故相當(dāng)于SUBr4,PC,#12ARM宏匯編-偽指令-ADRL當(dāng)?shù)刂分挡皇亲謱R時,其取值范圍為-64KB~64KB;當(dāng)?shù)刂分凳亲謱R時,其取值范圍為-256KB~256KB例Start MOVR0,#10ADRL R4,start+60000 ;將start+60000地址賦給R4ARM宏匯編-偽指令-LDR將一個32位常數(shù)或一個地址值讀取到寄存器中。例LDR R1, =0XFF0 ;MOVR1,0XFF0LDR R1, =0xFFE ;LDR R1, =ADDR1 ;注意等號LDR偽指令如果可用立即數(shù)表達:如:LDRR0,=0X400,則直接翻譯成LDRR0,#0X400如果是大常數(shù),不可用立即數(shù)表達:如:LDRR0,=0X55555555,則翻譯成LDRR0,[PC,#Imm_12]…DCD0X55555555定義此常數(shù),然后從此地址中讀取數(shù)據(jù)ARM宏匯編-Thumb偽指令Thumb偽指令
ADRregister, expr
LDRregister, =[expr|label-expr]NOP:空操作ARM與C語言的混和編程(一)ARM匯編語言與C/C++的混合編程ARM匯編與C/C++的混合編程要遵循ATPCS規(guī)則(ARM-ThumbProcedureCallStandard)混合編程方式嵌入?yún)R編格式:__asm{…}在匯編程序與C/C++的程序間進行變量的互訪;匯編程序與與C/C++程序間的相互調(diào)用。
ARM與C語言的混和編程(二)
IMPORTmainAREAInit,CODE,READONLY ENTRYSTART LDRR1,=0x08000000 STRB,R0,[R1],#1 … BLmainENDvoidmain(){ do_task(); … return;}從匯編跳轉(zhuǎn)到c程序 程序的初始化部分(如外設(shè)等)用匯編語言編寫,然后,執(zhí)行跳轉(zhuǎn)指令,轉(zhuǎn)移到c程序的入口進行執(zhí)行ARM與C語言的混和編程(三)externvoidmystrcpy(char*d,char*r)
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房產(chǎn)贈與合同書
- 飯店員工勞動合同范例
- 2024年離婚協(xié)議書標(biāo)準(zhǔn)格式與撰寫技巧
- 擔(dān)保公司預(yù)付款擔(dān)保合同2024年
- 2024年房屋買賣置換合同范本
- 分期付款(租賃)擔(dān)保協(xié)議書編寫要點
- 電子電路板設(shè)計制作合同
- 建筑安裝工程承包合同履行監(jiān)督
- 2024年賽事服務(wù)合同
- 2023年產(chǎn)品銷售協(xié)議樣式
- 浮點數(shù)運算方法
- YS/T 591-2006變形鋁及鋁合金熱處理
- 第9講:為新中國而奮斗
- GB/T 31883-2015道路車輛牽引連接件、牽引桿孔、牽引座牽引銷、連接鉤及環(huán)形孔機械連接件使用磨損極限
- GB/T 23679-2009集裝箱機械箱封
- GB/T 23505-2017石油天然氣工業(yè)鉆機和修井機
- 公務(wù)員職業(yè)道德與行為規(guī)范課件
- 初中英語-名詞-單復(fù)數(shù)-練習(xí)題-含答案
- 小學(xué)綜合實踐活動教育科學(xué)四年級上冊綜合小主題我們的傳統(tǒng)節(jié)日
- 各國美食英語介紹課件
- 《工業(yè)機器人》說課稿
評論
0/150
提交評論