arm指令集特點尋址方式和指令分類詳解習(xí)題市公開課一等獎省賽課獲獎?wù)n件_第1頁
arm指令集特點尋址方式和指令分類詳解習(xí)題市公開課一等獎省賽課獲獎?wù)n件_第2頁
arm指令集特點尋址方式和指令分類詳解習(xí)題市公開課一等獎省賽課獲獎?wù)n件_第3頁
arm指令集特點尋址方式和指令分類詳解習(xí)題市公開課一等獎省賽課獲獎?wù)n件_第4頁
arm指令集特點尋址方式和指令分類詳解習(xí)題市公開課一等獎省賽課獲獎?wù)n件_第5頁
已閱讀5頁,還剩83頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《嵌入式系統(tǒng)原理與開發(fā)》

第9講南京大學(xué)計算機(jī)系俞建新主講春季年6月28日1南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第1頁第5章ARM指令集和匯編語言程序本章主要介紹以下內(nèi)容:ARM指令集基本特點與Thumb指令集區(qū)分與x86處理器區(qū)分ARM指令格式ARM尋址方式ARM指令集分類詳解ARM匯編語言指示符ARM匯編語言語句格式ARM匯編語句格式和程序格式進(jìn)階ARM匯編語言程序舉例年6月28日2南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第2頁5.1ARM指令集基本特點指令集異同點ARM、Thumb、x86ARM指令集語法ARM指令集編碼格式指令條件碼表第2操作數(shù)年6月28日3南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第3頁ARM指令集和Thumb指令集

共同點ARM指令集和Thumb指令集含有以下共同點:⒈較多存放器,能夠用于各種用途。⒉對存放器訪問只能經(jīng)過Load/Store指令。兩種指令集差異特征在下頁給出年6月28日4南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第4頁ARM指令集和Thumb指令集

不一樣點項目ARM指令Thumb指令指令工作標(biāo)志CPSRT位=0CPSRT位=1操作數(shù)尋址方式大多數(shù)指令為3地址大多數(shù)指令為2地址指令長度32位16位內(nèi)核指令58條30條條件執(zhí)行大多數(shù)指令只有分支指令數(shù)據(jù)處理指令訪問桶形移位器和ALU獨立桶形移位器和ALU指令存放器使用15個通用存放器+PC8個通用低存放器+7個高存放器+PC程序狀態(tài)存放器特權(quán)模式下可讀可寫不能直接訪問異常處理能夠全盤處理不能處理年6月28日5南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第5頁ARM指令集與x86指令集

主要不一樣點ARM指令集規(guī)整指令格式即:正交指令格式三地址指令由指令附加位決定運算完成后是否改變狀態(tài)標(biāo)志狀態(tài)標(biāo)志位只有4位有兩種指令密度無整數(shù)除法指令大多數(shù)ARM指令都能夠條件執(zhí)行有適合DSP處理乘加指令Load/Store訪存體系結(jié)構(gòu)x86指令集非規(guī)整指令格式即:非正交指令格式二地址指令指令隱含決定運算完成后是否改變狀態(tài)標(biāo)志狀態(tài)標(biāo)志位有6位單一指令密度有整數(shù)除法指令專用條件判斷指令進(jìn)行程序分支沒有適合DSP處理乘加指令運算指令能夠訪問存放器年6月28日6南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第6頁ARM指令集編碼格式參看ARM指令集編碼格式PDF文件年6月28日7南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第7頁ARM指令集語法一條經(jīng)典ARM指令語法以下所表示:<opcode>{<cond>}{S}<Rd>,<Rn>{,<Operand2>}

其中:<opcode>是指令助記符,決定了指令操作。 比如:ADD表示算術(shù)加操作指令。{<cond>}是指令執(zhí)行條件,可選項。{S}決定指令操作是否影響CPSR值,可選項。<Rd>表示目標(biāo)存放器,必有項。<Rn>表示包含第1個操作數(shù)存放器,當(dāng)僅需要一個源操作數(shù)時可省略。<Operand2>表示第2個操作數(shù),可選項。 第2操作數(shù)有兩種格式:#immed_8r,Rm{,Shift}年6月28日8南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第8頁ARM數(shù)據(jù)處理指令中

第2操作數(shù)編碼格式圖解

年6月28日9南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第9頁靈活第2操作數(shù)馬上數(shù)型格式:#<32位馬上數(shù)>也寫成#immed_8r#<32位馬上數(shù)>是取值為數(shù)字常量表示式,并不是全部32位馬上數(shù)都是有效。有效馬上數(shù)極少。它必須由一個8位馬上數(shù)循環(huán)右移偶數(shù)位得到。原因是32位ARM指令中條件碼和操作碼等占用了一些必要指令碼位,32位馬上數(shù)無法編碼在指令中。舉例:ADDr3,r7,#1020;#immed_8r型第2操作數(shù), ;1020是0xFF循環(huán)右移30位后生成32位馬上數(shù) ;推導(dǎo):1020=0x3FC=0x000003FC 年6月28日10南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第10頁靈活第2操作數(shù)(續(xù)1)數(shù)據(jù)處理指令中留給Operand2操作數(shù)編碼空間只有12位,需要利用這12位產(chǎn)生32位馬上數(shù)。其方法是:把指令最低8位(bit[7:0])馬上數(shù)循環(huán)右移偶數(shù)次,循環(huán)右移次數(shù)由2*bit[11:8](bit[11:8]是Operand2高4位)指定。比如:MOVR4,#0x8000000A ;其中馬上數(shù)#0x8000000A是由8位0xA8循環(huán)右移0x4位得到。又比如:MOVR4,#0xA0000002 ;其中馬上數(shù)#0xA0000002是由8位0xA8循環(huán)右移0x6位得到。年6月28日11南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第11頁靈活第2操作數(shù)(續(xù)2)存放器移位型格式:Rm{,<shift>}Rm是第2操作數(shù)存放器,可對它進(jìn)行移位或循環(huán)移位。<shift>用來指定移位類型(LSL,LSR,ASR,ROR或RRX)和移位位數(shù)。其中移位位數(shù)有兩種表示方式,一個是5位馬上數(shù)(#shift),另外一個是位移量存放器Rs值。參看下面例子。例子中R1是Rm存放器。ADDR5,R3,R1,LSL#2 ;R5←R3+R1*4ADDR5,R3,R1,LSLR4 ;R5←R3+R1*2R4

;R4是Rs存放器,Rs用于計算右移次數(shù)年6月28日12南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第12頁詳解第2操作數(shù)#immed_8r該常數(shù)必須對應(yīng)8位位圖,即常數(shù)是由一個8位常數(shù)循環(huán)右移位偶數(shù)位得到。比如:正當(dāng)常量:0x3FC、0、0xF0000000、200、0xF0000001。非法常量:0x1FE、511、0xFFFF、0x1010、0xF0000010。常數(shù)表示式應(yīng)用舉例:MOV R0,#1 ;R0=1AND R1,R2,#0x0F;R2與0x0F,結(jié)果保留在R1LDR R0,[R1],#-4SUBR4,R2,#D4000002;該馬上數(shù)是0xBE循環(huán)右移6位;課堂練習(xí)此第2操作數(shù)年6月28日13南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第13頁詳解第2操作數(shù)Rm存放器(1)RM存放器通常是存放第2操作數(shù)存放器<opcode>{<cond>}{S}<Rd>,<Rn>{,RM{,shift}}舉例:SUB R1,R1,R2;R1←(R1-R2)MOV PC,R0;PC←R0,程序跳轉(zhuǎn)到指定地址LDR R0,[R1],-R2;讀取R1地址上存放器單元內(nèi)容并存入R0,;且R1=R1-R2,后變址偏移ANDR0,R5,R2;R2中存放是第2操作數(shù);該數(shù)據(jù)屬于存放器方式第2操作數(shù)年6月28日14南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第14頁詳解第2操作數(shù)Rm存放器(2)ADD R0,R0,R0,LSL#2 ;執(zhí)行結(jié)果R0=5*R0ADD R5,R3,R1,LSL#2 ;R5←R3+R1*4ADD R5,R3,R1,LSLR4 ;R5←R3+R1*2R4年6月28日15南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第15頁存放器移位方式生成第2操作數(shù)

Rm{,shift}將存放器移位結(jié)果作為操作數(shù),但Rm值保留不變,移位方法以下:LSL #n ;邏輯左移n位(1≤n≤31),低端空位補0。LSR #n ;邏輯右移n位(1≤n≤32),高端空位補0。ASR#n ;算術(shù)右移n位(1≤n≤32),保持符號位不變ROR #n ;循環(huán)右移n位(1≤n≤31),低端移出位填入高端。RRX ;帶擴(kuò)展循環(huán)右移1位,第31位用原進(jìn)位C填入。年6月28日16南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第16頁桶型移位器移位操作:TypeRs其中,Type為ASR、LSL、LSR和ROR中一個;Rs為偏移量存放器,最低8位有效。若其值大于或等于32,則第2個操作數(shù)結(jié)果為0(ASR、LSR例外)。比如 MOVS R3,R1,LSL#7

;R3←R1*128年6月28日17南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第17頁存放器位移方式生成第2操作數(shù)

應(yīng)用舉例ADDR1,R1,R1,LSL#3

R1=R1*9,因為R1←R1+R1*8。SUBR1,R1,R2,LSR#2

R1=R1-R2÷4, 因為R2右移2位相當(dāng)于R2除以4。EORR11,R12,R3,ASR#5

R11=R12⊕(R3÷32) 第2操作數(shù)是R3內(nèi)容除以32年6月28日18南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第18頁存放器位移方式生成第2操作數(shù)

應(yīng)用舉例(續(xù))MOVS R4,R4,LSR#32 C標(biāo)志更新為R4位[31],R4清零。注意R15為處理器程序計數(shù)器PC,普通不要對其進(jìn)行操作,而且有些指令是不允許使用R15,如UMULL指令。年6月28日19南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第19頁ARM處理器CPSR存放器和SPSR存放器位定義格式圖解參看教材第4.2.3節(jié)年6月28日20南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第20頁指令條件碼表(1)條件碼助記符標(biāo)志含義EQZ=1相等NEZ=0不相等CS/HSC=1無符號數(shù)大于或等于CC/LOC=0無符號數(shù)小于MIN=1負(fù)數(shù)(minus)PLN=0正數(shù)或零VSV=1上溢出VCV=0沒有上溢出年6月28日21南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第21頁指令條件碼表(2)條件碼助記符標(biāo)志含義HIC=1,Z=0無符號數(shù)大于LSC=0,Z=l無符號數(shù)小于或等于GEN=V有符號數(shù)大于或等于LTN!=V有符號數(shù)小于GTZ=0,N=V有符號數(shù)大于LEZ=1,N!=V有符號數(shù)小于或等于AL任何無條件執(zhí)行(指令默認(rèn)條件)NVARMv3之前該指令從不執(zhí)行年6月28日22南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第22頁5.2ARM處理器尋址方式尋址方式是依據(jù)指令中給出地址碼字段來實現(xiàn)尋找真實操作數(shù)地址方式。ARM處理器含有8種基本尋址方式,以以下出:存放器尋址 -馬上尋址存放器偏移尋址 -存放器間接尋址基址尋址 -多存放器尋址堆棧尋址 -相對尋址年6月28日23南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第23頁存放器尋址操作數(shù)值在存放器中,指令中地址碼字段指出是存放器編號,指令執(zhí)行時直接取出存放器值來操作。存放器尋址指令舉比如下:MOVR1,R2 ;讀取R2值送到R1MOVR0,R0 ;R0=R0,相當(dāng)于無操作SUBR0,R1,R2 ;R0←R1-R2,將R1值減去R2值, ;結(jié)果保留到R0ADDR0,R1,R2 ;R0←R1+R2;這條指令將兩個存放器(R1和R2)內(nèi)容相加,結(jié)果放入第3個存放器R0中。必須注意寫操作數(shù)次序:第1個是結(jié)果存放器,然后是第一操作數(shù)存放器,最終是第二操作數(shù)存放器。年6月28日24南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第24頁馬上尋址立即尋址指令中操作碼字段后面地址碼部分即是操作數(shù)本身。也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了能夠立即使用操作數(shù)(這么數(shù)稱為立即數(shù))。立即尋址指令舉比如下:SUBSR0,R0,#1;R0減1,結(jié)果放入R0,而且影響標(biāo)志位MOVR0,#0xFF000;將十六進(jìn)制立即數(shù)0xFF000裝入R0存放器立即數(shù)要以“#”號為前綴,16進(jìn)制數(shù)值時以“0x”表示。年6月28日25南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第25頁存放器偏移尋址存放器偏移尋址是ARM指令集特有尋址方式。當(dāng)?shù)?作數(shù)是存放器偏移方式時,第2個存放器操作數(shù)在與第1操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。存放器偏移尋址指令舉比如下:MOVR0,R2,LSL#3;R2值左移3位,結(jié)果放入R0,即R0=R2×8ANDSR1,R1,R2,LSLR3;R2值左移R3位,然后與R1相“與”;結(jié)果放入R1,而且影響標(biāo)志位。SUBR11,R12,R3,ASR#5;R12-R3÷32,然后存入R11。年6月28日26南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第26頁存放器偏移尋址(續(xù))可采取移位操作以下:LSL:邏輯左移(LogicalShiftLeft),低端空出位補0。LSR:邏輯右移(LogicalShiftRight),高端空出位補0。ASR:算術(shù)右移(ArithmeticShiftRight),移位過程中保持符號位不變,即若源操作數(shù)為正數(shù),則字高端空出位補0;不然補1。ROR:循環(huán)右移(RotateRight),由字低端移出位填入字高端空出位。RRX:帶擴(kuò)展循環(huán)右移(RotateRightextendedbylplace),操作數(shù)右移1位,高端空出位用原C標(biāo)志值填充。假如指定后綴“S”,則將Rm原值位[0]移到進(jìn)位標(biāo)志。年6月28日27南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第27頁移位操作示意圖各種移位操作以下列圖所表示:年6月28日28南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第28頁存放器間接尋址存放器間接尋址指令中地址碼給出是一個通用存放器編號,所需操作數(shù)保留在存放器指定地址存放單元中,即存放器為操作數(shù)地址指針。存放器間接尋址指令舉比如下:LDRR1,[R2] 將R2指向存放單元數(shù)據(jù)讀出,保留在R1中。SWPR1,R1,[R2] 將存放器R1值與R2指定存放單元內(nèi)容交換年6月28日29南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第29頁SWP指令操作圖解年6月28日30南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第30頁基址尋址基址尋址就是將基址存放器內(nèi)容與指令中給出偏移量相加,形成操作數(shù)有效地址?;穼ぶ酚糜谠L問基址附近存放單元,常用于查表、數(shù)組操作、功能部件存放器訪問等?;穼ぶ分噶钆e比如下:LDRR2,[R3,#0x0C];前變址,傳數(shù)前計算地址 ;讀取R3+0x0C地址上存放單元內(nèi)容,放入R2。STRR1,[R0,#-4]!;[R0-4]←[R1],R0=R0-4,符號“!”表明指令在完成數(shù)據(jù)傳送后應(yīng)該更新基址存放器,否則不更新;屬于回寫前變址。年6月28日31南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第31頁基址尋址指令舉例LDRR1,[R0,R3,LSL#1];前變址,參看教材第125頁;將R0+R3×2地址上存放單元內(nèi)容讀出,存入R1。LDRR0,[R1,R2,LSL#2]!;回寫前變址 ;將內(nèi)存起始地址為R1+R2*4字?jǐn)?shù)據(jù)讀取到R0中, ;同時修改R1,使得:R1=R1+R2*4。LDRR0,[R1,R2]!

;回寫前變址 ;以R1+R2值為地址,訪問內(nèi)存。將該位置字?jǐn)?shù)據(jù)讀 ;取到R0中,同時修改R1,使得:R1=R1+R2。

年6月28日32南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第32頁多存放器尋址多存放器尋址即是一次可傳送幾個存放器值,允許一條指令傳送16個存放器任何子集或全部存放器。多存放器尋址指令舉比如下:LDMIAR1!,{R2-R7,R12};將R1指向單元中數(shù)據(jù)讀出到R2~R7、R12中;(R1自動增加),參看教材第125頁表4-21STMIAR0!,{R2-R7,R12};將存放器R2~R7、R12值保留到R0指向存放單元中,;(R0自動增加)使用多存放器尋址指令時,存放器子集次序是按由小到大次序排列,連續(xù)存放器可用“-”連接;否則用“,”分隔書寫。年6月28日33南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第33頁多存放器尋址(續(xù)1)多存放器尋址指令舉例LDMIAR1!,{R0,R2,R5};;R0←[R1];R2←[R1+4];R5←[R1+8];R1保持自動增值;存放器列表{R0,R2,R5}與{R2,R0,R5}等效多存放器指令執(zhí)行次序與存放器列表次序無關(guān),而與存放器序號保持一致。年6月28日34南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第34頁多存放器指令執(zhí)行次序舉例1經(jīng)過ADS集成開發(fā)環(huán)境AXD調(diào)試器窗口觀察年6月28日35南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第35頁多存放器指令執(zhí)行次序舉例2經(jīng)過ADS集成開發(fā)環(huán)境AXD調(diào)試器窗口觀察年6月28日36南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第36頁多存放器尋址(續(xù)2)下面是多存放器傳送指令STM舉比如下:STMIAR0!,{R1—R7};將R1~R7數(shù)據(jù)保留到存放器中。存放指針在保留第一;個值之后增加,增加方向為向上增加STMIBR0!,{R1—R7};將R1~R7數(shù)據(jù)保留到存放器中。存放指針在保留第一;個值之前增加,增加方向為向上增加STMDAR0!,{R1—R7};將R1~R7數(shù)據(jù)保留到存放器中。存放指針在保留第一;個值之后增加,增加方向為向下增加STMDBR0!,{R1—R7};將R1~R7數(shù)據(jù)保留到存放器中。存放指針在保留第一;個值之前增加,增加方向為向下增加年6月28日37南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第37頁堆棧尋址存放器堆??煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧。向下生長:向低地址方向生長,稱為遞減堆棧。滿堆棧堆棧指針指向最終壓入堆棧有效數(shù)據(jù)項空堆棧堆棧指針指向下一個待壓入數(shù)據(jù)空位置年6月28日38南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第38頁堆棧尋址(續(xù)1)有4種類型堆棧組合滿遞增:堆棧經(jīng)過增大存放器地址向上增加,堆棧指針指向內(nèi)含有效數(shù)據(jù)項最高地址。指令如LDMFA、STMFA等。空遞增:堆棧經(jīng)過增大存放器地址向上增加,堆棧指針指向堆棧上第一個空位置。指令如LDMEA、STMEA等。滿遞減:堆棧經(jīng)過減小存放器地址向下增加,堆棧指針指向內(nèi)含有效數(shù)據(jù)項最低地址。指令如LDMFD、STMFD等??者f減:堆棧經(jīng)過減小存放器地址向下增加,堆棧指針指向堆棧下第一個空位置。指令如LDMED、STMED等。年6月28日39南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第39頁堆棧尋址(續(xù)2)堆棧尋址指令舉比如下:STMFDSP!,{R1—R7,LR};將R1~R7、LR入棧(push),滿遞減堆棧。LDMFDSP!,{R1—R7,LR};數(shù)據(jù)出棧(pop),放入R1~R7、LR存放器。;滿遞減堆棧年6月28日40南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第40頁多存放器傳送指令映射表STM=將存放器內(nèi)容存入內(nèi)存單元(堆棧操作:入棧)LDM=將內(nèi)存單元內(nèi)容存入存放器(堆棧操作:出棧)年6月28日41南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第41頁多存放器傳送指令說明數(shù)據(jù)塊傳送:I=向地址增大方向處理數(shù)據(jù)傳送(Increment)D=向地址減小方向處理數(shù)據(jù)傳送(Decrement)A=先傳送數(shù)據(jù)后改變地址(after)B=先改變地址后傳送數(shù)據(jù)(before)堆棧操作:F=滿棧頂指針(full)E=空棧頂指針(empty)A=堆棧向高地址方向增加(ascendingstack)D=堆棧向低地址方向增加(decendingstack)年6月28日42南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第42頁相對尋址是基址尋址一種變通。由程序計數(shù)器PC提供基準(zhǔn)地址,指令中地址碼字段作為偏移量,二者相加后得到地址即為操作數(shù)有效地址。相對尋址指令舉比如下:BL SUBR1;保留子程序返回地址;調(diào)用到SUBR1子程序BEQ LOOP;條件跳轉(zhuǎn)到LOOP標(biāo)號處 …LOOP MOV R6,#1 …SUBR1 …相對尋址年6月28日43南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第43頁相對尋址舉例

BLSUBR ;轉(zhuǎn)移到SUBR ……… ……...SUBR ….. ;子程序入口 ….. MOVPC,R14 ;返回;R14也就是LR年6月28日44南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第44頁5.3ARM指令集分類詳解ARM指令集大致分為6類:分支指令、Load/Store指令、數(shù)據(jù)處理指令、程序狀態(tài)存放器指令、異常中止指令、協(xié)處理器指令。以下分別介紹其中主要指令。年6月28日45南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第45頁5.3.1分支指令A(yù)RM有兩種方法能夠?qū)崿F(xiàn)程序分支轉(zhuǎn)移。跳轉(zhuǎn)指令所謂長跳轉(zhuǎn)直接向PC存放器(R15)中寫入目標(biāo)地址。ARM跳轉(zhuǎn)指令有以下4種:①B分支指令,語法B{cond}label②BL帶鏈接分支指令語法:BL{cond}label③BX分支并可選地交換指令集語法:BX{cond}Rm④BLX帶鏈接分支并可選擇地交換指令集。語法:BLX{cond}label|Rm年6月28日46南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第46頁BL指令舉例BL指令意義:BranchandLink示例: ……..…….. blMyPro ;調(diào)用子程序MyPro ………..MyPro ;子程序MyPro本體 ……….. ……….. movPC,LR ;將R14值送入R15,返回年6月28日47南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第47頁BX指令使用舉例經(jīng)過使用BX指令能夠讓ARM處理器內(nèi)核工作狀態(tài)在ARM狀態(tài)和Thumb狀態(tài)之間進(jìn)行切換。參看下例:;從ARM狀態(tài)轉(zhuǎn)變?yōu)門humb狀態(tài) LDR R0,=Sub_Routine+1 BX R0;從Thumb狀態(tài)轉(zhuǎn)變?yōu)锳RM狀態(tài) LDR R0,=Sub_Routine BX R0年6月28日48南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第48頁長跳轉(zhuǎn)直接向PC存放器寫入目標(biāo)地址值,能夠?qū)崿F(xiàn)4GB地址空間中任意跳轉(zhuǎn)。示例:以下兩條指令實現(xiàn)了4GB地址空間中子程序調(diào)用。MOVLR,PC ;保留返回地址MOVR15,#0x00110000

;無條件轉(zhuǎn)向絕對地址0x110000

;此32位馬上數(shù)地址應(yīng)滿足單字節(jié)循環(huán)右移偶數(shù)次年6月28日49南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第49頁5.3.2Load/Store指令Load/Store指令用于在存放器和處理器之間傳輸數(shù)據(jù)。Load用于把內(nèi)存中數(shù)據(jù)裝載到存放器,Store指令用于把存放器中數(shù)據(jù)存入內(nèi)存。共有3種類型Load/Store指令:單存放器傳輸指令多存放器傳輸指令交換指令年6月28日50南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第50頁單存放器傳送指令助記碼操作指令描述LDR把一個字裝入一個存放器Rd←mem32[address]STR從一個存放器保留一個字Rd→mem32[address]LDRB把一個字節(jié)裝入一個存放器Rd←mem8[address]STRB從一個存放器保留一個字節(jié)Rd→mem8[address]LDRH把一個半字裝入一個存放器Rd←mem16[address]STRH從一個存放器保留一個半字Rd→mem16[address]LDRSB把一個有符號字節(jié)裝入存放器Rd←符號擴(kuò)展(mem8[address])LDRSH把一個有符號半字裝入存放器Rd←符號擴(kuò)展(mem16[address])年6月28日51南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第51頁Load/Store指令變址模式變址模式有四種:零偏移、前變址、后變址、回寫前變址。變址模式數(shù)據(jù)基址存放器指令舉例零偏移mem[base]基址存放器零偏移尋址,存放器間接尋址LDRr0,[r1]回寫前變址mem[base+offset]基址存放器加偏移量LDRr0,[r1,#4]!前變址mem[base+offset]不變LDRr0,[r1,#4]后變址mem[base]基址存放器加偏移量LDRr0,[r1],#4年6月28日52南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第52頁單存放器傳送指令舉例LDRR2,[R3,#0x0C] 讀取R3+0x0C地址上一個字?jǐn)?shù)據(jù)內(nèi)容,放入R2。屬前變址。參看教材第125頁。STRR1,[R0,#-4]! [R0-4]←[R1],R0=R0-4,符號“!”表明指令在完成數(shù)據(jù)傳送后應(yīng)該更新基址存放器,不然不更新;屬回寫前變址。LDRR1,[R0,R3,LSL#1] 將R0+R3×2地址上存放單元內(nèi)容讀出,存入R1。屬前變址。年6月28日53南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第53頁5.3.3數(shù)據(jù)處理指令A(yù)RM數(shù)據(jù)處理指令大致分為以下6種類型。數(shù)據(jù)傳送指令算術(shù)運算指令邏輯運算指令比較指令測試指令乘法指令年6月28日54南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第54頁ARM數(shù)據(jù)處理指令A(yù)RM數(shù)據(jù)處理指令大致可分為3類:數(shù)據(jù)傳送指令(如MOV、MVN);算術(shù)邏輯運算指令(如ADD、SUB、AND);比較指令(如CMP、TST)。參見下面表格數(shù)據(jù)處理指令只能對存放器內(nèi)容進(jìn)行操作。全部ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以影響狀態(tài)標(biāo)志。比較指令CMP、CMN、TST和TEQ不需要后綴S,它們會直接影響狀態(tài)標(biāo)志。年6月28日55南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第55頁ARM數(shù)據(jù)處理指令集助記符說明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送指令Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)非傳送指令Rd←(~operand2)MVN{cond}{S}ADDRd,Rn,operand2加法運算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進(jìn)位加法指令Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進(jìn)位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進(jìn)位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}年6月28日56南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第56頁ARM數(shù)據(jù)處理指令集(續(xù))助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯“與”操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯“或”操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯“異或”操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位去除指令Rd←Rn&(~operand2)BIC{cond}{S}CMPRn,operand2比較指令標(biāo)志N,Z,C,V←Rn-operand2CMP{cond}CMNRn,operand2負(fù)數(shù)比較指令標(biāo)志N,Z,C,V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令標(biāo)志N,Z,C,V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令標(biāo)志N,Z,C,V←Rn^operand2TEQ{cond}年6月28日57南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第57頁乘法指令A(yù)RM7TDMI(-S)含有32×32乘法指令、32×32乘加指令,32×32結(jié)果為64位乘/乘加指令。ARM乘法指令以下表所列。助記符說明操作條件碼MULRd,Rm,Rs32位乘法指令Rd+Rm×Rs(Rd!=(Rm)MUL{Cond}{S}MLARd,Rm,Rs,Rn32位乘加指令Rd←Rm×Rs+Rn(Rd!=Rm)MLA{cond}{S}UMULLRdLo,RdHi,Rm,Rs64位無符號乘法指令(RdLo,RdHi)←Rm×RsUMULL{cond}{S}UMLALRdLo,RdHi,Rm,Rs64位無符號乘加指令(RdLo,RdHi←Rm×Rs+(RdLo,RdHi)UMLAL{cond}{S}SMULLRdLo,RdHi,Rm,Rs64位有符號乘法指令(RdLo,RdHi)←Rm×RsSMULL{cond}{S}SMLALRdLo,RdHi,Rm,Rs64位有符號乘加指令(RdLo,RdHi←Rm×Rs+(RdLo,RdHi)SMLAL{cond}{S}年6月28日58南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第58頁5.3.4程序狀態(tài)存放器指令讀狀態(tài)存放器指令MRS寫狀態(tài)存放器指令MSR指令舉例開中止與關(guān)中止年6月28日59南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第59頁讀狀態(tài)存放器指令MRS在ARM處理器中,只有MRS指令能夠?qū)顟B(tài)存放器CPSR或SPSR讀出到通用存放器中。指令格式如下:MRS{cond}Rd,psr其中:Rd目標(biāo)存放器。Rd不允許為R15。psrCPSR或SPSR。指令舉比如下:MRSR1,CPSR;將CPSR狀態(tài)存放器讀取,保留到R1中。MRSR2,SPSR;將SPSR狀態(tài)存放器讀取,保留到R2中。年6月28日60南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第60頁寫狀態(tài)存放器指令MSR在ARM處理器中,只有MSR指令能夠直接設(shè)置狀態(tài)存放器CPSR或SPSR。指令格式以下:MSR{cond}psr_fields,#immed_8rMSR{cond}psr_fields,Rm其中:psr CPSR或SPSR。fields 指定傳送區(qū)域。年6月28日61南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第61頁寫狀態(tài)存放器指令MSR(續(xù))fields能夠是以下一個或各種;(字母必須為小寫);c控制域屏蔽字節(jié)(psr[7…0]);x擴(kuò)展域屏蔽字節(jié)(psr[15…8]);s狀態(tài)域屏蔽字節(jié)(psr[23…16]);f標(biāo)志域屏蔽字節(jié)(psr[31…24])。immed_8r 要傳送到狀態(tài)存放器指定域馬上數(shù),8位。Rm 要傳送到狀態(tài)存放器指定域數(shù)據(jù)源存放器。年6月28日62南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第62頁MSR指令舉例MSR指令舉比如下: MSRCPSR_c,#0xD3 ;CPSR[7…0]=0xD3,即切換到管理模式,0b11010011 MSRCPSR_cxsf,R3 ;CPSR=R3年6月28日63南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第63頁使能IRQ中止(開中止)ENABLE_IRQ MRS R0,CPSR BIC R0,R0,#0x80 MSR CPSR_c,R0 MOV PC,LRI位=0開中止年6月28日64南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第64頁禁能IRQ中止(關(guān)中止)DISABLE_IRQ MRSR0CPSR ORRR0,R0,#0x80 MSRCPSR_c,R0 MOVPC,LRI位=1關(guān)中止年6月28日65南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第65頁MSR指令說明程序中不能經(jīng)過MSR指令直接修改CPSR中T控制位來實現(xiàn)ARM狀態(tài)/Thumb狀態(tài)切換,必須使用BX指令完成處理器狀態(tài)切換(因為BX指令屬分支指令,它會打斷流水線狀態(tài),實現(xiàn)處理器狀態(tài)切換)。MRS與MSR配合使用,實現(xiàn)CPSR或SPSR存放器讀一修改一寫操作,可用來進(jìn)行處理器模式切換、允許/禁止IRQ/FIQ中止等設(shè)置,以下面程序清單所表示。年6月28日66南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第66頁堆棧指令初始化INITSTACKMOVR0,LR;保留返回地址MSRCPSR_c,#0xD3LDRSP,StackSvc;設(shè)置管理模式堆棧,M[4:0]=0b10011MSRCPSR_c,#0xD2LDRSP,StackIrq;設(shè)置中止模式堆棧,M[4:0]=0b10010MOVPC,R0年6月28日67南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第67頁5.3.5軟中止指令SWISWI指令用于產(chǎn)生軟中止,從而實現(xiàn)從用戶模式變換到管理模式,CPSR保留到管理模式SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量。在其它模式下也可使用SWI指令,處理器一樣地切換到管理模式。指令格式如下:SWI{cond}immed_24//Thumb指令是immed_8其中:immed_24是24位立即數(shù),值為0~16,777,215之間整數(shù)。立即數(shù)用于指定指令請求詳細(xì)SWI服務(wù)。指令舉比如下:SWI 0 ;軟中止,中止立即數(shù)為0SWI 0x123456 ;軟中止,中止立即數(shù)為0x123456年6月28日68南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第68頁取得SWI指令馬上數(shù)在SWI異常中止處理程序中,取出SWI馬上數(shù)步驟為:首先確定引發(fā)軟中止SWI指令是ARM指令還是Thumb指令,這可經(jīng)過對SPSR訪問得到;然后取得該SWI指令地址,這可經(jīng)過訪問LR存放器得到;接著讀出指令,分解出馬上數(shù)。程序清單以下所表示。年6月28日69南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第69頁取得SWI指令馬上數(shù)(續(xù))T_bit EQU 0x20SWI_Handler STMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場保護(hù) MRSR0,SPSR ;讀取SPSR STMFDSP!,{R0} ;保留SPSR TST R0,#T_bit ;測試T標(biāo)志位,CPSR第M5位

;T=1表明執(zhí)行Thumb指令,參看講義上集91頁 LDREQHR0,[LR,#-2] ;若是Thumb指令,則讀取指令碼(16位) BICEQR0,R0,#0xFF00 ;取得Thumb指令8位馬上數(shù) LDRNER0,[LR,#-4] ;若是ARM指令,則讀取指令碼(32位) BICNER0,R0,#0xFF000000 ;取得ARM指令24位馬上數(shù) … LDMFDSP!,{R0-R3,R12,PC} ;SWI異常中止返回年6月28日70南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第70頁5.3.6ARM協(xié)處理器指令A(yù)RM支持協(xié)處理器操作。協(xié)處理器控制經(jīng)過協(xié)處理器命令實現(xiàn)。助記符說明操作條件碼CDPcoproc,opcode1,CRd,CRn,CRm{,opcode2}協(xié)處理器數(shù)據(jù)操作指令取決于協(xié)處理器CDP{cond}LDC{1}coproc,CRd,<地址>協(xié)處理器數(shù)據(jù)讀取指令取決于協(xié)處理器LDC{cond}{L}STC{1}coproc,CRd,<地址>協(xié)處理器數(shù)據(jù)寫入指令取決于協(xié)處理器STC{cond}{L}年6月28日71南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第71頁ARM協(xié)處理器指令(續(xù))助記符說明操作條件碼MCRcoproc,opcode1,Rd,CRn,CRm{,opcode2}ARM存放器到協(xié)處理器存放器數(shù)據(jù)傳送指令取決于協(xié)處理器MCR{cond}MRCcoproc,opcode1,Rd,CRn,CRm{,opcode2)協(xié)處理器存放器到ARM存放器數(shù)據(jù)傳送指令取決于協(xié)處理器MRC{cond}年6月28日72南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第72頁5.3.7ARM偽指令A(yù)RM偽指令不是ARM指令集中指令,只是為了編程方便編譯器定義了偽指令。能夠像其它ARM指令一樣使用偽指令,但在編譯時這些指令將被等效ARM指令代替。ARM偽指令有4條,分別為ADR偽指令、ADRL偽指令、LDR偽指令和NOP偽指令。年6月28日73南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第73頁ADR偽指令小范圍地址讀取偽指令該指令將基于PC地址值或者基于存放器地址值讀取到存放器中語法:ADR{<cond>}register,expr其中,register為目標(biāo)存放器。expr為基于PC或者基于存放器地址表示式,其取值范圍以下:當(dāng)?shù)刂分挡皇亲謱R時,其取值范圍為-255~255。當(dāng)?shù)刂分凳亲謱R時,其取值范圍為-1020~1020。當(dāng)?shù)刂分凳?6字節(jié)對齊時,其取值范圍將更大。年6月28日74南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第74頁ADR偽指令使用舉例下面是一個使用ADR偽指令例子:start MOVR0,#1000 ADR R4,start;案例ARM處理器是三級流水線,PC值為當(dāng)前指令地址值加8字節(jié);所以本ADR偽指令將被編譯器替換成機(jī)器指令;SUBR4,PC,#0xC年6月28日75南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第75頁ADRL偽指令中等范圍地址讀取偽指令。該指令將基于PC或基于存放器地址值讀取到存放器中。ADRL偽指令比ADR偽指令能夠讀取更大范圍地址。ADRL偽指令在匯編時被編譯器替換成兩條指令。年6月28日76南京大學(xué)計算機(jī)系arm指令集特點尋址方式和指令分類詳解習(xí)題第76頁ADRL偽指令語法語法:ADRL{<cond>}register,expr其中,register為目標(biāo)存放器。expr為基于PC或者基于存放器地址表示式,其取值范圍以下:當(dāng)?shù)刂分挡皇亲謱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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論