第3章ARM指令集(2016年2月22日)_第1頁(yè)
第3章ARM指令集(2016年2月22日)_第2頁(yè)
第3章ARM指令集(2016年2月22日)_第3頁(yè)
第3章ARM指令集(2016年2月22日)_第4頁(yè)
第3章ARM指令集(2016年2月22日)_第5頁(yè)
已閱讀5頁(yè),還剩124頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

共129頁(yè)11第3章ARM指令集4學(xué)時(shí)本章主要內(nèi)容1、ARM指令集簡(jiǎn)介;2、ARM指令的尋址方式;3、ARM指令集。共129頁(yè)22本章教學(xué)要求掌握:ARM指令的尋址方式,ARM指令集。共129頁(yè)333.1ARM指令集簡(jiǎn)介

ARM微處理器的指令集是加載/存儲(chǔ)型的,具有效率高、代碼密度低的特點(diǎn),它的32位編碼能夠包含的信息量很大,每一條語(yǔ)句完成的功能很多。

在多寄存器操作指令中一次最多可以完成16個(gè)寄存器的數(shù)據(jù)傳送,而這樣的操作要是不在多寄存器操作的指令中,要執(zhí)行16條語(yǔ)句才能實(shí)現(xiàn)。共129頁(yè)4

一個(gè)簡(jiǎn)單的ARM匯編程序:

AREAExample,CODE,READONLY;聲明代碼段ExampleENTRY;標(biāo)識(shí)程序入口

CODE32;聲明32位ARM指令STARTMOVR0,#0;設(shè)置參數(shù)MOVR1,#10LOOPBLADD_SUB;調(diào)用子程序ADD_SUBBLOOPADD_SUBADDSR0,R0,R1;R0=R0+R1

MOVPC,LR;子程序返回

END;文件結(jié)束共129頁(yè)53.1.1ARM指令的分類與格式(1)ARM指令的分類

ARM指令可以分為:跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器(PSR)傳輸指令、Load/Store指令、協(xié)處理器指令和異常中斷產(chǎn)生指令六類。共129頁(yè)6①跳轉(zhuǎn)指令

跳轉(zhuǎn)指令用于控制程序的執(zhí)行流程、指令的特權(quán)等級(jí)和在ARM代碼與Thumb代碼之間進(jìn)行切換。②狀態(tài)寄存器傳輸指令

用于控制在存儲(chǔ)器和寄存器之間的數(shù)據(jù)傳輸、交換、加載、存儲(chǔ)。共129頁(yè)7③數(shù)據(jù)處理指令

用于操作片上的ALU、桶型移位器、乘法器以完成在31個(gè)32位的通用寄存器之間的高速數(shù)據(jù)處理。④ARM協(xié)處理器指令

ARM協(xié)處理器指令用于控制外部的協(xié)處理器,這些指令已開(kāi)發(fā)統(tǒng)一的方式用于片外功能指令集。ARM支持16個(gè)協(xié)處理器。共129頁(yè)8⑤異常中斷產(chǎn)生指令

ARM有兩條異常中斷產(chǎn)生指令,分別為軟中斷指令SWI和斷點(diǎn)中斷指令BKPT。⑥Load/Store內(nèi)存訪問(wèn)指令

Load指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中,Store指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存中。共129頁(yè)9(1)ARM指令的格式

ARM指令的格式如下:<opcode>{<condition>}{s}<Rd>,<Rn>{,<operand2>}

指令格式舉例:

LDRR3,[R6];讀取R6地址上的存儲(chǔ)單元內(nèi)容,執(zhí)行條件AL。

BEQNEXT;跳轉(zhuǎn)指令,執(zhí)行條件EQ即相等時(shí)跳轉(zhuǎn)到NEXT執(zhí)行。共129頁(yè)10

ADDSR0,R1,#2;加法指令,R0=R1+2,影響CPSR寄存器。

SUBNESR0,R1,#0X03;條件執(zhí)行減法運(yùn)算(NE),R0=R1-0X03,影響CPSR寄存器。

在ARM指令中,靈活地使用第二個(gè)操作數(shù)(operand2)能夠提高代碼效率,第二個(gè)操作數(shù)的形式如下:共129頁(yè)11①#immed_8r——8位常數(shù)表達(dá)式

但8位常數(shù)的使用是有限制的,具體如下:共129頁(yè)12

合法常量:0X3FC(0XFF<<2)、0、0XF0000000(0XF0<<24)、200(0XC8)、0XF0000001(0X1F<<28)。

常數(shù)表達(dá)式應(yīng)用舉例:

非法常量:0X1FE、511、0XFFFF、0X1010、0XF0000010。

MOVR0,#1

ANDR1,R2,#0X0F共129頁(yè)13②Rm——寄存器方式

LDRR0,[R2],#-1;讀取R2

地址上的存儲(chǔ)器單元內(nèi)容存入R0,且R2=R2-1

寄存器方式舉例:

SUBR1,R1,R2;R1=R1-R2

MOVPC,R0;PC=R0,程序跳轉(zhuǎn)到指定地址共129頁(yè)14

LDRR0,[R1],-R2;讀取R1地址上的存儲(chǔ)器單元內(nèi)容存入R0,且R1=R1-R2③Rm,shift——寄存器移位方式ASR#n;算數(shù)右移n位(1≤n≤32)LSL#n;邏輯左移n位(0≤n≤31)LSR#n;邏輯右移n位(1≤n≤32)ROR#n;循環(huán)右移n位(1≤n≤31)共129頁(yè)15RRX;帶擴(kuò)展的循環(huán)右移1位TypeRs;其中Type為ASR、LSL、LSR和ROR中的一種,Rs為偏移量寄存器,低8位有效。

寄存器偏移方式應(yīng)用舉例:ADDR2,R2,R2,LSL#3;R2=R2x9SUBR1,R1,R3,LSL#2;R1=R1-R3X4共129頁(yè)163.1.2ARM指令的條件碼域

當(dāng)處理器工作在ARM狀態(tài)時(shí),幾乎所有的指令均根據(jù)CPSR

中的條件碼的狀態(tài)和指令的條件域有條件執(zhí)行。當(dāng)指令的執(zhí)行條件滿足時(shí),指令被執(zhí)行,否則指令被忽略。

ARM指令的條件碼和助記符如下表所示:共129頁(yè)17條件碼條件碼助記符CPSR中條件標(biāo)志位值含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無(wú)符號(hào)數(shù)大于或等于0011CC/LOC=0無(wú)符號(hào)數(shù)小于0100MIN=1負(fù)數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0未溢出1000HIC=1且Z=0無(wú)符號(hào)數(shù)大于1001LSC=0且Z=1無(wú)符號(hào)數(shù)小于或等于1010GEN=1且V=1或N=0且V=0帶符號(hào)數(shù)大于或等于1011LTN=1且V=0或N=0且V=1帶符號(hào)數(shù)小于共129頁(yè)181100GTZ=0且N=V帶符號(hào)數(shù)大于1101LEZ=1或N!=V帶符號(hào)數(shù)小于或等于1110AL無(wú)條件執(zhí)行1111NVARMV3之前該執(zhí)行從不執(zhí)行3.1.3ARM指令可選后綴(1)S后綴

使用S

后綴后,指令執(zhí)行后程序狀態(tài)寄存器的條件標(biāo)志位將刷新。

有的指令不使用S后綴,也要刷新條件標(biāo)志位,如CMP、CMN、TST等指令。共129頁(yè)19(2)!后綴

在指令的地址表達(dá)式中含有!后綴時(shí),指令執(zhí)行后,基地址寄存器中的地址將會(huì)發(fā)生變化,變化的結(jié)果如下:①基址寄存器中的地址值(指令執(zhí)行后)=指令執(zhí)行前的值+地址偏移量;②如果指令不含!后綴,則地址值不會(huì)發(fā)生變化。共129頁(yè)20LDMIAR3,[R0,#04];R3=[R0+#04],沒(méi)有使用!后綴LDMIAR3,[R0,#04]!;R3=[R0+#04],使用!后綴R0=R0+#0X4(3)B后綴

B后綴的含義是:指令所涉及的數(shù)據(jù)是一個(gè)字節(jié),不是一個(gè)字或半字。共129頁(yè)21LDRR4,[R0,#12];R4=[R0+12],指令傳送一個(gè)字LDRBR4,[R0,#12];R4=[R0+12],指令傳送一個(gè)字節(jié)(4)T后綴

指令在特權(quán)模式下對(duì)存儲(chǔ)器的訪問(wèn),將被存儲(chǔ)器看作是用戶模式的訪問(wèn)。共129頁(yè)22

T

后綴使用受很多限制,一般只用在字傳送和無(wú)符號(hào)字節(jié)傳送中。在用戶模式下不可以選用,選用是沒(méi)有意義的;不能與前變址一起使用。LDRTR4,[R5];R4=[R5]T模式共129頁(yè)233.2ARM指令的尋址方式

尋址方式:就是處理器根據(jù)指令中給出的地址信息來(lái)尋找物理地址的方式。

ARM指令集支持有:立即數(shù)尋址、寄存器尋址、寄存器間接尋址、基址變址尋址、堆棧尋址、多寄存器尋址等。共129頁(yè)243.2.1立即尋址

立即尋址也叫立即數(shù)尋址。操作數(shù)本身就在指令中給出,只要取出了指令也就取到了操作數(shù)。MOVR1,#0XFF;R1=0XFFSUBSR0,R0,#2;R0=R0-2,影響標(biāo)志共129頁(yè)253.2.2寄存器尋址

寄存器尋址方式把寄存器中的數(shù)值作為操作數(shù)。MOVR1,R2;R1=R2ADDR0,R1,R2;R0=R1+R23.2.3寄存器間接尋址

以寄存器中的值作為操作數(shù)的地址,而操作數(shù)本身放在存儲(chǔ)器中。共129頁(yè)26MOVR1,[R2];R1=[R2]錯(cuò)誤指令LDRR1,[R2];R1=[R2]3.2.4基址變址尋址

就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。共129頁(yè)27LDRR2,[R3,#0X0C];R2=[R3+0X0C]STRR1,[R0,#-4]!;R0=R0-4,R1=[R0]LDRR1,[R0,R3,LSL#1];R1=[R0+R3x2]

指令可以在系統(tǒng)存儲(chǔ)器合理的范圍內(nèi)基址加上不超過(guò)4KB

的偏移量。

有前變址、自動(dòng)變址、后變址。共129頁(yè)28(1)前變址模式LDRR1,[R2,#0X5](2)自動(dòng)變址模式LDRR0,[R1,#4]!

;R0=[R1+4],R1=R1+4(3)后變址模式LDRR0,[R1],#4;R0=[R1],R1=R1+4共129頁(yè)29使用后變址尋址方式完成表復(fù)制程序:COPYADRR1,NEXT1;R1指向NEXT1

ADRR2,NEXT2;R2指向NEXT2LOOPLDRR0,[R1],#4;取一個(gè)數(shù)

STRR0,[R2],#4;復(fù)制一個(gè)數(shù)

……NEXT1;源數(shù)據(jù)……NEXT2;目標(biāo)數(shù)據(jù)共129頁(yè)303.2.5堆棧尋址(1)Full棧:堆棧指針指向棧頂元素;(2)Empty棧:堆棧指針指向第一個(gè)可用元素;(3)遞減棧:堆棧向內(nèi)存地址減少的方向生成;

根據(jù)不同的尋址方式,將堆棧分為以下4

種:共129頁(yè)3131(4)遞增棧:堆棧向內(nèi)存地址增加的方向生成。根據(jù)堆棧的不同種類,將其尋址方式分為以下4

種:(1)滿遞減FD(FullDescending);(2)空遞減ED(EmptyDescending);(3)滿遞增FA(FullAscending);(4)空遞增FA(EmptyAscending)。共129頁(yè)3232

在ARM指令中,堆棧尋址方式通過(guò)Load/Store

指令來(lái)實(shí)現(xiàn)。STMFDSP!,{R1-R7,LR};將R1~R7、LR入棧,滿遞減堆棧LDMFDSP!,{R1-R7,LR};數(shù)據(jù)出棧,放入R1~R7、LR寄存器共129頁(yè)333.2.6多寄存器尋址LDMIAR1,{R2、R3、R4、R5}3.2.7相對(duì)尋址

相對(duì)尋址是基址的一種變通,與基址尋址方式基本類似。相對(duì)尋址以程序計(jì)數(shù)器PC

的當(dāng)前值為基址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。共129頁(yè)34

BLNEXT;跳轉(zhuǎn)到子程序NEXT

處執(zhí)行……NEXT……MOVPC,LR;從子程序返回共129頁(yè)353.3ARM指令集

ARM指令集可以分為:跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、乘法指令與乘加指令、程序狀態(tài)寄存器訪問(wèn)指令、加載/存儲(chǔ)指令、批量數(shù)據(jù)加載/存儲(chǔ)指令、數(shù)據(jù)交換指令、移位指令、協(xié)處理器指令、異常產(chǎn)生指令等10

大類。共129頁(yè)36363.3.1跳轉(zhuǎn)指令

執(zhí)行流程的改變迫使程序計(jì)數(shù)器(PC)指向一個(gè)新的地址,指令集包含的跳轉(zhuǎn)指令如下:助記符說(shuō)明操作B跳轉(zhuǎn)指令PC←labelBL帶返回的連接跳轉(zhuǎn)PC←label(LR←BL后面的第一條指令)BX跳轉(zhuǎn)并切換狀態(tài)PC←Rm&0xFFFFFFFE,T←Rm&1BLX帶返回的跳轉(zhuǎn)并切換狀態(tài)PC←label,T←1;PC←Rm&0xFFFFFFFE,T←Rm&1;LR←BL后面的第一條指令共129頁(yè)3737

另一種實(shí)現(xiàn)指令跳轉(zhuǎn)的方式是通過(guò)直接向PC

寄存器中寫(xiě)入目標(biāo)地址值,實(shí)現(xiàn)在4GB

地址空間中任意跳轉(zhuǎn),這種跳轉(zhuǎn)又稱為長(zhǎng)跳轉(zhuǎn)。

如果在長(zhǎng)跳轉(zhuǎn)指令之前使用“MOVLR”或“MOVPC”等指令,可以保存將來(lái)返回的地址值,也就實(shí)現(xiàn)了在4GB的地址空間中的子程序調(diào)用。共129頁(yè)3838

B

指令與BL

指令的編碼格式如下:(1)跳轉(zhuǎn)指令B

及帶連接的跳轉(zhuǎn)指令BL共129頁(yè)3939

從代碼中看到L

控制了PC

與LR

寄存器之間的開(kāi)關(guān)。當(dāng)L=0

時(shí),該開(kāi)關(guān)斷開(kāi),指令為B指令;當(dāng)L=1

時(shí),該開(kāi)關(guān)接通,指令為BL

指令。B和

BL指令的助記符格式為:B{<cond>}<target>和BL{<cond>}<target>

跳轉(zhuǎn)指令也叫程序轉(zhuǎn)移指令。

可以跳轉(zhuǎn)到一個(gè)絕對(duì)地址,如:B0X1234。共129頁(yè)4040

B指令和BL

指令都是以一個(gè)24

位有符號(hào)數(shù)signed_immed_24

間接提供目標(biāo)地址,真正的目標(biāo)地址是由處理器根據(jù)這個(gè)有符號(hào)數(shù)和當(dāng)前的PC

值計(jì)算出來(lái)的。

具體計(jì)算為:先將signed_immed_24

左移兩位并擴(kuò)展為32位有符號(hào)數(shù),然后再將這32位有符號(hào)數(shù)與PC

的當(dāng)前值相加并回送PC。共129頁(yè)4141

BforwardADDR1,R2,#4

forwardSUBR1,R2,#56

B

和BL

指令轉(zhuǎn)移的偏移量為26

位,即轉(zhuǎn)移的跨度為前后32MB

地址空間。例:現(xiàn)已知寄存器R0

中存放了數(shù)據(jù)a,寄存器R1

中存放了數(shù)據(jù)b,編寫(xiě)一個(gè)程序段,求取a

和b

的最大公約數(shù)并將其存入寄存器R0

。共129頁(yè)4242

gcbCMPR0,R1;比較a和b的大小

SUBGTR0,R0,R1;如果a>b,則a=a-bSUBLTR1,R1,R0;如果a<b,則b=b-a

BNEgcb;如果a!=b,則返回gcbMOVPC,LR;如果a=b,則返回主程序

B

和BL

的區(qū)別在于:BL

在跳轉(zhuǎn)之前會(huì)把BL

指令的下一條指令地址(斷點(diǎn)地址)保存到連接寄存器LR(R14),因此程序在必要的時(shí)候可以通過(guò)將LR

的內(nèi)容進(jìn)行計(jì)算并加載到PC

中使程序返回到跳轉(zhuǎn)點(diǎn)。共129頁(yè)4343

BL

指令經(jīng)常被用來(lái)調(diào)用一個(gè)子程序。共129頁(yè)4444(2)帶狀態(tài)切換的跳轉(zhuǎn)指令BXBX指令的格式為:

BX{<cond>}Rm

BX指令的目標(biāo)地址由Rm值與#0XFFFFFFFE進(jìn)行“與”運(yùn)算得到。根據(jù)Rm

最低位的值,目標(biāo)地址處的指令既可以是ARM

指令,也可以是Thumb

指令。共129頁(yè)4545共129頁(yè)4646(3)帶連接和狀態(tài)切換的連接跳轉(zhuǎn)指令BLX

BLX

指令的格式有兩種:BLX<target>和

BLX{<cond>}Rm

以target

方式提供目標(biāo)地址的BLX

指令的功能是:把程序跳轉(zhuǎn)到指令中所指定的目標(biāo)地址繼續(xù)執(zhí)行,并同時(shí)將處理器的工作狀態(tài)從ARM

狀態(tài)切換到Thumb

狀態(tài)和將PC

的當(dāng)前內(nèi)容保存到寄存器LR

中。共129頁(yè)4747

而以Rm

方式提供目標(biāo)地址的BLX

指令,除了跳轉(zhuǎn)和將PC

保存到LR之外,也可進(jìn)行狀態(tài)切換,但其切換的依據(jù)是Rm最低位的值。如果值為0

,則目標(biāo)地址處應(yīng)為ARM

指令,如果值為1

,則目標(biāo)地址處應(yīng)為T(mén)humb

指令。共129頁(yè)483.3.2數(shù)據(jù)處理指令

數(shù)據(jù)處理指令分為:算術(shù)操作指令、按位邏輯操作指令、寄存器移位指令、比較操作。3.3.2.1算數(shù)操作指令

包括:加法指令A(yù)DD、減法指令SUB、逆向減法指令RSB、帶進(jìn)位加法指令A(yù)DC、帶進(jìn)位減法指令SBC、帶借位逆向減法指令RSC。共129頁(yè)4949(1)ADD指令

加法指令A(yù)DD的格式為:ADD{<cond>}{S}<Rd>,<Rn>,<operand2>

ADD

指令把第1

源操作數(shù)Rn

和第2

源操作數(shù)operand2

相加后,將結(jié)果存放到目的操作數(shù)Rd。

Rn

為寄存器尋址;operand2

可以為:寄存器尋址、立即尋址、帶移位預(yù)處理的寄存器尋址。共129頁(yè)5050

ADD指令的執(zhí)行如下:共129頁(yè)5151ADDR0,R1,R2;R0←(R1)+(R2)ADDR0,R1,#255

;R0←(R1)+255ADDR0,R2,R3,LSL#1;R0←(R2)

+(R3<<1)受影響的CPSR標(biāo)志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0,則Z=1,否則Z=0C運(yùn)算結(jié)果有進(jìn)位C=1,否則C=0V運(yùn)算結(jié)果有溢出V=1,否則V=0改為OX256行嗎?例子:共129頁(yè)5252(2)SUB指令

SUB指令的格式為:SUB{<cond>}{S}<Rd>,<Rn>,<operand2>

SUB指令把Rn

作為被減數(shù),operand2

作為減數(shù)進(jìn)行減法運(yùn)算,然后將結(jié)果存放在Rd。operand2可以是:寄存器尋址方式、立即尋址方式、帶移位預(yù)處理的寄存器尋址方式。共129頁(yè)5353

SUB的執(zhí)行流程為:共129頁(yè)5454SUBR0,R1,R2;R0←(R1)-(R2)SUBR0,R1,#256;R0←(R1)-256SUBR0,R2,R3,LSL#1;R0←(R2)-

(R3<<1)受影響的CPSR標(biāo)志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0則Z=1,否則Z=0C運(yùn)算結(jié)果有借位則C=0,否則C=1V運(yùn)算結(jié)果有溢出則V=1,否則V=0例:共129頁(yè)5555(3)ADC指令

ADC指令的格式為:ADC{<cond>}{S}<Rd>,<Rn>,<operand2>

ADC

指令把三個(gè)數(shù)進(jìn)行加法運(yùn)算。即把Rn

與operand2

相加,然后再加上CPRS中的C

標(biāo)志位的值,最后將結(jié)果存放到目的操作數(shù)Rd

中。共129頁(yè)5656

Rn

為寄存器尋址;operand2

可以為:寄存器尋址、立即數(shù)尋址、帶移位預(yù)處理的寄存器尋址。共129頁(yè)5757

ADC

通常用來(lái)實(shí)現(xiàn)字長(zhǎng)大于32

位的加法運(yùn)算。

標(biāo)志位的修改同ADD、只修改N、Z、C、V。

例:有兩個(gè)128位數(shù),第一個(gè)數(shù)由高到低存放在寄存器R7~R4

中,第二個(gè)數(shù)由高到低存放在寄存器R11~R8

中,請(qǐng)編寫(xiě)程序把兩個(gè)數(shù)相加,運(yùn)算結(jié)果由高到低存放到寄存器R3~R0中。共129頁(yè)58ADDSR0,R4,R8;加低位字,不帶進(jìn)位ADCSR1,R5,R9;加第二個(gè)字,帶進(jìn)位ADCSR2,R6,R10;加第三個(gè)字,帶進(jìn)位ADCSR3,R7,R11;加第四個(gè)字,帶進(jìn)位實(shí)現(xiàn)程序?yàn)椋哼@段程序有缺陷嗎?能否不要這些S

?共129頁(yè)5959(4)SBC指令

SBC指令的格式為:SBC{<cond>}{S}<Rd>,<Rn>,<operand2>

SBC

指令把Rn

作為被減數(shù),operand2作為減數(shù)進(jìn)行減法運(yùn)算,然后再減去CPSR

中C

條件標(biāo)志位的反碼,最后將結(jié)果存入Rd。共129頁(yè)6060

SBC指令執(zhí)行流程為:共129頁(yè)6161SBCSR0,R1,R2;R0←(R1)-(R2)-!C

該指令主要用于字長(zhǎng)大于32

位的數(shù)據(jù)的減法運(yùn)算。

標(biāo)志位的修改同SUB。例子:共129頁(yè)6262(5)RSB指令

RSB指令的格式為:RSB{<cond>}{S}<Rd>,<Rn>,<operand2>

RSB

指令之所以被稱為逆向減法指令,是因?yàn)樵撝噶畎裲perand2

作為被減數(shù),而把Rn

作為減數(shù)來(lái)進(jìn)行減法運(yùn)算,運(yùn)算結(jié)果仍然被存入Rd。共129頁(yè)6363RSBR0,R1,R2;R0←(R2)-(R1)RSBR0,R1,#256;R0←256-(R1)RSBR0,R2,R3,LSL#1;R0←(R3<<1)-

(R2)例子:共129頁(yè)6464(6)RSC指令

RSC指令的格式為:RSC{<cond>}{S}<Rd>,<Rn>,<operand2>

RSC

指令把operand2

作為被減數(shù),而把Rn

作為減數(shù),然后再減去CPSR中的C

條件標(biāo)志位的反碼,最后將結(jié)果存入Rd。

RSCR0,R1,R2共129頁(yè)653.3.2.2按位邏輯操作指令按位邏輯操作指令包括:邏輯與操作指令A(yù)ND、邏輯或操作指令ORR、邏輯異或操作指令EOR

以及位清除指令BIC。(1)AND指令A(yù)ND指令的格式為:AND{<cond>}{S}<Rd>,<Rn>,<operand2>

AND

指令把Rn

和operand2

按位

進(jìn)行邏輯“與”運(yùn)算,并把結(jié)果存入Rd。共129頁(yè)6666

AND指令執(zhí)行流程:共129頁(yè)6767例:ANDR0,R0,#3;該指令保持R0的0、1位,其余位清零受影響的CPSR標(biāo)志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0則Z=1,否則Z=0CC=0共129頁(yè)6868(2)ORR指令ORR指令的格式為:ORR{<cond>}{S}<Rd>,<Rn>,<operand2>

ORR

指令把Rn和operand2

按位進(jìn)行邏輯“或”運(yùn)算,并把結(jié)果存入Rd。ORRR0,R0,#3;該指令設(shè)置R0的0、1位,其余位不變例:請(qǐng)把寄存器R2中的高8位數(shù)據(jù)傳送到寄存器R3的低8位。共129頁(yè)6969MOVR0,R2,LSR#24;將R2右移24位,即將其高8位移至低8位送R0。ORRR3,R0,R3,LSL#8;將R3左移8位后將R0低8位送至R3。

標(biāo)志位的影響同AND。注意:R2原來(lái)的內(nèi)容沒(méi)有變注意:R3原來(lái)的高24位內(nèi)容變了共129頁(yè)7070(3)EOR指令EOR指令的格式為:EOR{<cond>}{S}<Rd>,<Rn>,<operand2>

EOR指令把Rn

和operand2

按位進(jìn)行邏輯“異或”運(yùn)算,并把結(jié)果存入Rd。EORR0,R0,#3;該指令反轉(zhuǎn)R0的0、1位,其余位保持不變。

標(biāo)志位的修改同AND。共129頁(yè)7171(4)BIC指令

BIC指令的格式為:BIC{<cond>}{S}<Rd>,<Rn>,<operand2>

BIC指令的功能是清除Rn

的某些位,并把結(jié)果存入Rd。共129頁(yè)7272

Rn為寄存器尋址方式;operand2

可以是寄存器尋址方式,也可以是立即數(shù)尋址方式。Operand2

為32位掩碼,如果在掩碼中設(shè)置了某一位,則清除這一位,未設(shè)置的掩碼位保持不變。BICR0,R0,#0xB;該指令清除R0中的0、1和3位,其余位保持不變。

標(biāo)志位的修改同AND。共129頁(yè)733.3.2.3寄存器移位操作指令

包括:數(shù)據(jù)傳送指令MOV和數(shù)據(jù)非傳送指令MVN。(1)MOV指令

MOV

指令將一個(gè)數(shù)N

送到目標(biāo)寄存器Rd

,其中N

可以是寄存器,也可以是立即數(shù)。MOV指令的格式為:

MOV{<cond>}{S}<Rd>,<operand2>共129頁(yè)74

MOV指令的執(zhí)行流程:共129頁(yè)7575例:MOVR2,#0x7E

;將立即數(shù)0x7E傳送到寄存器R2中MOVR1,R0,LSL#3

;將寄存器R0*8傳送到寄存器R1受影響的CPSR標(biāo)志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0,則Z=1,否則Z=0CC=0共129頁(yè)7676(2)MVN指令

MVN指令的格式為:MVN{<cond>}{S}<Rd>,<operand2>

MVN指令在進(jìn)行數(shù)據(jù)傳送之前,先把源操作數(shù)operand2按位取反,然后再傳送到目的寄存器Rd。MVNR0,#0;將立即數(shù)0取反傳送到寄存器R0中,完成后R0=-1。

標(biāo)志修改同MOV指令,只修改N、Z、C。共129頁(yè)773.3.2.4比較操作指令

包括:比較指令CMP、負(fù)數(shù)比較指令CMN、位測(cè)試指令TST以及相等測(cè)試指令TEQ。(1)CMP指令CMP指令的格式為:CMP{<cond>}<Rd>,<operand2>

CMP指令把Rd

作為被減數(shù)和operand2

進(jìn)行一次減法運(yùn)算操作,但不存儲(chǔ)運(yùn)算結(jié)果,只根據(jù)結(jié)果來(lái)更新CPSR

的相應(yīng)條件標(biāo)志位N、Z、C、V。共129頁(yè)7878受影響的CPSR標(biāo)志位取值N運(yùn)算結(jié)果的第31位被復(fù)制到NZ運(yùn)算結(jié)果為0則Z=1,否則Z=0C運(yùn)算結(jié)果有借位則C=0,否則C=1V運(yùn)算結(jié)果有溢出則V=1,否則V=0CMPR1,R0;(R1)-(R0);根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位。CMPR1,#100;(R1)-100;根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位。共129頁(yè)7979

CMN指令把Rd

作為被減數(shù)與operand2

的反進(jìn)行一次減法運(yùn)算,但不存儲(chǔ)結(jié)果,只更新CPSR

中條件標(biāo)志位。(2)CMN指令

CMN指令的格式為:CMN{<cond>}<Rd>,<operand2>注意:比較類指令本身帶有更新CPSR的功能,故在該指令中不能使用后綴S。共129頁(yè)8080(3)TST測(cè)試指令TST指令的格式為:TST{<cond>}<Rd>,<operand2>

TST指令的功能是把Rd

和operand2

按位進(jìn)行邏輯“與”運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR

中的條件標(biāo)志位的值。Rd

是要測(cè)試的數(shù)據(jù),operand2

是一個(gè)掩碼。該指令一般用來(lái)檢測(cè)是否設(shè)置了特定的位。TSTR1,#0x5;測(cè)試寄存器R1中的第0位和第2位是否是1。共129頁(yè)8181

TEQ指令的格式為:TEQ{<cond>}<Rd>,<operand2>

TEQ指令用于把一個(gè)寄存器的內(nèi)容和另一個(gè)寄存器的內(nèi)容或立即數(shù)進(jìn)行按位“異或”運(yùn)算,并根據(jù)運(yùn)算結(jié)果更新CPSR

中條件標(biāo)志位的值。該指令通常用于比較Rd

和Rn是否相等。TEQR1,R2;將R1的值與R2的值按位“異或”,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位。(4)TEQ指令共129頁(yè)823.3.3乘法指令與乘加指令

主要包括:乘法指令MUL、乘加指令MLA、無(wú)符號(hào)長(zhǎng)乘法指令UMULL、長(zhǎng)乘加指令UMLAL、帶符號(hào)長(zhǎng)乘法指令SMULL以及長(zhǎng)乘加指令SMLAL。(1)MUL指令

MUL指令的格式為:MUL{<cond>}{S}<Rd>,<Rm>,<Rs>

MUL

指令把Rm

作為被乘數(shù),Rs

作為乘數(shù)進(jìn)行乘法運(yùn)算,并把結(jié)果存入Rd。共129頁(yè)8383

MUL的執(zhí)行流程如下:共129頁(yè)8484MULR0,R1,R2;R0←(R1)X(R2)MULSR0,R1,R2;R0←(R1)X(R2),同時(shí)更新CPSR相關(guān)標(biāo)志位受影響的CPSR標(biāo)志位取值N寄存器Rd[31]被復(fù)制到NZ如果Rd為0則Z=1,否則Z=0例子:共129頁(yè)8585(2)MLA指令

MLA指令的格式為:MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>

MLA

指令把Rm

作為被乘數(shù),Rs

作為乘數(shù),然后再將乘積加上Rn,最后將結(jié)果存入Rd。MLAR0,R1,R2,R3;R0←(R1)X(R2)+(R3)MLASR0,R1,R2,R3;R0←(R1)X(R2)+(R3),并更新CPSR標(biāo)志位

標(biāo)志位的修改同MUL。共129頁(yè)8686(3)SMULL指令

SMULL指令的格式為:SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>

SMULL

指令把Rm

作為被乘數(shù),Rs

作為乘數(shù)進(jìn)行乘法運(yùn)算,并把結(jié)果的低32位存入目的寄存器RdLo,結(jié)果的高32位存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址。共129頁(yè)8787

SMULLR0,R1,R2,R3;R0←(R2)X(R3)的低32位,R1←(R2)X(R3)的高32位受影響的CPSR標(biāo)志位取值N寄存器RdHi[31]被復(fù)制到NZ如果RdHi且Rdlo為0,則Z=1,否則Z=0共129頁(yè)8888(4)SMLAL指令SMLAL指令格式為:SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>

SMLAL

指令把Rm

作為被乘數(shù),Rs

作為乘數(shù)進(jìn)行乘法運(yùn)算,并把結(jié)果的低32位同RdLo

原有的值相加后再存入目的寄存器RdLo

;同樣結(jié)果的高32位同RdHi

原有的值相加后再存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址。共129頁(yè)8989

SMLALR0,R1,R2,R3;R0←(R2)X(R3)的低32位+R0,R1←(R2)X(R3)的高32位+R1

標(biāo)志的修改同SMULL。共129頁(yè)9090(5)UMULL指令

UMULL指令的格式為:UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>

UMULL指令把Rm

作為被乘數(shù),Rs

作為乘數(shù)進(jìn)行乘法運(yùn)算,并把結(jié)果的低32位存入目的寄存器RdLo

;結(jié)果的高32位存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址,且兩個(gè)源操作數(shù)應(yīng)為無(wú)符號(hào)數(shù)。共129頁(yè)9191

UMULLR0,R1,R2,R3;

R0←(R2)X(R3)的低32位,

R1←(R2)X(R3)的高32位

標(biāo)志的修改同SMULL。共129頁(yè)9292

UMLAL

指令把Rm

作為被乘數(shù),Rs

作為乘數(shù)進(jìn)行乘法運(yùn)算,并把結(jié)果的低32位同RdLo

原有的值相加后再存入目的寄存器RdLo;同樣結(jié)果的高32位同RdHi

原有的值相加后再存入目的寄存器RdHi。所有操作數(shù)均為寄存器尋址,且兩個(gè)源操作數(shù)應(yīng)為無(wú)符號(hào)數(shù)。(6)UMLAL指令

UMLAL指令格式為:UMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>共129頁(yè)9393

UMLALR0,R1,R2,R3;

R0←(R2)X(R3)的低32位+(R0),R1←(R2)X(R3)的高32位+(R1)

標(biāo)志的修改同SMULL。共129頁(yè)9494

MRS指令的格式為:

MRS{<cond>}<Rd>,CPSR

MRS{<cond>}<Rd>,SPSR

MRS

指令的功能是將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器Rn。MRSR0,CPSR;傳送CPSR的內(nèi)容到R0MRSR0,SPSR;傳送SPSR的內(nèi)容到R0(1)MRS指令3.3.4程序狀態(tài)寄存器訪問(wèn)指令共129頁(yè)9595

32

位的程序狀態(tài)寄存器可以分為4個(gè)域,這4個(gè)域在指令中可以分別用f、s、x、c

來(lái)表示。域在指令中的表示位域說(shuō)明f[31:24]條件標(biāo)志域s[23:16]狀態(tài)位域x[15:8]擴(kuò)展位域c[7:0]控制位域(2)MSR指令

程序狀態(tài)寄存器常用的兩個(gè)域?yàn)椋簵l件標(biāo)志位域和控制位域。共129頁(yè)9696在ARMV5及以上版本的E系列處理器中,用Q標(biāo)志位指示增強(qiáng)的DSP運(yùn)算指令是否發(fā)生了溢出。在其他版本的處理器中,Q標(biāo)志位無(wú)定義。共129頁(yè)9797

MSR指令的格式為:MSR{<cond>}CPSR_<fields>,<operand2>MSR{<cond>}SPSR_<fields>,<operand2>

MSR指令可以把operand2

的內(nèi)容傳送到程序狀態(tài)寄存器的特定域中。其中operand2可以為通用寄存器或立即數(shù),fields

用于指定程序狀態(tài)寄存器中需要操作的位域,為f、s、x、c。共129頁(yè)9898MSRCPSR,R0;傳送R0的內(nèi)容到CPSRMSRSPSR,R0;傳送R0的內(nèi)容到SPSRMSRCPSR_c,R0;傳送R0的內(nèi)容到CPSR,但僅僅修改CPSR中的控制位域MSRCPSR_CFXS,R0;傳送R0的內(nèi)容到CPSR,修改所有域

C、F、X、S大小寫(xiě)都可以,順序也可任意。共129頁(yè)993.3.5加載/存儲(chǔ)指令

包括字?jǐn)?shù)據(jù)加載指令LDR

、字節(jié)數(shù)據(jù)加載指令LDRB

、半字?jǐn)?shù)據(jù)加載指令LDRH

;字?jǐn)?shù)據(jù)存儲(chǔ)指令STR

、字節(jié)數(shù)據(jù)存儲(chǔ)指令STRB

、半字?jǐn)?shù)據(jù)存儲(chǔ)指令STRH。(1)LDR指令

字加載指令LDR

的格式為:LDR{<cond>}<Rd>,<address_mode>

LDR指令的功能是把存儲(chǔ)在存儲(chǔ)器中的一個(gè)32位字?jǐn)?shù)據(jù)傳送到目的操作數(shù)Rd。共129頁(yè)100100例:已知(R0)=0X00000000和(R1)=0X00009000,并已知在存儲(chǔ)器中首地址為0X00009000

的區(qū)域中存放了數(shù)據(jù)0X01010101,在首地址為0X00009004

的區(qū)域存放了數(shù)據(jù)0X02020202。試寫(xiě)出執(zhí)行了指令LDRR0,[R1,#4]后R0

和R1

中的數(shù)據(jù)。(R0)=0X02020202(R1)=0X00009000共129頁(yè)101101例:條件如上題,試寫(xiě)出執(zhí)行了指令LDRR0,[R1,#4]!后的R0

和R1

中的數(shù)據(jù)。(R0)=0X02020202(R1)=0X00009004例:條件如上題,試寫(xiě)出執(zhí)行了指令LDRR0,[R1],#4后R0

和R1

中的數(shù)據(jù)。(R0)=0X01010101(R1)=0X00009004共129頁(yè)102LDRR1,[R0,#0X12];將R0+12地址處的數(shù)據(jù)讀出,保存到R1中(R0的值不變)LDRR1,[R0,R2,LSL#02];將R0+R*4地址處的數(shù)據(jù)讀出,保存到R1中(R0、R2的值不變)LDRRd,label;label為程序標(biāo)號(hào),label必須是當(dāng)前指令-4~4KB范圍內(nèi)共129頁(yè)103103(2)LDRB指令

字節(jié)加載指令LDRB

的格式為:

LDR{cond}B<Rd>,<address_mode>

LDRB

指令的功能是從存儲(chǔ)器中將一個(gè)8

位的字節(jié)數(shù)據(jù)傳輸?shù)絉d,同時(shí)將寄存器的高24位清零。LDRBR0,[R1,#8];R0←((R1)+8),并將R0的高24位清零。共129頁(yè)104104(3)LDRH指令

半字加載指令LDRH

的格式為:

LDR{cond}H<Rd>,<address_mode>

LDRH

指令的功能是把存儲(chǔ)器中的16

位半字?jǐn)?shù)據(jù)傳送到Rd,同時(shí)將寄存器的高16位清零。LDRHR0,[R1,#8];R0←((R1)+8),并將

R0的高16位清零共129頁(yè)105105

字存儲(chǔ)指令STR

的格式如下:

STR<Rd>,<address_mode>(4)STR指令

STR指令的功能是把一個(gè)32

位源操作數(shù)傳送到存儲(chǔ)器中。STRR0,[R1,#8];(R0)→((R1)+8)共129頁(yè)106106①變量訪問(wèn)NumCountequ0x4000300

LDRR0,=NumCount

LDRR1,[R0]

ADDR1,R1,#1

STRR1,[R0]

關(guān)于匯編有ARMASM和GNUASM,兩者形式上有差異,ARMASM的偽代碼前不要“.”,偽代碼要頂格書(shū)寫(xiě)。共129頁(yè)107②GPIO設(shè)置GPIO_BASEequ0xE0028000……

LDRR0,=GPIO_BASE

LDRR1,=0X00FFFF00

STRR1,[R0,#0X0C]……只能用下劃線。共129頁(yè)108③程序跳轉(zhuǎn)……

MOVR2,R2,LSL#2LDRPC,[PC,R2]

NOPFUN_TABDCDFUN_SUB0

DCDFUN_SUB1DCDFUN_SUB2……

只能用下劃線,ARMASM中沒(méi)有WORD,該程序不好理解。共129頁(yè)109109

字節(jié)存儲(chǔ)指令STRB

的格式為:

STR{cond}B<Rd>,<address_mode>(5)STRB指令

STRB

指令的功能是把一個(gè)32

位源操作數(shù)的低8位傳送到存儲(chǔ)器中。STRBR0,[R1,#8];(R0)的低8位→((R1)+8)共129頁(yè)110110

半字存儲(chǔ)指令STRH

的格式為:STR{cond}H<Rd>,<address_mode>

STRH

指令的功能是把一個(gè)32

位源操作數(shù)的低16位傳送到存儲(chǔ)器中。STRHR0,[R1,#8];(R0)→((R1)+8)(6)STRH指令共129頁(yè)111111

多寄存器的Load/Store

內(nèi)存訪問(wèn)指令也叫批量加載/存儲(chǔ)指令,它可以實(shí)現(xiàn)一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳送數(shù)據(jù)。

加載指令LDM用于將一片連續(xù)的存儲(chǔ)器中的數(shù)據(jù)傳送到多個(gè)寄存器;批量數(shù)據(jù)存儲(chǔ)指令STM

則完成相反的功能。3.3.6批量數(shù)據(jù)加載/存儲(chǔ)指令共129頁(yè)112112

LDM和STM指令的格式分別為:LDM{<cond>}{mode}<Rd>{!},<reglist>{^}STM{<cond>}{mode}<Rd>{!},<reglist>{^}

Rd

為數(shù)據(jù)塊的基地址寄存器,除R15

之外其他寄存器都可以作為基地址寄存器。

reglist

為存儲(chǔ)數(shù)據(jù)塊的寄存器列表,其中包含一個(gè)或多個(gè)序號(hào)從小到大排列的寄存器。當(dāng)寄存器不連續(xù)時(shí),中間使用“,”隔開(kāi)。共129頁(yè)113113

“!”為可選后綴。若選用該后綴,則當(dāng)數(shù)據(jù)塊傳送完畢之后,基址寄存器Rd

會(huì)保存數(shù)據(jù)塊最后地址;否則基地址寄存器Rd

的內(nèi)容不變。

地址中的內(nèi)容與寄存器列表的對(duì)應(yīng)關(guān)系:小地址對(duì)應(yīng)小寄存器編號(hào),大地址對(duì)應(yīng)大寄存器編號(hào)。共129頁(yè)114114

“^”為可選后綴。當(dāng)指令為L(zhǎng)DM

且寄存器列表中包含R15(PC)時(shí),選用該后綴表示除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到CPSR

;而當(dāng)寄存器列表中不包含R15(PC)時(shí),使用該后綴則表示在用戶模式中進(jìn)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論