




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第
八
章
A
R
M
匯
編
指
令8.1ARM指令格式(掌握)ARM指令的一般編碼格式ARM指令的條件域指令的第二源操作數(shù)8.2ARM尋址方式(掌握)立即尋址
寄存器直接尋址
寄存器移位尋址寄存器間接尋址
基址變址尋址多寄存器直接尋址相對(duì)尋址堆棧尋址8.3ARM指令集(掌握)數(shù)據(jù)處理指令轉(zhuǎn)移指令程序狀態(tài)寄存器訪問指令加載/存儲(chǔ)指令異常產(chǎn)生指令偽指令
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-2/95ARM機(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指令條件碼cond4/95ARM指令中的第2操作數(shù)0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數(shù)循環(huán)右移10位常數(shù)#immed_8r由一個(gè)8位常數(shù)通過循環(huán)右移偶數(shù)位得到:Rm,shift由Rm移位得到。移位不消耗額外時(shí)間,且Rm值不變。ALU桶形移位器Rd結(jié)果N預(yù)處理未預(yù)處理RmRnLSL0LSR0ASRRORRRXCyyyy-M-數(shù)據(jù)處理指令第二操作數(shù)編碼格式ARM處理器尋址方式
尋址方式是根據(jù)指令中給出的地址碼字段來實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有幾種基本尋址方式:1.立即尋址2.寄存器尋址
3.寄存器間接尋址移位尋址、間接尋址、基址變址尋址、多寄存器尋址(塊尋址)4.堆棧尋址5.相對(duì)尋址7/951.操作數(shù)包含在指令當(dāng)中;2.指令地址碼部分就是數(shù)據(jù)本身;3.取指時(shí)就取出了可立即使用的操作數(shù);MOV R0,#0xFF00;R0<=#0xFF00SUBS R0,R0,#1;R0<=R0-10x55R0MOVR0,#0xFF00立即尋址0xFF00從代碼中獲得數(shù)據(jù)10進(jìn)制數(shù):#21,#0d572進(jìn)制數(shù):#0b0110016進(jìn)制數(shù):#0x3a001影響標(biāo)志位寄存器尋址yyyy-M-8/95立即數(shù)規(guī)則因?yàn)橹噶铋L度是32位的,32位的指令中,即有指令碼還有立即數(shù)所以要表示比較寬的數(shù)據(jù)范圍,只能取某些特殊的數(shù)了,例如通過移位來實(shí)現(xiàn)。如果不能用該方法得到立即數(shù),則可以使用LDR偽指令實(shí)現(xiàn)(先把數(shù)據(jù)放到ROM中,然后再通過地址加載到寄存器中)如果第二個(gè)源操作數(shù)不能由一個(gè)8位常數(shù)通過循環(huán)右移偶數(shù)位得到,則可以通過后面提到的偽指令實(shí)現(xiàn)。例如,不能使用使用MOVR0,#0x32000001指令,需要轉(zhuǎn)換為:
LDRR0,=0x32000001(注意0x前沒有“#”,有”=”)(偽指令LDR對(duì)于不能被MOV和MVN指令所讀取的立即數(shù),可以將其轉(zhuǎn)換為如下格式:
LDRR0,[0x00008040]
即把數(shù)據(jù)“0x32000001”放在內(nèi)存地址0x8040處,然后用存儲(chǔ)器訪問指令LDR得到該存儲(chǔ)單元的值:0x32000001)ARM指令中的第2操作數(shù)特例1.操作數(shù)存放在寄存器中;2.指令地址碼字段給出寄存器編號(hào)(名);3.指令執(zhí)行時(shí)直接取出寄存器值來操作;
MOVR1,R2;
R1<=R2
SUBR0,R1,R2;R0<=R1-R20xAA0x55R2R1寄存器直接尋址0xAAyyyy-M-11/951.操作數(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]0x55R0R20x400000000xAA0x400000000xAA內(nèi)存單元yyyy-M-13/951.操作數(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]! ;R1<=[R0-4],R0<=R0-4LDR R0,[R1],#4 ;R0<=[R1],R1<=R1+4基址變址尋址前索引后索引0x55R2R30x400000000xAA0x4000000C0xAA內(nèi)存單元14/951.操作數(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]<=R2多寄存器直接尋址0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C0x010x020x030x040x40000010內(nèi)存單元(IncreaseAfter)DecreaseBefore相對(duì)尋址1.操作數(shù)為指令存放地址;2.指令地址碼字段為地址偏移量;3.指令執(zhí)行時(shí)同基址尋址,由PC提供基地址根據(jù)偏移量完成跳轉(zhuǎn);
BL SUB ;調(diào)用SUB子程序SUB
BEQ LOOP ;條件跳轉(zhuǎn)到LOOP處
...LOOPMOVR6,#1yyyy-M-16/95堆棧尋址操作數(shù)存放在內(nèi)存棧頂單元中;2.指令地址碼字段固定使用棧頂指針SP(初始化為棧底);3.指令執(zhí)行時(shí)同多寄存器/塊尋址,可完成多個(gè)數(shù)據(jù)的入棧和出棧;ARM支持的四種堆棧類型1.滿遞增(FA):堆棧指針SP的值增加,SP指向最后放入數(shù)據(jù)的位置2.空遞增(EA)
:堆棧指針SP的值增加,SP指向下一個(gè)將要放入數(shù)據(jù)的空位置3.滿遞減(FD)
:堆棧指針SP的值減小,SP指向最后放入數(shù)據(jù)的位置4.空遞減(ED)
:堆棧指針SP的值減小,SP指向下一個(gè)將要放入數(shù)據(jù)的空位置yyyy-M-18/94注意:入棧和出棧的堆棧類型一定要相同。堆棧的遞增與遞減遞增堆棧:向高地址方向生長,即向上生長遞減堆棧:向低地址方向生長,即向下生長棧底棧頂棧區(qū)SP
堆棧存儲(chǔ)區(qū)棧頂棧底棧區(qū)
SP地址減少地址增加0x123456780x12345678遞增堆棧壓棧遞減堆棧壓棧yyyy-M-19/940x10100x1000注意:SP初始化時(shí)指向棧底棧頂SP
棧頂SP
棧底棧底堆棧的空與滿空堆棧:堆棧指針SP指向下一個(gè)待壓入數(shù)據(jù)的空位置滿堆棧:堆棧指針SP指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng)0x123456780x12345678棧頂SP
0x12345678棧頂SP
滿堆棧壓??斩褩簵yyy-M-20/94數(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)志。
21/95數(shù)據(jù)處理指令的編碼格式指令條件碼I=1:立即數(shù);I=0:寄存器移位第二操作數(shù)Rd目標(biāo)寄存器Rn第一操作數(shù)寄存器S=1:根據(jù)結(jié)果設(shè)置CPRS中的條件碼S=0:不設(shè)置CPRS中的條件碼帶進(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說明指令助記符操作碼22/95數(shù)據(jù)傳送指令MOV R11,#0xF000000B ;R1=0xF000000BMOV R0,R1 ;R0=R1
MOVSR3,R1,LSL#2 ;R3=R1<<2,并影響標(biāo)志位
MOV PC,LR ;PC=LR,子程序返回
MVN R1,#0xFF ;R1=0xFFMVN 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。MVN指令具有取反功能,所以可以裝載范圍更廣的立即數(shù)。23/95算術(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帶進(jìn)位減法Rd←Rn-operand2-~CRSC{cond}{S}Rd,Rn,operand2帶進(jìn)位逆向減法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)志位RSB R3,R1,#0xFF00 ;R3=0xFF00-R1
ADDS R0,R0,R2 ;R0等于低32位相加,并影響標(biāo)志位ADC R1,R1,R3
;R1等于高32位相加,并加上低位進(jìn)位SUBS R0,R0,R2 ;低32位相減,并影響標(biāo)志位SBC R1,R1,R3
;高32位相減,并減去低位借位RSBS R2,R0,#0 ;R2=-R0RSC R3,R1,#0 ;R3=-R1-!Carry64位取負(fù)64位加法
64位減法
比較和測(cè)試指令指令格式說明操作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,判斷R0是否為1的補(bǔ)碼-1,是則設(shè)置Z標(biāo)志TST 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);計(jì)算R0+1TEQ指令的下一條指令常與EQ、NE條件碼配合使用:當(dāng)兩個(gè)數(shù)據(jù)相等時(shí),EQ有效(Z=1),否則NE有效(Z=0);yyyy-M-25/95邏輯運(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#8
26/95乘(加)法指令指令格式說明操作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不確定;27/95分支指令在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-28/95BLLabelxxxxxxLabelxxxMOVPC,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í)行B WAITA
;跳轉(zhuǎn)到WAITA標(biāo)號(hào)處
B 0x1234
;跳轉(zhuǎn)到絕對(duì)地址0x1234處BL Label ;調(diào)用子程序ADRLR0,ThumbFun+1
;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉(zhuǎn)到指定地址并切換到Thumb狀態(tài)
29/95yyyy-M-程序狀態(tài)寄存器訪問指令指令格式說明操作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-30/95加載存儲(chǔ)指令指令格式說明操作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-32/95LDR R2,[R5]STR R1,[R0,#0x04]
LDRB R3,[R2],#-1
STRB R0,[R3,-R8,ASR#2]
LDRSBR1,[R0,R3]
LDRHR6,[R2],#2LDRDR6,[R11]STRDR4,[R9,#24]單寄存器存取指令應(yīng)用示例雙字存儲(chǔ)時(shí)注意:Rd必須是偶數(shù)寄存器,且不是R14。除非指令為零偏移,或不帶寫回的前索引,否則Rn不允許與Rd和R(d+1)相同。;將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]33/95數(shù)據(jù)塊存取指令指令格式說明操作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空遞增堆棧34/95數(shù)據(jù)塊存取指令應(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}4008H4004H4000H4014H4010H400CHR5R6R7R5R6R7R5R6R7R5R6R735/95堆棧尋址---多寄存器尋址堆棧圖例
滿遞減空遞減滿遞增空遞增數(shù)據(jù)塊傳送存儲(chǔ)堆棧操作壓棧說明數(shù)據(jù)塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMIBLDMED空遞減STMIASTMEA空遞增LDMDBLDMEA空遞增STMDBSTMFD滿遞減LDMIALDMFD滿遞減STMIBSTMFA滿遞增LDMDALDMFA滿遞增;使用數(shù)據(jù)塊傳送指令進(jìn)行堆棧操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆棧指令進(jìn)行堆棧操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和出棧操作則需要考慮空與滿、加與減對(duì)應(yīng)的問題。堆棧操作和數(shù)據(jù)塊傳送指令之間的關(guān)系如下表所示:注意:入棧和出棧的堆棧類型一定要相同。多寄存器尋址與堆棧尋址的比較堆棧尋址是多寄存器尋址的一種特殊方式。尋址方式指令基址寄存器指令選項(xiàng)多寄存器尋址LDM(讀內(nèi)存)STM(寫內(nèi)存)通用寄存器IA,IB,DA,DB堆棧尋址LDM(出棧)STM(入棧)固定為SPFD,ED
FA,EA(出棧)(入棧)(裝載)(保存)寄存器和存儲(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-40/95軟中斷指令主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù):切換到管理模式,并將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-41/95在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對(duì)SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數(shù)。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場保護(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ù)(低23位)
...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回yyyy-M-42/95偽指令在ARM匯編指令中,有一類特殊的指令沒有對(duì)應(yīng)的指令編碼。在匯編時(shí)根據(jù)情況會(huì)解釋為相應(yīng)的ARM、Thumb-2或Thumb-2之前的Thumb指令的組合。這類指令被ARM公司稱為“偽指令”。需要特別注意的是,這幾條指令和第9章中介紹的偽指令雖然形式上類似,但作用卻大不相同。第9章中介紹的偽指令用于指導(dǎo)匯編器完成相應(yīng)的匯編工作,符合通常意義上對(duì)偽指令的定義
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年綠色照明項(xiàng)目合作計(jì)劃書
- 2025年絲絹紡織及精加工產(chǎn)品項(xiàng)目建議書
- 五年級(jí)數(shù)學(xué)(小數(shù)乘除法)計(jì)算題專項(xiàng)練習(xí)及答案
- 三年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)及答案集錦
- 右肺低分化腺癌護(hù)理查房
- 陜西青年職業(yè)學(xué)院《藥學(xué)專業(yè)創(chuàng)新創(chuàng)業(yè)拓展》2023-2024學(xué)年第二學(xué)期期末試卷
- 集寧師范學(xué)院《物流管理前沿講座》2023-2024學(xué)年第一學(xué)期期末試卷
- 集美大學(xué)誠毅學(xué)院《英語視聽說(四)》2023-2024學(xué)年第二學(xué)期期末試卷
- 青島工學(xué)院《機(jī)能實(shí)驗(yàn)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 青島幼兒師范高等專科學(xué)?!督ㄖo水排水》2023-2024學(xué)年第一學(xué)期期末試卷
- 【初中生物】食物中營養(yǎng)物質(zhì)課件2024-2025學(xué)年人教版生物七年級(jí)下冊(cè)
- 2025河北保定鈔票紙業(yè)限公司招聘33人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 中專藥品gsp考試試題及答案
- 智慧教育解決方案
- 2025年共青團(tuán)入團(tuán)積極分子考試測(cè)試試卷題庫及答案
- 2024-2025學(xué)年人教版數(shù)學(xué)七下 第七章 相交線與平行線(含答案)
- 小件物品寄存和隨車托運(yùn)登記表
- 手壓式手電筒設(shè)計(jì)(棘輪機(jī)構(gòu)及電路設(shè)計(jì))
- 產(chǎn)品被預(yù)警、召回、索賠、退貨及顧客投訴管理程序
- 巖棉板外墻保溫真石漆施工方案
- 股權(quán)激勵(lì)機(jī)制在萬科集團(tuán)中的運(yùn)用分析
評(píng)論
0/150
提交評(píng)論