ARM嵌入式系統(tǒng)結(jié)構(gòu)與編程:第4章 ARM指令集系統(tǒng)_第1頁
ARM嵌入式系統(tǒng)結(jié)構(gòu)與編程:第4章 ARM指令集系統(tǒng)_第2頁
ARM嵌入式系統(tǒng)結(jié)構(gòu)與編程:第4章 ARM指令集系統(tǒng)_第3頁
ARM嵌入式系統(tǒng)結(jié)構(gòu)與編程:第4章 ARM指令集系統(tǒng)_第4頁
ARM嵌入式系統(tǒng)結(jié)構(gòu)與編程:第4章 ARM指令集系統(tǒng)_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章 ARM指令集系統(tǒng)ARM微處理器的指令集可以分為數(shù)據(jù)處理指令、分支指令、加載/存儲指令、批量加載/存儲指令、交換指令、程序狀態(tài)寄存器(PSR)處理指令、協(xié)處理器指令和異常產(chǎn)生指令八大類。本章將分類介紹ARM指令語法格式、指令編碼格式和ARM指令的詳細(xì)功能。內(nèi)容提要4.1數(shù)據(jù)處理指令4.2ARM分支指令4.3加載/存儲指令4.4批量加載/存儲指令4.5交換指令4.6程序狀態(tài)寄存器PSR訪問指令4.7協(xié)處理器操作指令4.8異常產(chǎn)生指令4.1.1基本數(shù)據(jù)處理指令A(yù)RM基本的數(shù)據(jù)處理指可以分為4類:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算指令和比較指令。ARM基本的數(shù)據(jù)處理指令匯編指令語法格式:<opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>4.1數(shù)據(jù)處理指令1.數(shù)據(jù)傳送指令MOV指令MOV指令的匯編語法格式為MOV{cond}{S}Rd,operand2 將第二操作數(shù)operand2表示的數(shù)據(jù)傳送到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果或移位情況更新CPSR中的相應(yīng)條件標(biāo)志位(N、Z和C)。1.數(shù)據(jù)傳送指令指令中包含S時(shí):如果指令中的目標(biāo)寄存器<Rd>為R15,則當(dāng)前處理器模式對應(yīng)的SPSR的值被復(fù)制到CPSR中;如果指令中的目標(biāo)寄存器<Rd>不為R15,指令根據(jù)傳送的數(shù)值設(shè)置CPSR中的N位和Z位,并根據(jù)移位器的進(jìn)位值設(shè)置CPSR的C位。1.數(shù)據(jù)傳送指令MOV指令例4-1:MOVR1,#0x80MOVPC,LRMOVSR1,R2,LSL#0x02MVN指令MVN指令的匯編語法格式為MVN{cond}{S}Rd,operand2將第二操作數(shù)operand2表示的數(shù)據(jù)按位取反后傳送到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果或移位情況更新CPSR中的相應(yīng)條件標(biāo)志位。MVN指令例4-2MVNR1,#0xFF00MVNSR1,R1,LSL#0x022.算術(shù)運(yùn)算指令(1)ADD加法指令A(yù)DD加法指令的匯編語法格式為ADD{cond}{S}Rd,Rn,operand2 ADD指令將operand2表示的數(shù)據(jù)與寄存器Rn中的值相加,并把結(jié)果傳送到目標(biāo)寄存器<Rd>中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。2.算術(shù)運(yùn)算指令(1)ADD加法指令例:4-3ADDR0,R1,R2ADDSR0,R1,#251ADDR0,R2,R2,LSL#1

(2)ADC帶C標(biāo)志位的加法指令A(yù)DC{cond}{S}Rd,Rn,operand2功能:ADC帶C標(biāo)志位的加法指令將operand2表示的數(shù)據(jù)與寄存器Rn中的值相加,再加上CPSR中的C條件標(biāo)志位的值,并把結(jié)果傳送到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。該指令可以實(shí)現(xiàn)兩個(gè)高于32位的數(shù)據(jù)相加運(yùn)算。(2)ADC帶C標(biāo)志位的加法指令例:實(shí)現(xiàn)64位數(shù)據(jù)加法運(yùn)算ADDSR0,R0,R2ADCR1,R1,R3(3)SUB減法指令SUB{cond}{S}Rd,Rn,operand2功能:SUB指令從寄存器Rn中減去operand2表示的數(shù)值,并把結(jié)果傳送到目標(biāo)寄存器<Rd>中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。注意事項(xiàng):當(dāng)指令包含后綴“S”時(shí),如果減法運(yùn)算有借位,則C=0,否則C=1。(4)SBC帶C標(biāo)志位的減法指令SBC{cond}{S}Rd,Rn,operand2SBC指令從寄存器<Rn>中減去operand2表示的數(shù)值,再減去寄存器CPSR中C條件標(biāo)志位的反碼,并把結(jié)果傳送到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。該指令可以實(shí)現(xiàn)兩個(gè)高于32位的數(shù)據(jù)相減運(yùn)算。(4)SBC帶C標(biāo)志位的減法指令例4-6實(shí)現(xiàn)64位操作數(shù)減法運(yùn)算,其中R1:R0中放置被減數(shù),R3:R2中放置減數(shù),結(jié)果送回到R1:R0中。(驗(yàn)證)(5)RSB逆向減法指令RSB{cond}{S}Rd,Rn,operand2功能:RSB指令從第2操作數(shù)operand2表示的數(shù)值中減去寄存器Rn

值,并把結(jié)果傳送到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。(6)RSC帶C標(biāo)志位的逆向減法指令RSC{cond}{S}Rd,Rn,operand2功能:RSC指令從operand2表示的數(shù)值中減去寄存器Rn

值,再減去寄存器CPSR中C條件標(biāo)志位的反碼,并把結(jié)果傳送到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。例:求一個(gè)64位數(shù)的相反數(shù)(驗(yàn)證)3.邏輯運(yùn)算指令(1)AND與邏輯運(yùn)算指令A(yù)ND{cond}{S}Rd,Rn,operand2功能:AND指令將operand2表示的數(shù)值與寄存器Rn

的值按位做邏輯與操作,并把結(jié)果保存到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。ANDR0,R0,#0xFF(2)ORR或邏輯運(yùn)算指令ORR{cond}{S}Rd,Rn,operand2功能:ORR指令將operand2表示的數(shù)值與寄存器Rn的值按位做邏輯或操作,并把結(jié)果保存到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。ORRR0,R0,#0xFF

(3)EOR異或邏輯運(yùn)算指令EOR{cond}{S}Rd,Rn,operand2功能:EOR指令將operand2表示的數(shù)值與寄存器Rn的值按位做邏輯異或操作,并把結(jié)果保存到目標(biāo)寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。EOR指令可用于將寄存器中某些位的值取反。EORR0,R0,#0xFF

(4)BIC位清除邏輯運(yùn)算指令BIC{cond}{S}Rd,Rn,operand2功能:BIC指令將寄存器Rn的值與operand2表示的數(shù)值的反碼按位做邏輯與操作,并把結(jié)果保存到目標(biāo)寄存器Rd中

BICR0,R0,#0xFF0000004.比較指令比較指令沒有目標(biāo)寄存器,只用作更新條件標(biāo)志位,不保存運(yùn)算結(jié)果,指令后綴無需加“S”。在程序設(shè)計(jì)中,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,后面的指令就可以根據(jù)CPSR中相應(yīng)的條件標(biāo)志位來判斷是否執(zhí)行。(1)CMP相減比較指令CMP{cond}Rn,operand2功能:CMP指令將寄存器Rn的值減去operand2表示的數(shù)值,根據(jù)操作結(jié)果和寄存器移位情況更新CPSR中的相應(yīng)條件標(biāo)志位。(2)CMN負(fù)數(shù)比較指令CMN{cond}Rn,operand2功能:CMN指令將寄存器Rn的值加上operand2表示的數(shù)值,根據(jù)操作結(jié)果和寄存器移位情況更新CPSR中的相應(yīng)條件標(biāo)志位。CMN相當(dāng)于不保存操作結(jié)果的ADDS指令。(3)TST位測試指令TST{cond}Rn,operand2功能:CMN指令將寄存器Rn的值與operand2表示的數(shù)值按位作邏輯“與”操作,根據(jù)操作結(jié)果和寄存器移位情況更新CPSR中的相應(yīng)條件標(biāo)志位。4)TEQ相等測試指令TEQ{cond}Rn,operand2功能:TEQ指令將寄存器Rn的值與operand2表示的數(shù)值按位作邏輯“異或”操作,根據(jù)操作結(jié)果和寄存器移位情況更新CPSR中的相應(yīng)條件標(biāo)志位。可以利用CPSR中的Z位、N位判斷兩個(gè)操作數(shù)或它們的符號是否相等。4.1.2乘法指令A(yù)RM乘法指令完成2個(gè)寄存器中數(shù)據(jù)的乘法,按照保存結(jié)果的數(shù)據(jù)長度可以分為兩類:一類為32位的乘法指令,即乘法操作的結(jié)果為32位;另一類為64位的乘法指令,即乘法操作的結(jié)果為64位。

1.32位乘法指令(1)MULMUL{cond}{S}Rd,Rm,RsMUL指令實(shí)現(xiàn)兩個(gè)32位的數(shù)(可以為無符號數(shù),也可為有符號數(shù))的乘積(Rm*Rs

)并將結(jié)果存放到一個(gè)32位的寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位(N,Z);Rd和Rm不能為同一個(gè)寄存器。例:MULSR3,R2,R1

(2)MLAMLA{cond}{S}Rd,Rm,Rs,Rn

MLA指令實(shí)現(xiàn)兩個(gè)32位的數(shù)(可以為無符號數(shù),也可為有符號數(shù))的乘積,再將乘積(Rm*Rs

)加上第3個(gè)操作數(shù)Rn,并將結(jié)果存放到一個(gè)32位的寄存器Rd中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。

例:MLASR0,R1,R2,R32.64位乘法指令(1)UMULLUMULL{cond}{S}RdLo,RdHi,Rm,Rs

UMULL指令實(shí)現(xiàn)兩個(gè)32位無符號數(shù)的乘積,乘積結(jié)果的高32位存放到一個(gè)32位的寄存器RdHi中,乘積結(jié)果的低32位存放到另一個(gè)32位的寄存器RdLo中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。例:UMULLR0,R1,R2,R3(2)UMLALUMLAL{cond}{S}RdLo,RdHi,Rm,Rs

UMLAL指令將兩個(gè)32位無符號數(shù)的64位乘積結(jié)果與由(RdHi:RdLo)表示的64位無符號數(shù)相加,結(jié)果的高32位存放到寄存器RdHi中,結(jié)果的低32位存放到寄存器RdLo中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。例:UMLALR0,R1,R2,R3(3)SMULLSMULL{cond}{S}RdLo,RdHi,Rm,Rs

SMULL指令實(shí)現(xiàn)兩個(gè)32位有符號數(shù)的乘積,乘積結(jié)果的高32位存放到一個(gè)32位的寄存器的RdHi,乘積結(jié)果的低32位存放到另一個(gè)32位的寄存器的RdLo;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。例4-21寫出執(zhí)行完下面的程序段后,[R3:R2]、[R5:R4]所存放的64位乘法結(jié)果分別為多少?(驗(yàn)證)

MVNR0,#0x0 MOVR1,#0x1 UMULLR2,R3,R1,R0 SMULLR4,R5,R1,R0;(4)SMLALSMLAL{cond}{S}RdLo,RdHi,Rm,Rs

SMLAL指令將兩個(gè)32位有符號數(shù)的64位乘積結(jié)果與由(RdHi:RdLo)表示的64位無符號數(shù)相加,加法結(jié)果的高32位存放到寄存器RdHi中,乘積結(jié)果的低32位存放到寄存器RdLo中;如果指令包含后綴“S”,則根據(jù)操作結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。雜類數(shù)據(jù)處理指令前導(dǎo)零計(jì)數(shù)指令:CLZCLZ<cond><Rd>,<Rm>從ARMV5版本指令系統(tǒng)開始支持該指令,計(jì)算32位寄存器操作數(shù)從第31位開始連續(xù)“0”位的個(gè)數(shù),主要用于計(jì)算操作數(shù)規(guī)范化。例:

MOVR4,#0xAA CLZ R2,R44.2ARM分支指令分支指令用于實(shí)現(xiàn)程序流程的跳轉(zhuǎn),在ARM程序中有兩種方法可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn):使用專門的分支指令。直接向程序計(jì)數(shù)器PC寫入跳轉(zhuǎn)地址值。ARM分支指令可以實(shí)現(xiàn)從當(dāng)前指令向前或向后的32M的地址空間跳轉(zhuǎn)。通過向程序計(jì)數(shù)器PC寫入跳轉(zhuǎn)地址值,可以實(shí)現(xiàn)在4GB的地址空間中的任意跳轉(zhuǎn),在跳轉(zhuǎn)之前結(jié)合使用MOV

LR,PC等類似指令,能夠保存程序的返回地址值,從而實(shí)現(xiàn)在4GB連續(xù)地址空間的子程序調(diào)用。分支指令B分支指令B可以實(shí)現(xiàn)跳轉(zhuǎn)到指定的地址執(zhí)行程序。指令的匯編語法格式如下:B{<cond>}<target_address>

在指令的匯編語法中target_address這個(gè)目標(biāo)地址的計(jì)算方法是:將指令中的24位帶符號的補(bǔ)碼立即數(shù)擴(kuò)展為32位;將此32位數(shù)左移兩位將得到的值寫入到程序計(jì)數(shù)器PC中,即跳轉(zhuǎn)到目標(biāo)地址。能夠?qū)崿F(xiàn)跳轉(zhuǎn)的范圍為-32MB~+32MB。例: B Label;目標(biāo)地址由程序標(biāo)號給出 CMPR1,#0 BEQstop帶鏈接的分支指令BL 帶鏈接的分支指令BL可以實(shí)現(xiàn)跳轉(zhuǎn)到指定的地址執(zhí)行程序,同時(shí)BL指令還將程序計(jì)數(shù)器PC的值(下一條指令地址)保存到LR寄存器中。指令的匯編語法格式如下:BL{<cond>}<target_address>如何從子程序中返回?L決定是否保存返回地址。當(dāng)有L時(shí),指令將下一條指令地址保存到LR寄存器中;當(dāng)無L時(shí)同B指令僅執(zhí)行跳轉(zhuǎn),當(dāng)前PC寄存器的值將不會保存到LR寄存器中。從指令的編碼可以看出,B與BL指令的唯一區(qū)別是bit[24],當(dāng)bit[24]=0是B指令,當(dāng)bit[24]=1是BL指令。BL跳轉(zhuǎn)指令編碼中signed_immed_24的含義同B指令。帶狀態(tài)切換的跳轉(zhuǎn)指令BXBX指令跳轉(zhuǎn)到指令中所指定的目標(biāo)地址,目標(biāo)地址處的指令既可以是ARM指令,也可以是Thumb指令。指令的匯編語法格式如下:

BX{<cond>}<Rm>BX指令

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論