第11、12節(jié)課(第3章第4節(jié))_第1頁
第11、12節(jié)課(第3章第4節(jié))_第2頁
第11、12節(jié)課(第3章第4節(jié))_第3頁
第11、12節(jié)課(第3章第4節(jié))_第4頁
第11、12節(jié)課(第3章第4節(jié))_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

主要內(nèi)容1324ARM體系結(jié)構(gòu)概述

編程模型ARM基本尋址方式ARM指令集5ARM9TDMI內(nèi)核6ARM9與ARM7的比較ARM920T核73.4.1指令分類及格式

1、指令分類

ARM指令集是加載/存儲型的,也即指令集僅能處理寄存器中的數(shù)據(jù),而且處理結(jié)果都要放回到寄存器中。對系統(tǒng)存儲器的訪問則需要通過專門的Load/Store指令來完成。

2、指令格式

ARM指令使用的基本格式如下:

<opcode>{cond}{S}<Rd><Rn>{,operand2}

opcode:操作碼cond:可選條件碼S:可選后綴,若指定S,則根據(jù)指令執(zhí)行結(jié)果更新CPSR中條件碼Rd:目的寄存器Rn:存放第一操作數(shù)的寄存器operand2:第二個操作數(shù)3.4.1條件執(zhí)行幾乎所有的ARM指令均可包含一個可選的條件碼,句法說明中以{cond}表示,只有在CPSR中的條件碼標(biāo)志滿足指定的條件時,帶條件碼的指令才能執(zhí)行。并使用后綴“S”來區(qū)分是否根據(jù)執(zhí)行結(jié)果修改條件碼標(biāo)志。操作碼[31:28]助記符后綴標(biāo)志含義0000EQZ置位相等0001NEZ清零不等0010CS/HSC置位大于或等于(無符號>=)0011CC/LOC清零小于(無符號<)0100MIN置位負0101PLN清零正或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位且Z清零大于(無符號>)1001LSC清零或Z置位小于或等于(無符號<=)1010GEN和V相同帶符號>=1011LTN和V不同帶符號<1100GTZ清零且N和V相同帶符號>1101LEZ置位或N和V不同帶符號<=1110AL任何總是(通常省略)3.4.2指令分類說明

32位ARM指令集由13種基本指令類型組成,分成4大類:3種類型的存儲器訪問指令:控制存儲器和寄存器之間的數(shù)據(jù)傳送。一種類型用于優(yōu)化的靈活尋址;另一種類型用于快速上下文切換;第三種類型用于交換數(shù)據(jù)。3種類型的數(shù)據(jù)處理指令:使用片內(nèi)ALU、桶形移位器和乘法器針對31個寄存器完成高速數(shù)據(jù)處理操作。4種類型的分支指令:控制程序執(zhí)行流程、指令優(yōu)先級以及ARM代碼和Thumb代碼的切換。3種類型的協(xié)處理器指令:專用于控制外部協(xié)處理器。這些指令以開放和統(tǒng)一的方式擴展了指令集的片外功能。

ARM存儲器訪問指令(1)LDR和STR——字和無符號字節(jié)字節(jié)加載是用“0”擴展到32位。LDR和STR都有如下4種可能的形式:

零偏移:Rn的值作為傳送數(shù)據(jù)的地址。句法:

op{cond}{B}{T}Rd,[Rn]

前索引偏移:在數(shù)據(jù)傳送之前,將偏移量加到Rn中。其結(jié)果作為傳送數(shù)據(jù)的存儲器地址。若使用后綴“!”,則結(jié)果寫回到Rn中,且Rn不允許是R15。句法:

op{cond}{B}Rd,[Rn,Flexoffset]{!}

程序相對偏移:程序相對偏移是前索引形式的另一種版本。匯編器由PC計算偏移量,并將PC作為Rn生成前索引指令。不能使用后綴“!”。句法:op{cond}{B}Rd,label

后索引偏移:Rn的值用做傳送數(shù)據(jù)的存儲器地址。在數(shù)據(jù)傳送后,將偏移量加到Rn中。結(jié)果寫回到Rn。Rn不允許是R15。句法:op{cond}{B}{T}Rd,[Rn],Flexoffset

ARM存儲器訪問指令(1)LDR和STR——字和無符號字節(jié)[例子]LDR R8,[R10];R8[R0]LDRNER2,[R5,#960]!;(有條件地)R2[R5+960],R5R5+960STR R2,[R9,#consta-struc];consta-struc是常量的表達式,該

;常量值的范圍為0~4095STRBR0,[R3,-R8,ASR#2];R0[R3-R8/4],存儲R0的最低有效

;字節(jié),R3和R8不變STR R5,[R7],#-8;R5[R7],R1R7-8LDR R0,localdata;加載一個字,該字位于標(biāo)號lacaldata所在地址(2)LDR和STR——半字和帶符號字節(jié)

ARM存儲器訪問指令這些指令有4種可能的形式:零偏移、前索引偏移、程序相對偏移和后索引偏移。以同樣的順序,4種形式的句法為op{cond}typeRd,[Rn]op{cond}typeRd,[Rn,offset]{!}op{cond}typeRd,labelop{cond}typeRd,[Rn],offset其中:type必須是以下所列的其中之一:SH對帶符號半字(僅LDR);H對無符號半字;SB對帶符號字節(jié)(僅LDR)。label程序相對偏移表達式。

label必須是在當(dāng)前指令的±255字節(jié)范圍內(nèi)。offset加在Rn上的偏移量。

ARM存儲器訪問指令(2)LDR和STR——半字和帶符號字節(jié)[例子]LDREQSHR11,[R6];(有條件地)R11[R6],加載16位半字,;帶符號擴展到32位LDRHR1,[R0,#22];R1[R0+22],加載16位半字,零擴展到32位STRHR4,[R0,R1]!;R4[R0+R1],存儲最低的有效半字到R0+R1;地址開始的兩個字節(jié),地址寫回到R0LDRSB R6,constf;加載位于標(biāo)號constf地址中的字節(jié),帶符號擴展(3)LDR和STR——雙字

ARM存儲器訪問指令加載兩個相鄰的寄存器和存儲兩個相鄰的寄存器,64位雙字。這些指令有4種可能的形式:零偏移、前索引偏移、程序相對偏移、后索引偏移。以同樣的順序,4種形式的句法為op{cond}DRd,[Rn]op{cond}DRd,[Rn,offset]{!}op{cond}DRd,labelop{cond}DRd,[Rn],offset[例子]LDRD R6,[R11]LDRMID R4,[R7],R2STRD R4,[R9,#24]STRD R0,[R9,-R2]!LDREQD R8,abc4(4)LDM和STM

ARM存儲器訪問指令加載多個寄存器(LDM)和存儲多個寄存器(STM)。可以傳送R0-R15的任何組合。句法:op{cond}modeRn{!},reglist{^}其中:mode

是IA/IB/DA/DB/FD/ED/FA/EA中的一個.Rn

基址寄存器,裝有傳送數(shù)據(jù)的初始地址。Rn不允許是R15。!

可選后綴。若有“!”,則最后的地址寫回到Rn。reglist

加載或存儲的寄存器列表,包含在括號中。^可選后綴,不允許在用戶模式或系統(tǒng)模式下使用。若op是LDM且reglist中包含PC(R15),那么除了正常的多寄存器傳送外,將SPSR也拷貝到CPSR中。這用于從異常處理返回,僅在異常模式下使用。數(shù)據(jù)傳入或傳出的是用戶模式的寄存器,而不是當(dāng)前模式的寄存器。

ARM存儲器訪問指令(4)LDM和STM[例子]LDMIAR8,{R0,R2,R9}STMDBR1!,{R3-R6,R11,R12}STMFDR13!,{R0,R4-R7,LR};寄存器進棧LDMFDR13!,{R0,R4-R7,PC};寄存器出棧,從子程序返回(5)PLD

ARM存儲器訪問指令Cache預(yù)加載。使用PLD(PreLoaD)提示存儲系統(tǒng)從后面幾條新指令所指定的存儲器地址加載。存儲系統(tǒng)可使用這種方法加速以后的存儲器訪問。句法:PLD[Rn{Flexoffset}][例子]PLD [R2]PLD [R15,#280]PLD [R9,#-2481]PLD [R0,#av*4];av*4必須在匯編時求值,范圍為-4095-4095PLD [R0,R2]PLD [R5,R8,LSL#2](6)SWP

ARM存儲器訪問指令在寄存器和存儲器之間進行數(shù)據(jù)交換。使用SWP來實現(xiàn)信號量。句法:SWP{cond}{B}Rd,Rm,[Rn]其中:B可選后綴。若有B,則交換字節(jié);否則,交換32位字。RdARM寄存器。數(shù)據(jù)從存儲器加載到Rd。RmARM寄存器。Rm的內(nèi)容存儲到存儲器。Rm可以與Rd相同。在這種情況下,寄存器的內(nèi)容與存儲器的內(nèi)容進行交換。RnARM寄存器。Rn的內(nèi)容指定要進行數(shù)據(jù)交換的存儲器的地址。Rn必須與Rd和Rm不同。

ARM數(shù)據(jù)處理指令數(shù)據(jù)處理類指令格式:<opcode>{<cond>}{S}{Rd},{Rn},<shifter_operand>opcode:操作碼,如ADD、SUB、ORRcond:條件碼S:本指令是否更新CPSR中的狀態(tài)標(biāo)志位Rd:目標(biāo)寄存器Rn:第一個源寄存器shifter_operand:復(fù)合的源操作數(shù),其格式:立即數(shù) ADDR1,R2,#0x35寄存器 SUBSR3,R2,R1寄存器移位 ADDEQSR9,R5,R5,LSL#3SUBR3,R2,R1,RORR7

ARM數(shù)據(jù)處理指令算術(shù)/邏輯運算指令

ADD指令

ADD指令的格式為:

ADD{條件}{S}目的寄存器,操作數(shù)1,操作數(shù)2

ADD指令用于把兩個操作數(shù)相加,并將結(jié)果存放到目的寄存器中。操作數(shù)1應(yīng)是一個寄存器,操作數(shù)2可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。

指令示例:

ARM數(shù)據(jù)處理指令A(yù)DD

R0,R1,R2

;R0=R1+R2

ADD

R0,R1,#256

;R0=R1+256

ADD

R0,R2,R3,LSL#1

;R0=R2+(R3<<1)

ADC

帶進位加法指令。將operand2的數(shù)據(jù)與Rn的值相加,再加上CPSR中的C條件標(biāo)志位。結(jié)果保存到Rd寄存器。指令格式如下:

ADC{cond}{S}Rd,Rn,operand2

ADC指令舉例如下:

ADDSR0,R0,R2

ADCR1,R1,R3;使用ADC實現(xiàn)64位加法,(R1、R0)=(R1、R0)+(R3、R2)

SUB

減法運算指令。用寄存器Rn減去operand2。結(jié)果保存到Rd中。指令格式如下:

SUB{cond}{S}Rd,Rn,operand2

SUB指令舉例如下:

SUBSR0,R0,#1;R0=R0-1

SUBSR2,R1,R2;R2=R1-R2

SUBR6,R7,#0x10;R6=R7-0x10

RSB

逆向減法指令。用寄存器operand2減法Rn,結(jié)果保存到Rd中。指令格式如下:

RSB{cond}{S}Rd,Rn,operand2

SUB指令舉例如下:

RSBR3,R1,#0xFF00;R3=0xFF00-R1

RSBSR1,R2,R2,LSL#2;R1=R2<<2-R2=R2×3

RSBR0,R1,#0;R0=-R1

SBC

帶進位減法指令。用寄存器Rn減去operand2,再減去CPSR中的C條件標(biāo)志位的非(即若C標(biāo)志清零,則結(jié)果減去1),結(jié)果保存到Rd中。指令格式如下:

SCB{cond}{S}Rd,Rn,operand2

SBC指令舉例如下:

SUBSR0,R0,R2

SBCR1,R1,R3;使用SBC實現(xiàn)64位減法,(R1,R0)-(R3,R2)

RSC

帶進位逆向減法指令。用寄存器operand2減去Rn,再減去CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd中。指令格式如下:

RSC{cond}{S}Rd,Rn,operand2

RSC指令舉例如下:

RSBSR2,R0,#0

RSCR3,R1,#0;使用RSC指令實現(xiàn)求64位數(shù)值的負數(shù)

AND

邏輯與操作指令。將operand2值與寄存器Rn的值按位作邏輯與操作,結(jié)果保存到Rd中。指令格式如下:

AND{cond}{S}Rd,Rn,operand2

AND指令舉例如下:

ANDSR0,R0,#x01;R0=R0&0x01,取出最低位數(shù)據(jù)

ANDR2,R1,R3;R2=R1&R3

ORR

邏輯或操作指令。將operand2的值與寄存器Rn的值按位作邏輯或操作,結(jié)果保存到Rd中。指令格式如下:

ORR{cond}{S}Rd,Rn,operand2

ORR指令舉例如下:

ORRR0,R0,#x0F;將R0的低4位置1

MOVR1,R2,LSR#4

ORRR3,R1,R3,LSL#8;使用ORR指令將近R2的高8位數(shù)據(jù)移入到R3低8位中

EOR

邏輯異或操作指令。將operand2的值與寄存器Rn的值按位作邏輯異或操作,結(jié)果保存到Rd中。指令格式如下:

EOR{cond}{S}Rd,Rn,operand2

EOR指令舉例如下:

EORR1,R1,#0x0F;將R1的低4位取反

EORR2,R1,R0;R2=R1^R0

EORSR0,R5,#0x01;將R5和0x01進行邏輯異或,結(jié)果保存到R0,并影響標(biāo)志位

BIC

位清除指令。將寄存器Rn的值與operand2的值的反碼按位作邏輯與操作,結(jié)果保存到Rd中。指令格式如下:

BIC{cond}{S}Rd,Rn,operand2

BIC指令舉例如下:

BICR1,R1,#0x0F;將R1的低4位清零,其它位不變

BICR1,R2,R3;將拭的反碼和R2相邏輯與,結(jié)果保存到R1

CMP

比較指令。指令使用寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。指令格式如下:

CMP{cond}Rn,operand2

CMP指令舉例如下:

CMPR1,#10;R1與10比較,設(shè)置相關(guān)標(biāo)志位

CMPR1,R2;R1與R2比較,設(shè)置相關(guān)標(biāo)志位

CMP指令與SUBS指令的區(qū)別在于CMP指令不保存運算結(jié)果。在進行兩個數(shù)據(jù)大小判斷時,常用CMP指令及相應(yīng)的條件碼來操作。

CMN

負數(shù)比較指令。指令使用寄存器Rn與值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行,指令格式如下:

CMN{cond}Rn,operand2

CMNR0,#1;R0+1,判斷R0是否為1的補碼,若是Z置位

CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運算結(jié)果。CMN指令可用于負數(shù)比較,比如CMNR0,#1指令則表示R0與-1比較,若R0為-(即1的補碼),則Z置位,否則Z復(fù)位。

ARM指令集——指令格式ARM指令集——第2個操作數(shù)#immed_8r——常數(shù)表達式該常數(shù)必須對應(yīng)8位位圖,即一個8位的常數(shù)通過循環(huán)右移偶數(shù)位得到。循環(huán)右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數(shù)

ARM數(shù)據(jù)處理指令乘法指令

MUL指令將Rm和Rs中的值相乘,并將最低有效的32位結(jié)果放到Rd中。句法:MUL{cond}{S}Rd,Rm,RsMLA指令將Rm和Rs中值相乘,再加上Rn的值,并將最低有效的32位結(jié)果放到Rd中。句法:MLA{cond}{S}Rd,Rm,Rs,RnUMULL指令將Rm和Rs中的值解釋為無符號整數(shù)。該指令將這兩個整數(shù)相乘,并將結(jié)果的最低有效32位放在RdLo中,最高有效32位放在RdHi中。前導(dǎo)零計數(shù)CLZ指令對Rm中值的前導(dǎo)零的個數(shù)進行計數(shù),結(jié)果放到Rd中。若源寄存器全為0,則結(jié)果為32。若位[31]為1,則結(jié)果為0。句法:CLZ{cond}Rd,RmUMLAL指令將Rm和Rs中的值解釋為無符號整數(shù)。該指令將這兩個整數(shù)相乘,并將64位結(jié)果加到RdHi和RdLo中的64位無符號整數(shù)上。SMULL指令將Rm和Rs中的值解釋為帶符號的補碼整數(shù)。該指令將這兩個整數(shù)相乘,并將結(jié)果的最低有效32位放在RdLo中,將最高有效32位放在RdHi中。SMLAL指令將Rm和Rs中的值解釋為帶符號的補碼整數(shù)。該指令將這兩個整數(shù)相乘,并將64位結(jié)果加到RdHi和RdLo中的64位帶符號補碼整數(shù)上。句法:op{cond}{S}RdLo,RdHi,Rm,Rs

ARM數(shù)據(jù)處理指令MUL

32位乘法指令。指令將Rm和Rs中的值相乘,結(jié)果的低32位保存到Rd中。指令格式如下:

MUL{cond}{S}Rd,Rm,Rs

MUL指令舉例如下:

MULR1,R2,R3;R1=R2×R3

MULSR0,R3,R7;R0=R3×R7,同時設(shè)置CPSR中的N位和Z位

MLA

32位乘加指令。指令將Rm和Rs中的值相乘,再將乘積加上第3個操作數(shù),結(jié)果的低32位保存到Rd中。指令格式如下:

MLA{cond}{S}Rd,Rm,Rs,Rn

MLA指令舉例如下:

MLAR1,R2,R3,R0;R1=R2×R3+10

UMULL

64位無符號乘法指令。指令將Rm和Rs中的值作無符號數(shù)相乘,結(jié)果的低32位保存到RsLo中,而高32位保存到RdHi中。指令格式如下:

UMULL{cond}{S}RdLo,RdHi,Rm,Rs

UMULL指令舉例如下:

UMULLR0,R1,R5,R8;(R1、R0)=R5×R8

UMLAL

64位無符號乘加指令。指令將Rm和Rs中的值作無符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:

UMLAL{cond}{S}RdLo,RdHi,Rm,Rs

UMLAL指令舉例如下:

UMLALR0,R1,R5,R8;(R1,R0)=R5×R8+(R1,R0)

SMULL

64位有符號乘法指令。指令將Rm和Rs中的值作有符號數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:

SMULL{cond}{S}RdLo,RdHi,Rm,Rs

SMULL指令舉例如下:

SMULLR2,R3,R7,R6;(R3,R2)=R7×R6

SMLAL

64位有符號乘加指令。指令將Rm和Rs中的值作有符號數(shù)相乘,64位乘積與RdHi、RdLo,相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:

SMLAL{cond}{S}RdLo,RdHi,Rm,Rs

SMLAL指令舉例如下:

SMLALR2,R3,R7,R6;(R3,R2)=R7×R6+(R3,R2)

ARM轉(zhuǎn)移指令(1)B和BLB(Branch)指令引起處理器轉(zhuǎn)移到label。

句法:B{cond}label

BL(BranchandLink)指令將下一條指令的地址拷貝到R14(LR,鏈接寄存器),并引起轉(zhuǎn)移到label。

句法:BL{cond}label

(2)BX:引起處理器轉(zhuǎn)移到Rm中的地址。若Rm的位[0]為1,則指令集變換到Thumb。句法:BX{cond}Rm(3)BLX:帶鏈接轉(zhuǎn)移并可選地交換指令集。句法:BLX{cond}RmBLXlabel

ARM協(xié)處理器指令

CDP

協(xié)處理器數(shù)據(jù)操作指令。ARM處理器通過CDP指令通知ARM協(xié)處理器執(zhí)行特定的操作。該操作由協(xié)處理器完成,即對命令的參數(shù)的解釋與協(xié)處理器有關(guān),指令的使用取決于協(xié)處理器。若協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義指令異常中斷。指令格式如下:

CDP{cond}coproc,opcodel,CRd,CRn,CRm{,opcode2}

其中:coproc指令操作的協(xié)處理器名。標(biāo)準(zhǔn)名為pn,n為0~15。

opcodel協(xié)處理器的特定操作碼。

CRd作為目標(biāo)寄存器的協(xié)處理器寄存器。

CRN存放第1個操作數(shù)的協(xié)處理器寄存器。

CRm存放第2個操作數(shù)的協(xié)處理器寄存器。

Opcode2可選的協(xié)處理器特定操作碼。

CDP指令舉例如下:

CDPp7,0,c0,c2,c3,0;協(xié)處理器7操作,操作碼為0,可選操作碼為0

CDPp6,1,c3,c4,c5;協(xié)處理器操作,操作碼為1

LDC

協(xié)處理器數(shù)據(jù)讀取指令。LDC指令從某一連續(xù)的內(nèi)存單元將數(shù)據(jù)讀取到協(xié)處理器的寄存器中。協(xié)處理器數(shù)據(jù)的數(shù)據(jù)的傳送,由協(xié)處理器來控傳送的字?jǐn)?shù)。若協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義指令異常中斷。指令格式如下:

LDC{cond}{L}coproc,CRd,<地址>

其中:L可選后綴,指明是長整數(shù)傳送。

coproc指令操作的協(xié)處理器名。標(biāo)準(zhǔn)名為pn,n為0~15

CRd作為目標(biāo)寄存的協(xié)處理器寄存器。

<地址>指定的內(nèi)存地址

LDC指令舉例如下:

LDCp5,c2,[R2,#4];讀取R2+4指向的內(nèi)存單元的數(shù)據(jù),傳送到協(xié)處理器p5的c2寄存器中

LDCp6,c2,[R1];讀取是指向的內(nèi)存單元的數(shù)據(jù),傳送到協(xié)處理器p6的c2寄存器中

STC

協(xié)處理器數(shù)據(jù)寫入指令。STC指令將協(xié)處理器的寄存器數(shù)據(jù)寫入到某一連續(xù)的內(nèi)存單元中。進行協(xié)處理器數(shù)據(jù)的數(shù)據(jù)傳送,由協(xié)處理器來控制傳送的字?jǐn)?shù)。若協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義指令異常中斷。指令格式如下:

STC{cond}{L}coproc,CRd,<地址>

其中:L可選后綴,指明是長整數(shù)傳送。

coproc指令操作的協(xié)處理器名。標(biāo)準(zhǔn)名為pn,n為0~15

CRd作為目標(biāo)寄存的協(xié)處理器寄存器。

<地址>指定的內(nèi)存地址

STC指令舉例如下:

STCp5,c1,[R0]

STCp5,c1,[Ro,#-0x04]

MCR

ARM寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令。MCR指令將ARM處理器的寄存器中的數(shù)據(jù)傳送到協(xié)處理器的寄存器中。若協(xié)處理器不能成功地執(zhí)行該操作,將產(chǎn)生未定義指令異常中斷。指令格式如下:

MCR{cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}

其中:coproc指令操作的協(xié)處理器名。標(biāo)準(zhǔn)名為pn,n為0~15。

cpcodel協(xié)處理器的特定操作碼。

CRD作為目標(biāo)寄存器的協(xié)處理器寄存器。

CRn存放第1個操作數(shù)的協(xié)處理器寄存器

CRm存放第2個操作數(shù)的協(xié)處理器寄存器。

Opcode2可選的協(xié)處理器特定操作碼。

MCR指令舉例如下:

MCRp6,2,R7,c1,c2,

MCRP7,0,R1,c3,c2,1,

MRC

協(xié)處理器寄存器到ARM寄存器到的數(shù)據(jù)傳送指令。MRC指令將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器的寄存器中。若協(xié)處理器不能成功地執(zhí)行該操作。將產(chǎn)生未定義異常中斷。指令格式如下:

MRC{cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}

其中:coproc指令操作的協(xié)處理器名。標(biāo)準(zhǔn)名為pn,n為0~15。

opcodel協(xié)處理器的特定操作碼。

CRd作為目標(biāo)寄存器的協(xié)處理器寄存器。

CRn存放第1個操作數(shù)的協(xié)處理器寄存器。

CRm存放第2個操作數(shù)的協(xié)處理器寄存器。

opcode2可選的協(xié)處理器特定操作碼。

MRC指令舉例如下:

MRCp5,2,R2,c3,c2

MRCp7,0,R0,c1,c2,1

雜項ARM指令(1)SWI,引起軟件中斷。這意味著處理器模式變換為管理模式,CPSR保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量。句法:SWI{cond}immed_24其中:immed_24為表達式,其值為0~224-1范圍內(nèi)的整數(shù)。(2)MRS,將CPSR或SPSR的內(nèi)容傳送到通用寄存器。句法:MRS{cond}Rd,psr其中:Rd目標(biāo)寄存器。Rd不允許為R15。psrCPSR或SPSR。(3)MSR,用立即數(shù)或通用寄存器的內(nèi)容加載CPSR或SPSR的指定區(qū)域。句法:MSR{cond}<psr>_<fields>,#immed_8rMSR{cond}<psr>_<fields>,Rm其中:<psr>CPSR或SPSR。<fields>指定傳送的區(qū)域。immed_8r值為數(shù)字常量的表達式。常量必須對應(yīng)于8位位圖在32位字中循環(huán)移位偶數(shù)位后的值。Rm源寄存器。(4)BKPT,引起處理器進入調(diào)試模式。句法:BKPTimmed_16其中:immed_16為表達式,其值為范圍在0~65536內(nèi)的整數(shù)。(1)從r14中減去4來獲得SWI指令的地址。(2)把這個指令裝載到一個寄存器。(3)清除這個指令的高端8位,去掉了OpCode而只剩下的SWI編號。(4)使用這個值來找到要被執(zhí)行的代碼的例程的地址(使用查找表等)。(5)恢復(fù)寄存器r0-r12。(6)使處理器離開超級用戶模式。(7)跳轉(zhuǎn)到這個例程的地址。讀出SWI立即數(shù):

T_bitEQU0x20

SWI_Hander

STMFDSP!,{R0_R3,R12,LR}

;現(xiàn)場保護

MRSR0,SPSR

;讀取SPSR

STMFDSP!,{R0}

;保存SPSR

TSTR0,#T_bit

;測試T標(biāo)志位

LDRNEHR0,[LR,#-2]

;若是Thumb指令,讀取指令碼(16位)

BICNER0,R0,#0xFF00

;取得Thumb指令的8位立即數(shù)

LDREQR0,[LR,#-4]

;若是ARM指令,讀取指令碼(32位)

BICNQR0,R0,#0xFF00000

;取得ARM指令的24位立即數(shù)

LDMFDSP!,{R0-R3,R12,PC}^;SWI異常中斷返回

ARM偽指令——小范圍的地址讀取

ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。ADR{cond}register,exprADR偽指令格式指令執(zhí)行的條件碼加載的目標(biāo)寄存器地址表達式

地址表達式expr的取指范圍:當(dāng)?shù)刂分凳亲止?jié)對齊時,其取指范圍為-255~255;當(dāng)?shù)刂分凳亲謱R時,其取指范圍為-1020~1020;ARM偽指令——小范圍的地址讀取

ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。...ADRR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):使用偽指令將程序標(biāo)號Delay的地址存入R0...0x20ADDr1,pc,#0x3c......0x64MOVr0,r14...ARM偽指令——小范圍的地址讀取

ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。...ADRLR1,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):編譯后的反匯編代碼:使用偽指令將程序標(biāo)號Delay的地址存入R0地址程序代碼ARM偽指令——小范圍的地址讀取

ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):...0x20ADDr1,pc,#0x3c......0x64MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標(biāo)號Delay的地址存入R0ADR偽指令被匯編成一條指令A(yù)RM偽指令——小范圍的地址讀取

ADR偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時,ADR偽指令被編譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現(xiàn)該ADR偽指令的功能,若不能用一條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。

應(yīng)用示例2(查表):

ADRR0,DISP_TAB ;加載轉(zhuǎn)換表地址

LDRBR1,[R0,R2] ;使用R2作為參數(shù),進行查表

…DISP_TABDCB0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8ARM偽指令——中等范圍的地址讀取

ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。ADRL{cond}register,exprADRL偽指令格式指令執(zhí)行的條件碼加載的目標(biāo)寄存器地址表達式

地址表達式expr的取指范圍:當(dāng)?shù)刂分凳亲止?jié)對齊時,其取指范圍為-64K~64K;當(dāng)?shù)刂分凳亲謱R時,其取指范圍為-256K~256K;ARM偽指令——中等范圍的地址讀取

ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):使用偽指令將程序標(biāo)號Delay的地址存入R0ARM偽指令——中等范圍的地址讀取

ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):...0x20ADDr1,pc,#400x24ADDr1,r1,#FF00...0xFF68MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標(biāo)號Delay的地址存入R0地址程序代碼ARM偽指令——中等范圍的地址讀取

ADRL偽指令將基于PC相對偏移的地址值或基于寄存器相對偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址。在匯編編譯器編譯源程序時,ADRL偽指令被編譯器替換成兩條合適的指令。若不能用兩條指令實現(xiàn),則產(chǎn)生錯誤,編譯失敗。...ADRLR0,Delay...DelayMOVR0,r14...應(yīng)用示例(源程序):...0x20ADDr1,pc,#400x24ADDr1,r1,#FF00...0xFF68MOVr0,r14...編譯后的反匯編代碼:使用偽指令將程序標(biāo)號Delay的地址存入R0ADRL偽指令被匯編成兩條指令A(yù)RM偽指令——大范圍的地址讀取

LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。LDR{cond}register,=[expr|label_exprLDR偽指令格式指令執(zhí)行的條件碼加載的目標(biāo)寄存器基于PC的地址表達式或外部表達式注意:1.從指令位置到文字池的偏移量必須小于4KB;2.與ARM指令的LDR相比,偽指令的LDR的參數(shù)有“=”號。ARM偽指令——大范圍的地址讀取

LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。應(yīng)用示例(加載常量):LDRR2,=0xFF0;MOVR2,#0xFF0LDRR0,=0xFF000000;MOVR0,#0xFF000000LDRR1,=0xFFFFFFFE;MVNR1,#0x1ARM偽指令——大范圍的地址讀取

LDR偽指令用于加載32位的立即數(shù)或一個地址值到指定寄存器。在匯編編譯源程序時,LDR偽指令被編譯器替換成一條合適的指令。若加載的常數(shù)未超出MOV或MVN的范圍,則使用MOV或MVN指令代替該LDR偽指令,否則匯編器將常量放入文字池,并使用一條程序相對偏移的LDR指令從文字池讀出常量。應(yīng)用示例(加載地址):...LDRR1,=InitStack...InitStackMOVR0,LR...使用偽指令將程序標(biāo)號InitStack的地址存入R1ARM偽指令——大范圍的地址讀取

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論