版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高空考古挖掘服務(wù)合同
- 聯(lián)排別墅酒店租賃合同范本
- 高速公路土方施工合同范本
- 花卉市場租賃合同水電費
- 電力工程改造合同范本
- 小學(xué)節(jié)能改造施工合同
- 冶金工程中標(biāo)合作協(xié)議
- 礦山設(shè)備廠房施工合同
- 演出票務(wù)租賃合同
- 古城墻遺址修復(fù)工程合同
- 初中中考歷史試題
- 工程質(zhì)量保證體系和保證措施
- 豐田工作方法精髓-問題解決法(八步法)剖析(課堂PPT)
- 水廠管網(wǎng)工程施工管理工作報告doc
- 綜合美食廣場招商方法
- 排序算法集成-杉杉
- 產(chǎn)品報價審批表
- 基于s7200狹窄隧道汽車雙向行的plc控制
- 青年教師培養(yǎng)策略的研究
- 新課程設(shè)計報告
- 上海中考考綱單詞和短語詞組(配音標(biāo))
評論
0/150
提交評論