第3章 ARM微處理器的指令系統(tǒng)4-ARM指令應(yīng)用舉例_第1頁
第3章 ARM微處理器的指令系統(tǒng)4-ARM指令應(yīng)用舉例_第2頁
第3章 ARM微處理器的指令系統(tǒng)4-ARM指令應(yīng)用舉例_第3頁
第3章 ARM微處理器的指令系統(tǒng)4-ARM指令應(yīng)用舉例_第4頁
第3章 ARM微處理器的指令系統(tǒng)4-ARM指令應(yīng)用舉例_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3.5

基本ARM指令的應(yīng)用算術(shù)邏輯運算指令的應(yīng)用跳轉(zhuǎn)指令的應(yīng)用Load/store指令的應(yīng)用批量load/store指令的應(yīng)用信號量指令的應(yīng)用與系統(tǒng)相關(guān)的一些指令的應(yīng)用1AssembleLanguageofARM3.5.1算術(shù)邏輯運算指令的應(yīng)用1.位操作指令應(yīng)用將r2中的高8位數(shù)據(jù)傳送到r3的低8位中MOVR0,R2,LSR#24ORRR3,R0,R3,LSL#8MOVR0,R2,ROR#24MOVR3,#0/BICR3,R3,#0xFFORRR3,R0,R3OR2AssembleLanguageofARM2.實現(xiàn)乘法的指令段MOVR0,R0,LSL#1 ;2*R0ADDR0,R0,R0,LSL#1 ;3*R0RSBR0,R1,R0,LSL#2 ;4*R0-R1MOVR0,R0,LSL#n ;2n*R0ADDR0,R0,R0,LSL#n ;(2n+1)*R0RSBR0,R0,R0,LSL#n ;(2n-1)*R0ARM指令的特色:兩個操作在一條指令中完成。3AssembleLanguageofARM3.64位數(shù)據(jù)運算R0,R1存放64位數(shù)據(jù)的低32位和高32位;R2,R3存放64位數(shù)據(jù)的低32位和高32位:ADDSR0,R0,R2ADCR1,R1,R3 ;64位加法SUBSR0,R0,R2SBCR1,R1,R3 ;64位減法CMPR1,R3CMPEQR0,R2 ;64位數(shù)據(jù)比較注意:進(jìn)位標(biāo)志C在

CPSR中。4AssembleLanguageofARM4.內(nèi)存中數(shù)據(jù)存儲方式的轉(zhuǎn)換bigendian littleendianR0=ABCD R0=DCBAEORR1,R0,R0,ROR#16 ;R1=A^C,B^D,C^A,D^BBICR1,R1,#0xFF0000 ;R1=A^C,0,C^A,D^BMOVR0,R0,ROR#8 ;R0=D,A,B,CEORR0,R0,R1,LSR#8 ;LSR:0,A^C,0,C^A ;R0=D,C,B,AMOVR2,#0xFF ;R2=0xFFORRR2,R2,#0xFF0000 ;R2=0x00FF00FFANDR1,R2,R0 ;R1=0B0DANDR0,R2,R0,ROR#24 ;R0=0C0AORRR0,R0,R1,ROR#8 ;R0=DCBA5AssembleLanguageofARM3.5.2跳轉(zhuǎn)指令的應(yīng)用1.子程序調(diào)用BL指令在指令跳轉(zhuǎn)操作的同時保存當(dāng)前PC寄存器值,用于從被調(diào)用的子程序中返回。

;…… BLfunction_name SUBR2,R1,R0 ;……function_name ;…… MOVPC,LR當(dāng)前PC值是多少?注意:B與BL指令的區(qū)別。6AssembleLanguageofARM2.條件執(zhí)行-最大公約數(shù)7AssembleLanguageofARM最大公約數(shù)C語言代碼:int

gcd(inta,intb){while(a!=b) if(a>b) a=a-b; else b=b-a;returna;}8AssembleLanguageofARM最大公約數(shù)ARM匯編代碼:gcd

cmpr0,r1 ;reachedtheend?

beqstop

bltless ;ifr0>r1 subr0,r0,r1 ;subtractr1fromr0 bgcdless subr1,r1,r0 ;subtractr0fromr1 bgcdstop ;……9AssembleLanguageofARM最大公約數(shù)ARM匯編代碼(條件執(zhí)行):代碼執(zhí)行前r0中存放a,r1中存放b;代碼執(zhí)行后r0中存放a和b的最大公約數(shù):gcd CMPR0,R1 SUBGTR0,R0,R1 SUBLTR1,R1,R0 BNEgcd MOVPC,LRgcd

cmpr0,r1

beqstop

bltless subr0,r0,r1 bgcdless subr1,r1,r0 bgcdstop ;……10AssembleLanguageofARM3.條件判斷語句(C語言代碼)

if(a==0||b==1) c=d+e;11AssembleLanguageofARM代碼執(zhí)行前r0中存放a,r1中存放b;代碼執(zhí)行后r2中存放d和e的和:

CMPR0,#0 CMPNER1,#1 ADDEQR2,R3,R4注意:兩個條件按順序進(jìn)行判斷,如果第一個條件不成立,則后面的條件無需進(jìn)行判斷。12AssembleLanguageofARM4.循環(huán)語句對于一個for或while循環(huán):

MOVR0,#loopcount;初始化計數(shù)器loop ;…… SUBSR0,R0,#1 ;計數(shù)器的更新及CPSR的更新

BNEloop ;……注意:此時SUB指令必需帶后綴S。13AssembleLanguageofARM5.多路分支程序語句代碼根據(jù)maxindex的不同值跳轉(zhuǎn)不同的代碼段,這里要求各目標(biāo)代碼段的大小都為2RoutineSizeLog2:

CMPR0,#maxindex ;R0中保存了跳轉(zhuǎn)的索引值

ADDLOPC,PC,R0,LSL#RoutineSizeLog2 BIndexOutofRange …… Index0Handler ;索引值為0時對應(yīng)的代碼段

…… Index1Handler ….. Index2Handler ……

IndexOutofRange ……14AssembleLanguageofARM3.5.3load/store指令的應(yīng)用1.鏈表操作在鏈表中搜索與某一個數(shù)據(jù)相等的元素。鏈表中的每個元素包括兩個字,第一個字中包含一個字節(jié)數(shù)據(jù);第二個字中包含指向下一個鏈表元素的指令,當(dāng)這個指針為0時表示鏈表結(jié)束。llsearch CMPR0,#0 ;R0是nextpointer LDRNEBR2,[R0] CMPNER1,R2 ;R1存放要搜索的數(shù)據(jù)

LDRNER0,[R0,#4] BNEllsearch MOVPC,LR15AssembleLanguageofARM2.簡單的串比較比較兩個串的大?。篟0指向第一個串,R1指向第二個串。strcmp LDRBR2,[R0],#1 ;注意字符尋址的偏移量

LDRBR3,[R1],#1 CMPR2,#0 CMPNER3,#0 BEQreturn CMPR2,R3 BEQstrcmpreturn SUBR0,R2,R3 ;比較兩字符的大小

MOVPC,LR16AssembleLanguageofARM3.長跳轉(zhuǎn)通過直接向PC寄存器中存取數(shù)據(jù),程序可以實現(xiàn)在4GB的地址空間的任意跳轉(zhuǎn),這種跳轉(zhuǎn)叫做長跳轉(zhuǎn)。

ADDLR,PC,#4

;保存返回地址,指向PC+12處,即return_here LDRPC,[PC,#-4] ;內(nèi)存尋址指向DCD DCDfunctionreturn_here ADD返回地址如何計算?17AssembleLanguageofARM4.多路跳轉(zhuǎn)(比較前面的5.多路分支程序語句)通過函數(shù)地址表實現(xiàn)多路轉(zhuǎn)移,其中maxendex為跳轉(zhuǎn)的最大索引號,R0中為跳轉(zhuǎn)的索引號。

CMPR0,#maxindex LDRLOPC,[PC,R0,LSL#2] BIndexOutofRange DCDHandler0 ;子程序0的入口地址

DCDHandler1 DCDHandler2 ;……注意:這里子程序沒有限定相同的大小。18AssembleLanguageofARM3.5.4批量load/store指令的應(yīng)用1.簡單的塊復(fù)制一次將48個字?jǐn)?shù)據(jù)從R12作為首地址的一段連續(xù)的內(nèi)存單元復(fù)制到R13作為首地址的一段連續(xù)的內(nèi)存單元。R14為源數(shù)據(jù)區(qū)末地址。loop LDMIAR12!,{R0-R11} ;每次12個字

STMIAR13!,{R0-R11} CMPR12,R14 ;判斷是否結(jié)束

BLOloop思考:當(dāng)數(shù)據(jù)塊大小不是一次搬移數(shù)據(jù)的倍數(shù)時,程序如何設(shè)計?19AssembleLanguageofARMLDM/STM應(yīng)用實例-上機(jī)編程實踐SOURCEDCD1,2,3,4,5,6,7,8,9,10DCD11,12,13,14,15,16,17,18,19,20DCD21,22,23,24,25,26,27,28,29,30DCD31,32,33,34,35,36,37,38,39,40DCD41,42,43,44,45,46,47,48

DESTDCD020AssembleLanguageofARM2.子程序進(jìn)入和退出時數(shù)據(jù)的保存和恢復(fù)在調(diào)用子程序時,通常利用寄存器r0-r3傳遞參數(shù)和返回結(jié)果,這幾個參數(shù)由子程序的調(diào)用者來保存,其他的子程序?qū)⒁玫降募拇嫫髟谧映绦蛉肟谔幈4?,在子程序返回前恢?fù)這些寄存器。function STMFDR13!,{R4-R12,R14} ;函數(shù)入口

;…… ;functionbody ;…… LDMFDR13!,{R4-R12,PC} ;函數(shù)出口21AssembleLanguageofARM3.5.5信號量指令的應(yīng)用信號量用于實現(xiàn)對臨界區(qū)數(shù)據(jù)訪問的同步。

MVNR2,#0 ;set-1spinin SWPR3,R2,[R0] ;讀取信號到R3,

;同時將信號設(shè)置成-1. CMNR3,#1 ;判斷R3是否為-1 ;…… BEQspinin ;其它進(jìn)程訪問,繼續(xù)查詢

CMPR3,#0 ;不為0時表示其它進(jìn)程擁有信號量 ;…… STRNER3,[R0] ;恢復(fù)信號量的值 ;…… BNEspinin ;重新嘗試獲取信號量

STRR1,[R0] ;……22AssembleLanguageofARM3.5.6與系統(tǒng)相關(guān)的一些指令的應(yīng)用1.SWI中斷處理程序SWI指令使處理器切換到特權(quán)模式,在特權(quán)模式下請求特定的系統(tǒng)服務(wù)(由操作系統(tǒng)提供)。SWI指令執(zhí)行時通常完成下面的工作:

R14_svc=SWI指令的下面一條指令的地址

SPSR_svc=CPSR CPSR[4:0]=0b10011 ;supervisormode CPSR[5]=0 ;T CPSR[6]=1 ;F CPSR[7]=1 ;I ifhighvectorsconfiguredthen PC=0xFFFF0008 else PC=0x0000000823AssembleLanguageofARM當(dāng)程序執(zhí)行到SWI指令時,程序跳轉(zhuǎn)到0x00000008處執(zhí)行,由于該處是一條跳轉(zhuǎn)指令,程序接著跳轉(zhuǎn)到下面中斷服務(wù)程序開始處執(zhí)行。

SWIHandler STMFDsp!,{R0-R3

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論