版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第八章ARM匯編指令8.1ARM指令格式
8.2ARM尋址方式
8.3ARM指令集
ARM指令格式:ARM匯編指令書寫格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
其中<>號(hào)內(nèi)的項(xiàng)是必須的,{}號(hào)內(nèi)的項(xiàng)可選。opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標(biāo)寄存器;Rn:第1個(gè)操作數(shù)的寄存器;operand2:第2個(gè)操作數(shù)(#immed_8r、Rm、Rm,shift);指令語法目標(biāo)寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADDr3,r1,r2r3r1r2yyyy-M-ARM機(jī)器指令編碼格式操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號(hào)數(shù)大于或等于0011CC/LOC=0無符號(hào)數(shù)小于0100MIN=1負(fù)數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號(hào)數(shù)大于1001LSC=0,Z=1無符號(hào)數(shù)小于或等于1010GEN=V有符號(hào)數(shù)大于或等于
1011LTN!=V有符號(hào)數(shù)小于
1100GTZ=0,N=V有符號(hào)數(shù)大于
1101LEZ=1,N!=V有符號(hào)數(shù)小于或等于
1110AL任何無條件執(zhí)行
(指令默認(rèn)條件)1111NV任何從不執(zhí)行(不要使用)所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標(biāo)明條件代碼,將默認(rèn)為無條件(AL)執(zhí)行ARM指令條件碼cond帶條件碼的指令C代碼:If(a>b) a++;Else b++;對(duì)應(yīng)的匯編代碼:CMP R0,R1 ;比較R0(a)與R1(b)ADDHI
R0,R0,#1;若R0>R1,則R0=R0+1ADDLS
R1,R1,#1;若R0≤1,則R1=R1+1yyyy-M-ARM指令中的第2操作數(shù)0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數(shù)循環(huán)右移10位常數(shù)#immed_8r由一個(gè)8位常數(shù)通過循環(huán)右移偶數(shù)位得到(P238):Rm,shift由Rm移位得到。移位不消耗額外時(shí)間,且Rm值不變。ALU桶形移位器Rd結(jié)果N預(yù)處理未預(yù)處理RmRnLSL0LSR0ASRRORRRXCyyyy-M-第二操作數(shù)編碼格式ARM處理器尋址方式
尋址方式是根據(jù)指令中給出的地址碼字段來實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有幾種基本尋址方式:1.立即尋址
2.寄存器尋址
3.寄存器間接尋址移位尋址、間接尋址、基址變址尋址、多寄存器尋址(塊尋址)4.堆棧尋址5.相對(duì)尋址1.操作數(shù)包含在指令當(dāng)中;2.指令地址碼部分就是數(shù)據(jù)本身;3.取指時(shí)就取出了可立即使用的操作數(shù);MOV R0,#0xFF;R0<=#0xFFSUBS R0,R0,#1;R0<=R0-10x55R0MOVR0,#0xFF立即尋址0xFF從代碼中獲得數(shù)據(jù)10進(jìn)制數(shù):#21,#0d572進(jìn)制數(shù):#0b0110016進(jìn)制數(shù):#0x3a001影響標(biāo)志位寄存器尋址yyyy-M-立即數(shù)范圍0x00~0xFF。例如,不能使用使用MOVR0,#0x32000001指令,需要轉(zhuǎn)換為:LDRR0,=0x32000001(注意0x前沒有“#”,有”=”)(對(duì)于不能被MOV和MVN指令所讀取的立即數(shù),可以將其轉(zhuǎn)換為如下格式:
LDRR0,[0x00008040]
即把先數(shù)據(jù)“0x32000001”放在內(nèi)存地址0x8040處,然后用存儲(chǔ)器訪問指令LDR得到該存儲(chǔ)單元的值:0x32000001)ARM指令中的第2操作數(shù)特例0xAA0x55R2R1寄存器尋址1.操作數(shù)存放在寄存器中;2.指令地址碼字段給出寄存器編號(hào)(名);3.指令執(zhí)行時(shí)直接取出寄存器值來操作;
MOV R1,R2 ;
R1<=R2
SUB R0,R1,R2 ;R0<=R1-R20xAAyyyy-M-1.操作數(shù)存放在寄存器中;2.指令地址碼字段給出寄存器編號(hào)(名)及移位表達(dá)式;3.指令執(zhí)行時(shí)取出寄存器值并移位,再將結(jié)果作為源操作數(shù);MOV R0,R2,LSL#3 ;R0<=R2×8
ANDSR1,R1,R2,LSLR3 ;R1<=R1and(R2<<R3)0x55R0R20x01寄存器移位尋址0x080x08邏輯左移3位寄存器尋址影響標(biāo)志位LSL、LSRASRROR、RRX寄存器間接尋址1.操作數(shù)存放在內(nèi)存單元中;2.指令地址碼字段給出[寄存器編號(hào)(名)];3.指令執(zhí)行時(shí)根據(jù)寄存器值(指針)找到相應(yīng)的存儲(chǔ)單元; LDR R1,[R2] ;R1<=[R2]
SWP R1,R1,[R2] ;R1
[R2]0x55R0R20x000004000xAA0x000004000xAA內(nèi)存單元yyyy-M-基址變址尋址1.操作數(shù)存放在內(nèi)存單元中;2.指令地址碼字段給出[寄存器編號(hào)(名)]和偏移量;3.指令執(zhí)行時(shí)將基址寄存器的內(nèi)容與偏移量(<4K)相加/減,形成操作數(shù)的有效地址。4.常用于查表、數(shù)組操作、功能部件寄存器訪問等。 LDR R2,[R3,#0x0C] ;R2<=[R3+0x0C]STR R1,[R0,#-4]! ;[R0-4]<=R1,R0<=R0-4LDR R0,[R1],#4 ;R0<=[R1],R1<=R1+4LDRR0,[R1,R2] ;R0<=[R1+R2]前索引后索引0x55R2R30x400000000xAA0x4000000C0xAA內(nèi)存單元多寄存器尋址/塊復(fù)制尋址1.操作數(shù)存放在內(nèi)存單元中;2.指令地址碼字段給出{寄存器編號(hào)(名)列表};3.編號(hào)高的寄存器總是對(duì)應(yīng)內(nèi)存中的高地址單元;4.可完成存儲(chǔ)塊和16個(gè)寄存器或其子集之間的數(shù)據(jù)傳送。
LDMIA R1!,{R2-R4,R6};R2<=[R1],R3<=[R1+4] ;R4<=[R1+8],R6<=[R1+C],R1<=R1+10
STMDB R1,{R2-R4,R6};[R1-4]<=R6,[R1-8]<=R4
;[R1-C]<=R3,[R1-10]<=R20x00000400R1R20x??0x010x000004000x??R3R40x??R60x??0x020x030x040x000004040x000004080x0000040C0x010x020x030x040x00000410內(nèi)存單元IncreaseAfterDecreaseBefore相對(duì)尋址1.操作數(shù)為指令存放地址;2.指令地址碼字段為地址偏移量;3.指令執(zhí)行時(shí)同基址尋址,由PC提供基地址根據(jù)偏移量完成跳轉(zhuǎn);
BL SUBR1 ;調(diào)用SUBR1子程序
BEQLOOP ;條件跳轉(zhuǎn)到LOOP處
...LOOPMOVR6,#1yyyy-M-堆棧尋址1.操作數(shù)存放在內(nèi)存棧頂單元中;2.指令地址碼字段固定使用棧頂指針SP;3.指令執(zhí)行時(shí)同多寄存器/塊尋址,可完成多個(gè)數(shù)據(jù)的入棧和出棧;滿遞增(FA):堆棧向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最高地址。空遞增(EA):堆棧向上增長,堆棧指針指向堆棧上的第一個(gè)空位置。滿遞減(FD):堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最低地址??者f減(ED):堆棧向下增長,堆棧指針向堆棧下的第一個(gè)空位置。ARM支持四種堆棧類型:堆棧的遞增與遞減遞增堆棧:向高地址方向生長,即向上生長遞減堆棧:向低地址方向生長,即向下生長棧底棧頂棧區(qū)SP
堆棧存儲(chǔ)區(qū)棧頂棧底棧區(qū)
SP地址減少地址增加0xFF遞增堆棧壓棧遞減堆棧壓棧yyyy-M-0x000x000xFF棧頂SP
棧頂SP
棧底棧底堆棧的空與滿空堆棧:堆棧指針SP指向下一個(gè)待壓入數(shù)據(jù)的空位置滿堆棧:堆棧指針SP指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng)0x123456780x12345678棧頂SP
0x12345678棧頂SP
滿堆棧壓??斩褩簵yyy-M-數(shù)據(jù)處理指令的編碼格式指令條件碼I=1:立即數(shù)尋址;I=0:寄存器移位尋址第二操作數(shù)Rd目標(biāo)寄存器Rn第一操作數(shù)寄存器S=1:根據(jù)結(jié)果設(shè)置CPSR中的條件碼S=0:不設(shè)置CPSR中的條件碼帶進(jìn)位加法ADC0101帶進(jìn)位減法指令SBC0110帶進(jìn)位逆向減法指令RSC0111位測(cè)試指令TST1000相等測(cè)試指令TEQ1001比較指令CMP1010負(fù)數(shù)比較指令CMN1011邏輯或操作指令ORR1100數(shù)據(jù)傳送MOV1101位清除指令BIC1110數(shù)據(jù)非傳送MVN1111加法運(yùn)算指令A(yù)DD0100逆向減法指令RSB0011減法運(yùn)算指令SUB0010邏輯異或操作指令EOR0001邏輯與操作指令A(yù)ND0000說明指令助記符操作碼數(shù)據(jù)處理指令
ARM的數(shù)據(jù)處理指令大致可分為以下幾類:
數(shù)據(jù)傳送指令:MOV、MVN
算術(shù)運(yùn)算指令:ADD、SUB、RSB、ADC、SBC、RSC、 MUL、MLA、UMULL、UMLAL、SMULL、SMLAL
邏輯運(yùn)算指令:AND、ORR、EOR、BIC
比較指令:CMP、CMN、TST、TEQ數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,而不能對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以使指令影響狀態(tài)標(biāo)志。
數(shù)據(jù)傳送指令MOV R1,#0x3C ;R1=0x3CMOV R0,R1 ;R0=R1
MOVSR3,R1,LSL#2 ;R3=R1<<2,并影響標(biāo)志位
MOV PC,LR ;PC=LR,子程序返回
MVN R1,R2 ;將R2按位取反,結(jié)果存到R1指令格式說明操作MOV{cond}{S}Rd,operand2數(shù)據(jù)傳送Rd←operand2MVN{cond}{S}Rd,operand2數(shù)據(jù)非傳送Rd←(~operand2)當(dāng)有后綴S時(shí)指令將根據(jù)結(jié)果更新標(biāo)志N和Z,在計(jì)算 operand2(8位立即數(shù)或寄存器)時(shí)更新標(biāo)志C,不影響標(biāo)志V。算術(shù)運(yùn)算指令指令格式說明操作ADD{cond}{S}Rd,Rn,operand2加法Rd←Rn+operand2SUB{cond}{S}Rd,Rn,operand2減法Rd←Rn-operand2RSB{cond}{S}Rd,Rn,operand2逆向減法Rd←operand2-RnADC{cond}{S}Rd,Rn,operand2帶進(jìn)位加法Rd←Rn+operand2+CSBC{cond}{S}Rd,Rn,operand2帶借位減法Rd←Rn-operand2-~CRSC{cond}{S}Rd,Rn,operand2帶借位逆向減法Rd←operand2-Rn-~C可影響N,Z,C和V標(biāo)志位。ADDS R1,R1,#1020 ;R1=R1+1020,并影響標(biāo)志位ADD R1,R1,R2,LSL#2 ;R1=R1+R2<<2SUBS R0,R0,#240 ;R0=R0-240,并影響標(biāo)志位
SUBS R2,R1,R2 ;R2=R1-R2
,并影響標(biāo)志位RSBR3,R1,#0xFF00 ;R3=0xFF00-R1
RSC R3,R1,#0 ;R3=0-R1-!C邏輯運(yùn)算指令指令格式說明操作AND{cond}{S}Rd,Rn,operand2邏輯與操作Rd←Rn&operand2ORR{cond}{S}Rd,Rn,operand2邏輯或操作Rd←Rn|operand2EOR{cond}{S}Rd,Rn,operand2邏輯異或操作Rd←Rn^operand2BIC{cond}{S}Rd,Rn,operand2位清除Rd←Rn&(~operand2)可標(biāo)志N和Z。計(jì)算Operand2時(shí)更新標(biāo)志C,不影響標(biāo)志V。ANDS R0,R0,#0x01 ;取R0的最低位數(shù)據(jù),并影響標(biāo)志位ORR R0,R0,#0x0F ;將R0的低4位置1,其它位不變
EOR R1,R1,#0x0F ;將R1的低4位取反,其它位不變BIC
R1,R1,#0x0F ;將R1的低4位清零,其它位不變ANDEQR2,R1,R3 ;若Z=1,則R2=R1&R3BIC R1,R2,R3 ;將R3的反碼和R2相邏輯“與”MOV R1,R2,LSR#24 ;將R2的高8位移入到R3低8位,ORR
R3,R1,R3,LSL#24 ;R3中原來的低8位數(shù)據(jù)移到高8位比較指令指令格式說明操作CMP{cond}Rn,operand2比較指令標(biāo)志←Rn-operand2CMN{cond}Rn,operand2負(fù)數(shù)比較指令標(biāo)志←Rn+operand2TST{cond}Rn,operand2位測(cè)試指令標(biāo)志←Rn&operand2TEQ{cond}Rn,operand2相等測(cè)試指令標(biāo)志←Rn^operand2不需要使用S后綴,會(huì)影響N/Z/C/V標(biāo)志位;不保存運(yùn)算結(jié)果;CMP R1,#10 ;R1與10比較,并設(shè)置相關(guān)標(biāo)志位CMPGT R1,R2 ;若R1>10,則比較R1與R2,并設(shè)置相關(guān)標(biāo)志位CMN R0,#1
;比較R0與-1,計(jì)算R0+1TST R1,#0x0F ;判斷R1的低4位是否為0TEQ R0,R1 ;較R0與R1是否相等(不影響V位和C位)TST指令的下一條指令常與EQ、NE條件碼配合使用:當(dāng)所有測(cè)試位均為0時(shí),EQ有效(Z=1),否則NE有效(Z=0);TEQ指令的下一條指令常與EQ、NE條件碼配合使用:當(dāng)兩個(gè)數(shù)據(jù)相等時(shí),EQ有效(Z=1),否則NE有效(Z=0);yyyy-M-乘法指令的編碼格式Rm被乘數(shù)寄存器Rn:MLA指令相加的寄存器RdHi:64位乘法指令目標(biāo)寄
存器的高32位Rd:目標(biāo)寄存器RdLo:64位乘法指令目標(biāo)寄存器的低32位Rs為乘數(shù)寄存器64位有符號(hào)乘加指令SMLAL11164位有符號(hào)乘法指令SMULL11064位無符號(hào)乘加指令UMLAL10164位無符號(hào)乘法指令UMULL10032位乘加指令MLA00132位乘法指令MUL000說明指令助記符操作碼yyyy-M-乘(加)法指令指令格式說明操作MUL{cond}{S}
Rd,Rm,Rs32位乘法Rd←Rm*RsMLA{cond}{S}
Rd,Rm,Rs,Rn32位乘加Rd←Rm*Rs+RnUMULL{cond}{S}
RdLo,RdHi,Rm,Rs64位無符號(hào)乘法(RdLo,RdHi)←Rm*RsUMLAL{cond}{S}
RdLo,RdHi,Rm,Rs64位無符號(hào)乘加(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)SMULL{cond}{S}
RdLo,RdHi,Rm,Rs64位有符號(hào)乘法(RdLo,RdHi)←Rm*RsSMLAL{cond}{S}
RdLo,RdHi,Rm,Rs64位有符號(hào)乘加(RdLo,RdHi)←Rm*Rs+(RdLo,RdHi)MUL R1,R2,R3 ;R1=R2×R3,結(jié)果的低32位保存MLAS R1,R2,R3,R0 ;R1=R2×R3+R0,影響標(biāo)志位UMULL R0,R1,R5,R8 ;(R1、R0)=R5×R8UMLAL R0,R1,R5,R8 ;(R1、R0)=R5×R8+(R1、R0)SMULL R2,R3,R7,R6 ;(R3、R2)=R7×R6SMLAL R2,R3,R7,R6 ;(R3、R2)=R7×R6+(R3、R2)
注:R不能為R15且Rd≠Rm
;
可影響N、Z標(biāo)志位;32位指令不影響V,C不確定;64位指令V和C不確定;存儲(chǔ)器訪問指令
ARM處理器是典型的RISC處理器,對(duì)存儲(chǔ)器的訪問只能使用加載/存儲(chǔ)指令實(shí)現(xiàn)。ARM的存儲(chǔ)空間及I/O空間統(tǒng)一編址,因此對(duì)外圍I/O及程序數(shù)據(jù)的訪問均需通過加載/存儲(chǔ)指令進(jìn)行。一、單寄存器操作指令LDR/STR用于訪問內(nèi)存變量、內(nèi)存緩沖區(qū)數(shù)據(jù)、查表、控制外圍部件等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實(shí)現(xiàn)程序跳轉(zhuǎn)。又分為“字和無符號(hào)字節(jié)加載存儲(chǔ)指令”及“半字和有符號(hào)字節(jié)加載存儲(chǔ)指令”兩類。二、多寄存器操作指令LDM/STM
主要用于現(xiàn)場(chǎng)保護(hù)、數(shù)據(jù)復(fù)制、常數(shù)傳遞等。三、數(shù)據(jù)交換指令SWP單寄存器存取指令的編碼格式字和無符號(hào)字節(jié)存取指令LDR/STRP表示前/后變址U=1:加U=0:減B=0:字節(jié)B=1:字W=1:回寫基址寄存器,對(duì)應(yīng)指令中的“!”
W=0:不回寫存儲(chǔ)單元尋址方式L=1:加載L=0:存儲(chǔ)Rd為源/目標(biāo)寄存器Rn為基址寄存器S=1:有符號(hào)數(shù),S=0:無符號(hào)數(shù)H=1:半字,H=0:字節(jié)存儲(chǔ)單元尋址方式半字和有符號(hào)字節(jié)存取指令LDR/STRI=1立即數(shù)I=0寄存器移位單寄存器存取指令指令格式說明操作LDR{cond}
Rd,addressing
加載字?jǐn)?shù)據(jù)Rd←[addressing]注意addressing的尋址方式及索引方式LDR{cond}T
Rd,addressing以用戶模式加載字?jǐn)?shù)據(jù)LDR{cond}BTRd,addressing以用戶模式加載無符號(hào)字節(jié)LDR{cond}B
Rd,addressing
加載無符號(hào)字節(jié)數(shù)據(jù)LDR{cond}H
Rd,addressing加載無符號(hào)半字?jǐn)?shù)據(jù)LDR{cond}SBRd,addressing加載有符號(hào)字節(jié)數(shù)據(jù)LDR{cond}SHRd,addressing加載有符號(hào)半字?jǐn)?shù)據(jù)LDR{cond}DRd,addressing加載雙字?jǐn)?shù)據(jù)STR{cond}Rd,addressing存儲(chǔ)字?jǐn)?shù)據(jù)[addressing]←Rd注意addressing的尋址方式及索引方式STR{cond}T
Rd,addressing
以用戶模式存儲(chǔ)字?jǐn)?shù)據(jù)STR{cond}B
Rd,addressing
存儲(chǔ)字節(jié)數(shù)據(jù)STR{cond}BT
Rd,addressing
以用戶模式存儲(chǔ)字節(jié)數(shù)據(jù)STR{cond}H
Rd,addressing
存儲(chǔ)半字?jǐn)?shù)據(jù)STR{cond}D
Rd,addressing
存儲(chǔ)雙字?jǐn)?shù)據(jù)符號(hào)數(shù)加載時(shí)用符號(hào)擴(kuò)展到32位,否則用零擴(kuò)展到32位;半字讀寫的指定地址必須為偶數(shù),否則將產(chǎn)生不可靠的結(jié)果;單寄存器存取指令的尋址方式基址寄存器(任一通用寄存器)+地址偏移量立即數(shù):LDRR1,[R0,#0x12]
;R1<-[R0+0x12]寄存器:LDRR1,[R0,-R2] ;R1<-[R0-R2]寄存器移位:LDRR1,[R0,R2,LSL#2];R1<-[R0+R2*4]
地址索引的4種格式零偏移:
LDRRd,[Rn]
程序相對(duì)偏移:
LDRRd,labe1前索引偏移:
LDRRd,[Rn,#0x04]!后索引偏移:
LDRRd,[Rn],#0x04必須是在當(dāng)前指令的±4K字節(jié)范圍內(nèi)yyyy-M-LDR R2,[R5]STR R1,[R0,#0x04]
LDRB R3,[R2],#-1
STRB R0,[R3,-R8,LSR#2]
LDRSBR1,[R0,R3]
LDRHR6,[R2],#2LDRDR6,[R11]STRDR4,[R9,#24]單寄存器存取指令應(yīng)用示例雙字存儲(chǔ)時(shí)注意:Rd必須是偶數(shù)寄存器,且不是R14。;將R5指向的字?jǐn)?shù)據(jù)存入R2;將R1的內(nèi)容存儲(chǔ)到[R0+0x04]字單元;將R2指向的無符號(hào)字節(jié)存入R3,R2=R2-1;R0最低有效字節(jié)->[R3-R8/4];將R0+R3指向的字節(jié)存入R1,高24位符號(hào)擴(kuò)展;將R2指向的半字存入R6,高16位0擴(kuò)展;R2=R2+2;雙字裝載,R6←[R11],R7←[R11+4]
;雙字存儲(chǔ),R4→[R9+24],R5→[R9+28]數(shù)據(jù)塊(多寄存器)存取指令的編碼格式數(shù)據(jù)塊(多寄存器)存取指令編碼LDM/STMS對(duì)應(yīng)于指令中的”^”符號(hào):在恢復(fù)PC時(shí)也同時(shí)恢復(fù)SPSRP表示前/后變址U表示加/減W表示回寫(!)寄存器列表Rn為基址寄存器L=1:加載L=0:存儲(chǔ)yyyy-M-多寄存器存取指令指令格式說明操作LDM{cond}{mode}Rn{!},reglist{^}多寄存器加載reglist←[Rn...]STM{cond}{mode}Rn{!},reglist{^}多寄存器存儲(chǔ)[Rn...]←reglist
reglist表示寄存器列表(由小到大),如{R1,R2,R6-R9};!表示在操作結(jié)束后,將最后的地址寫回Rn中;^允許在用戶模式或系統(tǒng)模式下使用。它有以下兩個(gè)功能:1)異常模式下LDM指令中寄存器列表包含R15時(shí),除正常多寄存器傳送外,還將SPSR也復(fù)制到CPSR中。常用于異常處理返回。2)使用用戶模式下的寄存器,而不是當(dāng)前模式的寄存器。地址增長模式數(shù)據(jù)塊傳送操作說明地址增長模式堆棧操作說明IA傳送后地址加4FD滿遞減堆棧IB傳送前地址加4ED空遞減堆棧DA傳送后地址減4FA滿遞增堆棧DB傳送前地址減4EA空遞增堆棧多寄存器存取指令應(yīng)用示例R1:指令執(zhí)行前的基址寄存器R1’:指令執(zhí)行后的基址寄存器R1
R1’
指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR1
R1’
指令STMDAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR1
R1’
指令STMIBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR1’
R1
指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R5R6R7R5R6R7R5R6R7堆棧圖例
滿遞減空遞減滿遞增空遞增堆棧操作數(shù)據(jù)塊傳送存儲(chǔ)堆棧操作壓棧說明數(shù)據(jù)塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞減STMIASTMEA空遞增LDMIALDMFD滿遞增STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增;使用數(shù)據(jù)塊傳送指令進(jìn)行堆棧操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆棧指令進(jìn)行堆棧操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡(jiǎn)單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和出棧操作則需要考慮空與滿、加與減對(duì)應(yīng)的問題。堆棧操作和數(shù)據(jù)塊傳送指令之間的關(guān)系如下表所示:寄存器/存儲(chǔ)器交換指令的編碼格式B用于區(qū)別無符號(hào)字節(jié)(B為1)或字(B為0)Rm源寄存器Rd目標(biāo)寄存器Rn為基址寄存器SWP R1,R1,[R0] ;
R1[R0]SWPB R1,R2,[R0] ;將R0指向的存儲(chǔ)單元低字節(jié)數(shù)據(jù)讀
;取到R1中(高24位清零),并將R2的
;內(nèi)容寫入到該內(nèi)存單元中的最低字節(jié)yyyy-M-寄存器和存儲(chǔ)器交換指令指令格式說明操作SWP{cond}Rd,Rm,Rn
字?jǐn)?shù)據(jù)交換Rd←[Rn],[Rn]←Rm
(Rn≠Rd或Rm)SWP{cond}BRd,Rm,Rn
字節(jié)數(shù)據(jù)交換若Rm與Rd相同,則為寄存器與存儲(chǔ)器內(nèi)容進(jìn)行互換;
Rn為要進(jìn)行數(shù)據(jù)交換的存儲(chǔ)器地址,Rn不能與Rd和Rm相同。yyyy-M-分支指令的編碼格式分支指令B/BL指令編碼格式L=0:B指令,跳轉(zhuǎn)L=1:
BL指令,保存PC并跳轉(zhuǎn),可返回24位有符號(hào)立即數(shù)(偏移量)分支指令BX指令編碼格式Rm目標(biāo)地址寄存器,該寄存器裝載31位跳轉(zhuǎn)地址,最低位為1時(shí)切換到Thumb狀態(tài)yyyy-M-分支指令在ARM中有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn),一種則是直接向PC寄存器賦值實(shí)現(xiàn)跳轉(zhuǎn),另一種是使用分支指令直接跳轉(zhuǎn)。
以下三種分支指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi),且ARM指令為字對(duì)齊,因此最低2位地址固定為0。指令格式說明操作B{cond}
label分支指令PC←labelBL{cond}
label帶鏈接的分支指令LR←PC-4,PC←label適用于子程序調(diào)用BX{cond}
Rm帶狀態(tài)切換的分支指令PC←Rm根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)yyyy-M-BWAITA
;跳轉(zhuǎn)到WAITA標(biāo)號(hào)處
B 0x1234
;跳轉(zhuǎn)到絕對(duì)地址0x1234處BLLabel ;調(diào)用子程序ADRLR0,ThumbFun+1
;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉(zhuǎn)到指定地址并切換到Thumb狀態(tài)
BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC分支指令應(yīng)用示例Addr1LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時(shí),硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計(jì)數(shù)器(PC)2.程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行yyyy-M-PSR訪問指令(P257)指令格式說明操作MRS{cond}Rd,psr讀PSRRd←psrMSR{cond}
psr_fields,Rd/#immed_8r寫PSRpsr_fields←Rd/#immed_8r讀CPSR可了解當(dāng)前工作狀態(tài);讀SPSR可以了解進(jìn)入異常前的狀態(tài);MSR與MRS配合使用,可以切換處理器模式或允許/禁止中斷等。(1)(2)(3)(4)應(yīng)用示例1:;子程序:使能IRQ中斷ENABLE_IRQMRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR應(yīng)用示例2:;子程序:禁能IRQ中斷DISABLE_IRQMRSR0,CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR
1.將CPSR寄存器內(nèi)容讀出到R0;2.修改對(duì)應(yīng)于CPSR中的I控制位;3.將修改后的值寫回CPSR寄存器的對(duì)應(yīng)控制域;4.返回上一層函數(shù);yyyy-M-軟中斷指令的編碼格式SWI{cond}immed_24指令執(zhí)行的條件碼指令傳遞的參數(shù)(24位立即數(shù),其值 為0~224-1);yyyy-M-軟中斷指令主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù):實(shí)現(xiàn)用戶模式變換到管理模式,并將CPSR保存到管理模式的SPSR中,然后程序跳轉(zhuǎn)到SWI異常入口。不影響條件碼標(biāo)志。
根據(jù)SWI指令傳遞的參數(shù),SWI異常處理程序可以作出相應(yīng)的處理。SWI指令傳遞參數(shù)有以下兩種方法:
1.指令中的24位立即數(shù)指定服務(wù)類型,參數(shù)通過通用寄存器傳遞。
MOVR0,#34
;設(shè)置子功能號(hào)為34
SWI12
;調(diào)用12號(hào)軟中斷2.指令中的24位立即數(shù)被忽略,服務(wù)類型由R0的值決定,參數(shù)通過其它的通用寄存器傳遞。
MOVR0,#12
;調(diào)用12號(hào)軟中斷
MOVR1,#34
;設(shè)置子功能號(hào)為34
SWI0
yyyy-M-在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對(duì)SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數(shù)。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場(chǎng)保護(hù)
MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測(cè)試T標(biāo)志位
LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數(shù)(低8位)
LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數(shù)(低24位)
...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回yyyy-M-偽指令在ARM匯編指令中,有一類特殊的指令沒有對(duì)應(yīng)的指令編碼。在匯編時(shí)根據(jù)情況會(huì)解釋為相應(yīng)的ARM、Thumb-2或Thumb-2之前的Thumb指令的組合。這類指令被ARM公司稱為“偽指令”。需要特別注意的是,這幾條指令和第9章中介紹的偽指令雖然形式上類似,但作用卻大不相同。第9章中介紹的偽指令用于指導(dǎo)匯編器完成相應(yīng)的匯編工作,符合通常意義上對(duì)偽指令的定義,而本節(jié)所介紹的這幾條偽指令的作用和正常的ARM匯編指令類似,設(shè)計(jì)這幾條偽指令的目的主要是使用一條指令替代多條指令的組合,方便程序員完成匯編程序設(shè)計(jì)工作,其作用類似于80x86處理器的宏指令。偽指令A(yù)DR/ADRL將相對(duì)于程序或相對(duì)于寄存器的地址載入寄存器中(中等范圍,與位置無關(guān))。指令書寫格式:ADR(ADRL)[<cond>]<Rd>,<label>……MOVR0,#0x18;給R0賦值用于查表ADRR3,JumpTable
;裝載跳轉(zhuǎn)表的首地址LDRPC,[R3,R0,LSL#2];查表,將查到的地址賦給PCJumpTable……ADRR3JumpTableLDRPC,[R3,R0,LSL#2]xxxJumpTablexxxxxxJumpTable
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度廣告發(fā)布合同廣告內(nèi)容與投放渠道確定
- Python的跨平臺(tái)GUI開發(fā)
- 2024年式樓頂場(chǎng)地租借合同
- 2024年工程建設(shè)合同范本及詳細(xì)條款
- 2024年 joint venture 合同中的投資額度與利潤分配
- 2024年戶外防腐工程合同
- 行業(yè)競(jìng)爭(zhēng)營銷策略
- 2024年度高端服裝品牌授權(quán)經(jīng)營合同
- 環(huán)境質(zhì)量閉環(huán)管理研究
- 2024年市場(chǎng)調(diào)研共享合同
- 2024版人教版英語初一上單詞默寫單
- 化學(xué)實(shí)驗(yàn)室安全智慧樹知到期末考試答案2024年
- 經(jīng)典房地產(chǎn)營銷策劃培訓(xùn)(全)
- 工人入場(chǎng)安全教育課件
- 【川教版】《生命 生態(tài) 安全》二年級(jí)上冊(cè)第12課 少點(diǎn)兒馬虎 多點(diǎn)兒收獲 課件
- 人教版數(shù)學(xué)四年級(jí)上冊(cè)第五單元 《平行四邊形和梯形》 大單元作業(yè)設(shè)計(jì)
- 靜配中心差錯(cuò)預(yù)防
- 送教上門體育、健康教案教學(xué)內(nèi)容
- 高夫品牌市場(chǎng)分析報(bào)告
- 職業(yè)規(guī)劃書-數(shù)字化設(shè)計(jì)與制造技術(shù)
- 國家臨床重點(diǎn)??平ㄔO(shè)項(xiàng)目申報(bào)書
評(píng)論
0/150
提交評(píng)論