版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三講ARM指令系統(tǒng)電信學(xué)院本講主要內(nèi)容ARM指令系統(tǒng)尋址方式指令簡(jiǎn)介匯編實(shí)例本講目的概要介紹ARM、Thumb指令集,能夠達(dá)到通過(guò)查找工具書(shū)可以編寫(xiě)簡(jiǎn)單匯編程序的目的。ARM處理器指令集概述(-)ARM處理器指令集為加載/存儲(chǔ)型
ARM處理器指令集分為ARM指令集(32位編碼長(zhǎng)度)和Thumb指令集(16位編碼長(zhǎng)度)。
Thumb指令集是ARM指令集的一個(gè)子集,即所有的Thumb指令均有相對(duì)應(yīng)的ARM指令。
ARM指令集包括:跳轉(zhuǎn)指令數(shù)據(jù)處理指令程序狀態(tài)寄存器處理指令A(yù)RM處理器指令集概述(二)加載/存儲(chǔ)指令協(xié)處理器指令異常產(chǎn)生指令Thumb指令集包括:跳轉(zhuǎn)指令數(shù)據(jù)處理指令加載/存儲(chǔ)指令異常產(chǎn)生指令指令語(yǔ)法格式<opcode> 指令助記符,如ADD{<cond>} 指令執(zhí)行的條件{S} 決定指令的操作是否影響CPSR<Rd> 目標(biāo)寄存器<Rn> 包含第一個(gè)操作數(shù)的寄存器<shifter_operand>第二個(gè)操作數(shù)<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>ARM指令編碼格式指令的條件執(zhí)行條件執(zhí)行幾乎所有的ARM指令都是有條件執(zhí)行,不僅包括常規(guī)的跳轉(zhuǎn)指令,也包括所有其他的指令。普通類(lèi)型的指令集不同,一般情況下,只有跳轉(zhuǎn)指令才會(huì)有條件執(zhí)行。條件是否滿足要根據(jù)CPSR和指令的條件域來(lái)確定;大多數(shù)的Thumb指令均為無(wú)條件執(zhí)行。指令的條件碼(一)指令的條件碼ARM處理器指令的條件域?yàn)?位,ARM狀態(tài)指令的條件域一般為指令編碼的高4位。條件碼共有16種,每種條件碼用2個(gè)字符表示,2個(gè)字符的條件碼可以添加在指令助記符的后面,和指令同時(shí)使用。例如,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)容加(或減)偏移量形成存儲(chǔ)器地址立即數(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基本尋址方式(四)相對(duì)尋址例:BLabel;(PC)+LabelPC多寄存器尋址,一條指令傳遞多個(gè)寄存器值,例STMIAR1,{R2,R3,R4}
;R2[R1]
;R3[R1+4]
;R4[R1+8]基本尋址方式(五)堆棧尋址堆棧是一種按特定順序進(jìn)行存取的存儲(chǔ)區(qū),即“后進(jìn)先出”,堆棧指針指向棧頂。遞增堆棧(Ascending):向高地址方向生長(zhǎng)的堆棧;遞減堆棧(Descending):向低地址方向生長(zhǎng)的堆棧;空堆棧(Empty):棧指針指向下一個(gè)數(shù)據(jù)項(xiàng)放入的空位置;滿堆棧(Full):棧指針指向上一個(gè)壓入堆棧的有效數(shù)據(jù)項(xiàng)。
基本尋址方式(五)ARM共支持4種類(lèi)型的堆棧:
FA(FullAscending):滿遞增堆棧;
FD(FullDescending):滿遞減堆棧;
EA(EmptyAscending):空遞增堆棧;
ED(EmptyDescending):空遞減堆棧;例如(詳解見(jiàn)后面):
STMFDR13, {R0-R12, LR} ;LR[R13-4]
;R12[R13-8]
;……
LDMFDR13, {R0-R12, PC} ;[R13]R0
;[R13+4]R1;……基本尋址方式(六)塊尋址類(lèi)似于堆棧尋址,但堆棧尋址要配合堆棧進(jìn)行,而塊拷貝則應(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符號(hào)含義:
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類(lèi):
數(shù)據(jù)運(yùn)算指令、 前導(dǎo)零計(jì)數(shù)指令、 乘法指令。數(shù)據(jù)運(yùn)算指令(一)主要包括數(shù)據(jù)傳送指令、算術(shù)邏輯運(yùn)算指令和比較測(cè)試指令等。數(shù)據(jù)傳送指令用于在寄存器間進(jìn)行數(shù)據(jù)傳送;算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)與邏輯運(yùn)算,同時(shí)可以選擇更新CPSR中的相應(yīng)條件標(biāo)志位;比較測(cè)試指令不保存運(yùn)算結(jié)果,僅根據(jù)運(yùn)算結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令名指令含義操作ADD相加Rd=Rn+op2SUB相減Rd=Rn-op2RSB反向相減Rd=op2-RnADC帶進(jìn)位加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測(cè)試RnANDop2TEQ測(cè)試相等RnEORop2前導(dǎo)零計(jì)數(shù)CLZ(CountLeadingZeros)CLZ{cond}Rd,Rm計(jì)算寄存器中的前導(dǎo)0(第一個(gè)1以前的0)
源寄存器從最高位開(kāi)始計(jì)算。1個(gè)周期完成 (ARM9E-S/ARM102x)如果沒(méi)有任何一位是1,結(jié)果是32;如果bit31是1,結(jié)果為0。該指令不影響條件標(biāo)志位。0000001011101101...0R0=CLZR1,R00x6R1=1011101101000000...0Rm=MOVR0,R0LSLR1第2操作數(shù)移位操作ASRn 算術(shù)右移,最高位補(bǔ)符號(hào)LSLn 邏輯左移,右補(bǔ)0LSRn 邏輯右移,左補(bǔ)0RORn 循環(huán)右移RRX 帶進(jìn)位的循環(huán)右移1位移位操作DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(無(wú)符號(hào)數(shù))乘2除2,并保留符號(hào)位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(無(wú)符號(hào)數(shù))除2位循環(huán)
DestinationRRX:RotateRightExtended位輪換,從CF到MSB都參與操作CF乘法指令A(yù)RM處理器的普通乘法指令共6條:32位的運(yùn)算結(jié)果64位運(yùn)算結(jié)果乘法類(lèi)指令的所有操作數(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é)果的長(zhǎng)乘法:MUL{cond}{S}RdH,RdL,Rm,RsMul為下列符號(hào)之一:MUL、MLA、UMULL、UMLAL、SMULL、SMLAL。指令名指令含義操作MUL乘法Rd=Rm*RsMLA乘加Rd=Rm*Rs+RnUMULL無(wú)符號(hào)數(shù)乘法RdH:RdL=Rm*RsUMLAL無(wú)符號(hào)數(shù)乘加RdH:RdL+=Rm*RsSMULL有符號(hào)數(shù)乘RdH:RdL=Rm*RsSMLAL有符號(hào)數(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ù)加載/存儲(chǔ)指令(一)加載/存儲(chǔ)指令(load/store)加載/存儲(chǔ)指令完成寄存器與存儲(chǔ)器之間的數(shù)據(jù)傳送;加載指令將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器;存儲(chǔ)指令則將寄存器中的數(shù)據(jù)傳送到存儲(chǔ)器。存儲(chǔ)器地址由基址寄存器的內(nèi)容和偏移量來(lái)確定,不支持絕對(duì)地址尋址方式。例如:LDR R1, [R0] ;[R0]R1 STR R1, [R0,#-4] ;R1[R0-4]加載/存儲(chǔ)指令(二)偏移量具有如下3種形式:無(wú)符號(hào)立即數(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加載/存儲(chǔ)指令(三)存儲(chǔ)器尋址支持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
加載/存儲(chǔ)指令(四)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更新
基址寄存器通過(guò)
STRr0,[r1,#12]!來(lái)自動(dòng)更新基址寄存器PreorPostIndexed尋址
Pre-indexed:STRr0,[r1,#12]
Post-indexed:STRr0,[r1],#12單字/無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令(略)格式:LDR|STR{cond}{B}{T} Rd, 尋址方式 B:指無(wú)符號(hào)字節(jié)數(shù)據(jù)傳送,僅傳送最低有效位; T:強(qiáng)制處理器為用戶模式,用于特權(quán)模式下使用用戶寄存器;不能與前變址偏移同時(shí)
例如
LDRBR5,[R9];傳送最低有效字節(jié),其他清零(大端和小端不同結(jié)果) STRTR0,[R1,R2]半字/有符號(hào)字節(jié)加載/存儲(chǔ)指令(略)LDR|STR{cond}H|SH|SBRd, 尋址方式;H:無(wú)符號(hào)半字;SH:有符號(hào)半字;(僅LDR)
SB:有符號(hào)字節(jié);(僅LDR)例如 LDRHR8,[R3,#2] ;[R3+2]->R8,讀取低16位,其他清零 LDRSBR4,[R10,#0xC1] ;[R10+0xC1]->R4,讀取字節(jié),有符號(hào)擴(kuò)展到32位(用符號(hào)填充) LDRSHR1,[R0,#2]! ;[R0+2]->R1,R0=R0+2;讀取半字,有符號(hào)擴(kuò)展到32位 其中:偏移量不支持通用寄存器的移位的格式;半字傳送的地址必須是偶數(shù);不能將半字或字節(jié)讀取到R15;雙字加載/存儲(chǔ)指令(略)該指令完成相鄰寄存器與相鄰存儲(chǔ)單元之間的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ù);這里無(wú)符號(hào)立即數(shù)的范圍在256以?xún)?nèi);偏移量不支持通用寄存器的移位的格式;多寄存器加載/存儲(chǔ)指令(一)該指令完成多個(gè)通用寄存器與存儲(chǔ)單元之間的數(shù)據(jù)傳送。LDM|STM{cond}尋址方式Rn{!},通用寄存器組{^}符號(hào)的含義:尋址方式為:IA、IB、DA、DB、FD、ED、FA、EA;Rn:基址寄存器,不允許為R15(PC);?。褐噶顖?zhí)行后,刷新基址寄存器Rn“^”:當(dāng)寄存器列表包含PC且為L(zhǎng)DM指令時(shí),同時(shí)將SPSR拷貝到CPSR,用于異常返回;當(dāng)寄存器列表不包含PC,指示指令中所有的寄存器為用戶模式下的寄存器LDM/STM操作語(yǔ)法:<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)存儲(chǔ)器塊拷貝可選項(xiàng)“!
”將導(dǎo)致LDM/STM
指令去自動(dòng)更新基址寄存器后綴為IA,IB時(shí),加上4乘以用于傳送的寄存器的數(shù)目的值后綴為DA,DB時(shí),減去4乘以用于傳送的寄存器的數(shù)目的值示例:;r12指向源數(shù)據(jù)起始地址;r14指向源數(shù)據(jù)尾地址;r13指向目的數(shù)據(jù)起始地址loop LDMIA r12!,{r0-r11} ;裝載48bytes STMIA r13!,{r0-r11} ;存儲(chǔ)them CMP r12,r14 ;checkfortheend BNE loop ;loopuntildone此循環(huán)傳送48bytes占用了31周期時(shí)鐘為33MHz時(shí)傳輸速率超過(guò)50Mbytes/sec存儲(chǔ)器增加r13r14r12多寄存器加載/存儲(chǔ)指令(二)例如:STMFDR13!,{R0,R4-R7,LR};寄存器進(jìn)棧LDMFDR13!,{R0,R4-R7,PC};寄存器返回注:基址寄存器可以出現(xiàn)在寄存器列表中,但要避免和寫(xiě)回操作“!”同時(shí)使用。R15可以出現(xiàn)在LDM指令的寄存器列表中;但要避免出現(xiàn)在STM指令的寄存器列表中,此時(shí),可以使用R14(用以保存返回地址)。
LDMFDsp!,{r4-r7,pc}100FF1234AOBE80341010123484209753r41r514544r60r712pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆棧r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存儲(chǔ)器頂SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆棧操作通過(guò)塊傳送指令來(lái)完成:STMFD (Push) 塊存儲(chǔ)-FullDescendingstack[STMDB]LDMFD
(Pop) 塊裝載-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}SWAP指令(一)(略)該指令在寄存器和存儲(chǔ)器之間進(jìn)行單字或無(wú)符號(hào)字節(jié)數(shù)據(jù)的交換
SWP{cond}{B}Rd,Rm,[Rn]符號(hào)的含義:Rd:存儲(chǔ)器的值加載到該寄存器;Rm:該寄存器的值存儲(chǔ)到存儲(chǔ)器;Rn:指向存儲(chǔ)器地址的存儲(chǔ)器;例如SWPR1,R2,[R3];[R3]->R1且R2->[R3];R15不能用于該指令的任何寄存器
SWAP指令(二)(略)例如:信號(hào)量的應(yīng)用
I2C_SEMEQU0x08000000 ;定義信號(hào)量
…I2C_SEM_WAIT LDRR0,=I2C_SEM ; SWPR1,R1,[R0] ;讀信號(hào)量
CMPR1,#0 ;判斷是否有信號(hào)
BEQI2C_SEM_WAIT ;沒(méi)有則等待
…PLD指令(Cache預(yù)加載)(略)該指令指示存儲(chǔ)系統(tǒng)從指定的存儲(chǔ)器地址預(yù)先加載到Cache,從而加速存儲(chǔ)器的訪問(wèn)。
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é)處理器寄存器與存儲(chǔ)器間的數(shù)據(jù)傳送;協(xié)處理器編號(hào)分配15用于系統(tǒng)控制14測(cè)試控制器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é)處理器寄存器與存儲(chǔ)器間的數(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:指明長(zhǎng)整數(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)用的類(lèi)型。BKPT{cond}16位數(shù)
BKPT產(chǎn)生預(yù)取中止異常,可用于程序的調(diào)試。例如:SWI0x123456; BKPT0Thumb指令集(一)Thumb指令集的特點(diǎn)16位指令長(zhǎng)度(適于16位的存儲(chǔ)器,成本低)
ARM指令集的一個(gè)子集數(shù)據(jù)處理指令的操作數(shù)和指令尋址地址仍是32位的較高的代碼密度和較低的功耗
執(zhí)行效率相對(duì)ARM較低除條件跳轉(zhuǎn)指令外均為無(wú)條件執(zhí)行Thumb指令集(二)Thumb指令集包括:跳轉(zhuǎn)指令;數(shù)據(jù)處理指令;單寄存器加載/存儲(chǔ)指令;多寄存器加載/存儲(chǔ)指令;異常產(chǎn)生指令。Thumb指令集(三)Thumb指令訪問(wèn)的寄存器通用寄存器R0~R7R13(SP)、R14(LR)、R15(PC)。可以有限制地訪問(wèn)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)指令;進(jì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時(shí),R2=R3+R4循環(huán)MOVR0,#loopcountLoop….SUBSR0,R0,#1BNEloop飽和運(yùn)算(一)0x7FFFFFFF+1將導(dǎo)致正數(shù)變?yōu)樨?fù)數(shù)0x80000000–1將導(dǎo)致負(fù)數(shù)變?yōu)檎龜?shù)飽和運(yùn)算指令將識(shí)別上述事件,從而調(diào)整其結(jié)果為最大正數(shù)或最小負(fù)數(shù)。(補(bǔ)碼:原碼取反加1)0x00x7FFFFFFF0x80000000-ve+ve-最大正數(shù)-最小負(fù)數(shù)飽和運(yùn)算(二)對(duì)于無(wú)符號(hào)飽和運(yùn)算,如果整個(gè)結(jié)果將是負(fù)值,那么返回的結(jié)果是0ARM宏匯編與編程基礎(chǔ)ARM宏匯編偽操作對(duì)源程序進(jìn)行匯編期間處理,而不是直接由計(jì)算機(jī)執(zhí)行的指令偽指令(宏指令)并非真正的指令,而是一段獨(dú)立的程序代碼;在源程序被匯編時(shí),每個(gè)宏被展開(kāi),用宏定義體取代宏指令。也是通過(guò)偽操作定義的。ARM宏匯編-寄存器定義ARM宏匯編-狀態(tài)、浮點(diǎn)、協(xié)處理器定義定義的程序狀態(tài)寄存器名cpsr和CPSRspsr和SPSR定義的浮點(diǎn)寄存器名f0-f7F0-F7定義的協(xié)處理器名p0-p15c0-c15ARM宏匯編-內(nèi)置變量定義ARM宏匯編-內(nèi)置變量舉例內(nèi)置變量不能用SETA、SETL、SETS等指示詞來(lái)設(shè)置,只能用字符或條件表達(dá)式來(lái)設(shè)置,例IF{ARCHITECTURE}=“4T”……ARM宏匯編-符號(hào)定義偽操作ARM宏匯編-全局變量定義(一)GBLA-聲明一個(gè)全局算術(shù)變量,并初始化為0GBLL-聲明一個(gè)全局邏輯變量,并初始化為{FALSE}GBLS-聲明一個(gè)全局串變量,并初始化為空串“”ARM宏匯編-全局變量定義(二)全局變量,例:GBLAobjectsize ;聲明一個(gè)全局算術(shù)變量objectsizeSETA0xff ;賦值SPACEobjectsize ;引用該變量GBLLstatusB ;聲明一個(gè)全局邏輯變量statusBSETL{TRUE} ;賦值A(chǔ)RM宏匯編-局部變量定義定義類(lèi)似全局變量作用范圍為包含該局部變量的宏代碼的一個(gè)實(shí)例。例:LCLSerrerrSETS“errorno:”ARM宏匯編-變量賦值偽操作SETA偽操作給一個(gè)算術(shù)變量賦值SETL偽操作給一個(gè)邏輯變量賦值SETS偽操作給一個(gè)串變量賦值A(chǔ)RM宏匯編-數(shù)據(jù)定義偽操作ARM宏匯編-MAP及FIELD類(lèi)似C中結(jié)構(gòu)體:MAP 8,R9 ;內(nèi)存表首地址=8+R9Consta FIELD 4 ;consta長(zhǎng)為4字節(jié),相對(duì)位置為0Constb FIELD 4 ;constb長(zhǎng)為4字節(jié),相對(duì)位置為4X FIELD 8 ;X長(zhǎng)為8字節(jié),相對(duì)位置為8Y FIELD 8 ;Y長(zhǎng)為8字節(jié),相對(duì)位置為16String FIELD 256 ;string長(zhǎng)256字節(jié),相對(duì)位置為24ARM宏匯編-SPACEDatastruct SPACE 200 ;分配200字節(jié)的內(nèi)存單元,并將內(nèi)存單元內(nèi)容初始化為0ARM宏匯編-DCBNullstring DCB “Nullstring”,0 ;構(gòu)造一個(gè)以NULL結(jié)尾的字符串ARM宏匯編-匯編控制偽操作IF,ELSE及ENDIFWHILE及WENDMACRO及MENDMEXITARM宏匯編-IF,ELSE及ENDIF例:IFVersion=“4.0”… ;指令及偽指令ELSE… ;指令及偽指令ENDIFARM宏匯編-WHILE及WEND例:CountSETA1 ;循環(huán)計(jì)數(shù)變量,初識(shí)1WHILEcount<=4 ;由count控制循環(huán)次數(shù)CountSETAcount+1 ;count+=1……WENDARM宏匯編-MACRO,MEND及MEXIT(一)語(yǔ)法MACRO{$label}macroname{$p1…}…MENDARM宏匯編-MACRO,MEND及MEXIT(二)例MACRO$labelmac1 $p1,$p2IFcondition1BL$p1MEXITELSEBL$p2ENDIFWENDARM宏匯編-其他偽操作1.AREA:AREA段名屬性,…… AREA用于定義一個(gè)代碼段、數(shù)據(jù)段或者特定屬性的段。屬性部分表示該代碼段/數(shù)據(jù)段的相關(guān)屬性,多個(gè)屬性可以用“,”分隔。其他偽指令Ⅰ常見(jiàn)屬性如下:
DATA:定義數(shù)據(jù)段。
CODE:定義代碼段。READONLY:表示本段為只讀。READWRITE:表示本段可讀寫(xiě)。一個(gè)匯編程序至少應(yīng)該包含一個(gè)段,當(dāng)程序太長(zhǎng)時(shí),也可以將程序分為多個(gè)代碼段和數(shù)據(jù)段。例如:AREA test,CODE,READONLYAREA||.text||,CODE,READONLY2.
CODE16、CODE32:CODE16/CODE32CODE16偽操作指示編譯器后面的代碼為16位的Thumb指令。CODE32偽操作指示編譯器后面的代碼為32位的ARM指令。如果在匯編源代碼中同時(shí)包含Thumb和ARM指令時(shí),可以用“CODE32”通知編譯器其后的指令序列為32位的ARM指令,用“CODE16”偽指令通知編譯器其后的指令序列為16位的Thumb指令。在使用ARM指令和Thumb指令混合編程的代碼里,這兩條偽指令后面的代碼類(lèi)型是不同的,但它們并不能對(duì)處理器進(jìn)行狀態(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用于指定匯編程序的入口。在一個(gè)完整的匯編程序中至少要有一個(gè)ENTRY,程序中也可以有多個(gè)。下面的代碼使用了ENTRY:AREAsubrout,CODE,READONLYENTRY;markfirstinstructionstartMOVr0,#10MOVr1,#3BLdoadd
stopMOVr0,#0x18LDRr1,=0x20026SWI0x123456;ARMsemihostingSWI
doaddADDr0,r0,r1;SubroutinecodeMOVpc,lr;Returnfromsubroutine.END;Markendoffile4.
END:說(shuō)明:“END”告訴編譯器已經(jīng)到了源程序的結(jié)尾。例如:AREA constdata,DATA,READONLY……END ;結(jié)尾5.
EQU:名稱(chēng)EQU 表達(dá)式[,類(lèi)型]EQU用于將程序中的數(shù)字常量、標(biāo)號(hào)、基于寄存器的值賦予一個(gè)等效的名稱(chēng),這一點(diǎn)類(lèi)似于C語(yǔ)言中的#define,可用“*”代替EQU。如果表達(dá)式為32位的常量,我們可以指定表達(dá)式的數(shù)據(jù)類(lèi)型,類(lèi)型域可以有以下三種:CODE16/CODE32/DATA例如:num1 EQU 1234 ;定義num1為1234addr5 EQU str1+0x50 ;d1 EQU 0x2400,CODE32;定義d1的值為0x2400,且該處為32位的ARM指令。6.EXPORT:EXPORT標(biāo)號(hào)[,WEAK]EXPORT在程序中聲明一個(gè)全局標(biāo)號(hào),其他文件中的代碼可以引用該標(biāo)號(hào)。用戶也可以用GLOBAL代替EXPORT。[,WEAK]可選項(xiàng)聲明其他文件有同名的標(biāo)號(hào),則該同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。例如:AREA ||.text||,CODE,READONLYmain PROC …… ENDP EXPORTmain ;聲明一個(gè)可全局引用的函數(shù)mainEND 7.
IMPORT:IMPORT標(biāo)號(hào)[,WEAK]IMPORT告訴編譯器這個(gè)標(biāo)號(hào)要在當(dāng)前源文件中使用,但標(biāo)號(hào)是在其他的源文件中定義的。不管當(dāng)前源文件是否使用過(guò)該標(biāo)號(hào),這個(gè)標(biāo)號(hào)都會(huì)加入到當(dāng)前源文件的符號(hào)表中。[,WEAK]選項(xiàng)表示如果所有的源文件都沒(méi)有找到這個(gè)標(biāo)號(hào)的定義,編譯器也不會(huì)提示錯(cuò)誤信息。編譯器在多數(shù)情況下將該標(biāo)號(hào)置為0,如果這個(gè)標(biāo)號(hào)被B或BL指令引用,則將B或BL指令替換為NOP操作。例如:AREA mycode,CODE,READONLYIMPORT _printf END8.
EXTERN:EXTERN標(biāo)號(hào)[,WEAK]說(shuō)明:EXTERN告訴編譯器所使用的標(biāo)號(hào)要在當(dāng)前源文件中引用,但該標(biāo)號(hào)是在其他的源文件中定義的。與IMPORT不同的是,如果當(dāng)前源文件實(shí)際上沒(méi)有引用該標(biāo)號(hào),該標(biāo)號(hào)就不會(huì)被加入到當(dāng)前文件的符號(hào)表中。[,WEAK]選項(xiàng)意義同IMPORT。例如:AREA ||.text||,CODE,READONLYEXTERN_printf;告訴編譯器當(dāng)前文件要引用標(biāo)號(hào) ;如果找不到,則不提示錯(cuò)誤END 9.
RN:
名稱(chēng) RN表達(dá)式
說(shuō)明:RN用于給一個(gè)寄存器定義一個(gè)別名,以便程序員記憶該寄存器的功能。其中,名稱(chēng)為給寄存器定義的別名,表達(dá)式為寄存器的編碼。10.
GET/INCLUDE:GET 文件名
說(shuō)明:GET將一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置展開(kāi)進(jìn)行匯編處理。INCLUDE和GET作用等效的。我們通常這樣使用這個(gè)偽指令:在某源文件中定義一些宏指令,用MAP和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類(lèi)型,用EQU定義常量的符號(hào)名稱(chēng),然后用GET/INCLUDE將這個(gè)源文件包含到其他的源文件中。11.INCBIN文件名INCBIN將一個(gè)數(shù)據(jù)文件或者目標(biāo)文件包含到當(dāng)前的源文件中,編譯時(shí)被包含的文件不作任何變動(dòng)的存放在當(dāng)前文件中,編譯器從后面開(kāi)始繼續(xù)處理。例如:AREA constdata,DATA,READONLYINCBIN data1.dat INCBIN E:\DATA\data2.bin END
ARM宏匯編-偽指令(二)四條偽指令A(yù)DR-小范圍地址讀取ADRL-中等范圍地址讀取LDR-大范圍地址讀取NOP-空操作ARM宏匯編-偽指令-ADRADR將基于PC的地址值或基于寄存器的地址值讀取到寄存器中。地址值不是字對(duì)齊時(shí),取值范圍-255~255;是字對(duì)齊時(shí),取值范圍-1020~1020例start MOVR0,#10ADR r4,start ;將start地址賦給r4,此時(shí)start地址為PC-0xC,故相當(dāng)于SUBr4,PC,#12ARM宏匯編-偽指令-ADRL當(dāng)?shù)刂分挡皇亲謱?duì)齊時(shí),其取值范圍為-64KB~64KB;當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),其取值范圍為-256KB~256KB例Start MOVR0,#10ADRL R4,start+60000 ;將start+60000地址賦給R4ARM宏匯編-偽指令-LDR將一個(gè)32位常數(shù)或一個(gè)地址值讀取到寄存器中。例LDR R1, =0XFF0 ;MOVR1,0XFF0LDR R1, =0xFFE ;LDR R1, =ADDR1 ;注意等號(hào)LDR偽指令如果可用立即數(shù)表達(dá):如:LDRR0,=0X400,則直接翻譯成LDRR0,#0X400如果是大常數(shù),不可用立即數(shù)表達(dá):如:LDRR0,=0X55555555,則翻譯成LDRR0,[PC,#Imm_12]…DCD0X55555555定義此常數(shù),然后從此地址中讀取數(shù)據(jù)ARM宏匯編-Thumb偽指令Thumb偽指令
ADRregister, expr
LDRregister, =[expr|label-expr]NOP:空操作ARM與C語(yǔ)言的混和編程(一)ARM匯編語(yǔ)言與C/C++的混合編程ARM匯編與C/C++的混合編程要遵循ATPCS規(guī)則(ARM-ThumbProcedureCallStandard)混合編程方式嵌入?yún)R編格式:__asm{…}在匯編程序與C/C++的程序間進(jìn)行變量的互訪;匯編程序與與C/C++程序間的相互調(diào)用。
ARM與C語(yǔ)言的混和編程(二)
IMPORTmainAREAInit,CODE,READONLY ENTRYSTART LDRR1,=0x08000000 STRB,R0,[R1],#1 … BLmainENDvoidmain(){ do_task(); … return;}從匯編跳轉(zhuǎn)到c程序 程序的初始化部分(如外設(shè)等)用匯編語(yǔ)言編寫(xiě),然后,執(zhí)行跳轉(zhuǎn)指令,轉(zhuǎn)移到c程序的入口進(jìn)行執(zhí)行ARM與C語(yǔ)言的混和編程(三)externvoidmystrcpy(char*d,char*r)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年中國(guó)商務(wù)型數(shù)碼鑒偽點(diǎn)鈔機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)半合成濃縮液市場(chǎng)調(diào)查研究報(bào)告
- 2025至2030年中國(guó)高級(jí)防塵口罩行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 燃?xì)廨斉湔n程設(shè)計(jì)問(wèn)題
- 物流系統(tǒng)工程課程設(shè)計(jì)
- 射孔彈殼體課程設(shè)計(jì)
- 民族服飾主題課程設(shè)計(jì)
- 紅外防盜報(bào)警器課程設(shè)計(jì)
- 2024年電力工程施工人員雇傭合同
- 2025至2030年中國(guó)多官能氮丙啶交聯(lián)劑行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- GB 4806.7-2023食品安全國(guó)家標(biāo)準(zhǔn)食品接觸用塑料材料及制品
- 論文《后疫情時(shí)代信息技術(shù)與幼兒園教育深度融合的策略研究》
- 2023-2024學(xué)年江西省南昌市數(shù)學(xué)六年級(jí)第一學(xué)期期末復(fù)習(xí)檢測(cè)模擬試題含答案
- 工程造價(jià)審計(jì)投標(biāo)方案
- 辦公樓裝修環(huán)境與對(duì)策分析
- 《web前端技術(shù)》課程標(biāo)準(zhǔn)
- 醫(yī)院不擔(dān)當(dāng)、不作為問(wèn)題專(zhuān)項(xiàng)治理實(shí)施方案
- 體外診斷試劑盒風(fēng)險(xiǎn)分析報(bào)告
- -2023廣東高考英語(yǔ)聽(tīng)說(shuō)考試三問(wèn)整理
- 9高考語(yǔ)文透析一題·詩(shī)歌鑒賞(手法技巧)《柳梢青 送盧梅坡 》
- 妊娠期肝內(nèi)膽汁淤積癥教學(xué)課件
評(píng)論
0/150
提交評(píng)論