微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)-第八章-ARM匯編指令_第1頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)-第八章-ARM匯編指令_第2頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)-第八章-ARM匯編指令_第3頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)-第八章-ARM匯編指令_第4頁
微處理器系統(tǒng)結(jié)構(gòu)與嵌入式系統(tǒng)-第八章-ARM匯編指令_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

評(píng)論

0/150

提交評(píng)論