嵌入式系統(tǒng)原理與應(yīng)用技術(shù)袁志勇王景存章登義劉樹波_第1頁
嵌入式系統(tǒng)原理與應(yīng)用技術(shù)袁志勇王景存章登義劉樹波_第2頁
嵌入式系統(tǒng)原理與應(yīng)用技術(shù)袁志勇王景存章登義劉樹波_第3頁
嵌入式系統(tǒng)原理與應(yīng)用技術(shù)袁志勇王景存章登義劉樹波_第4頁
嵌入式系統(tǒng)原理與應(yīng)用技術(shù)袁志勇王景存章登義劉樹波_第5頁
已閱讀5頁,還剩157頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

《嵌入式系統(tǒng)原理與應(yīng)用技術(shù)》

袁志勇王景存章登義劉樹波

1Ch3ARM指令系統(tǒng)3.1ARM指令集3.2ARM匯編偽指令與偽操作3.3Thumb指令集簡介3.4ADS1.2集成開發(fā)環(huán)境的使用2ARM指令集總體可分為以下幾類數(shù)據(jù)處理指令:數(shù)據(jù)傳輸指令,算術(shù)指令,邏輯指令,比較指令,乘法指令,前導(dǎo)零計(jì)數(shù)程序狀態(tài)訪問指令:MRS和MSR分支/跳轉(zhuǎn)指令:B、BL和BX訪存指令:單數(shù)據(jù)訪存指令,多數(shù)據(jù)訪存指令,信號(hào)量操作指令異常中斷產(chǎn)生指令:SWI和BKPT協(xié)處理器指令33.1ARM指令集3.1.1ARM指令分類及格式

3.1.2ARM指令尋址方式3.1.3常用ARM指令

ARM嵌入式微處理器是基于精簡指令集計(jì)算機(jī)(RISC)原理而設(shè)計(jì)的,指令集和相關(guān)譯碼機(jī)制較為簡單。ARM9具有32位ARM指令和16位Thumb指令。4cond00XOpcodeSRnRdOperand20111215161920212425272831783.1.1ARM指令分類及格式

ARM嵌入式微處理器的指令集是加載、存儲(chǔ)型的,即指令集中僅能處理寄存器中的數(shù)據(jù),而且處理結(jié)果都要寫回寄存器中,而對(duì)存儲(chǔ)器的訪問則需要通過專門的加載、存儲(chǔ)指令來完成。ARM指令可分為以下六類:●數(shù)據(jù)處理指令:數(shù)據(jù)傳輸指令,算術(shù)指令,邏輯指令,比較指令,乘法指令,前導(dǎo)零計(jì)數(shù)●程序狀態(tài)訪問指令:MRS和MSR●分支指令:B、BL和BX●訪存指令:單數(shù)據(jù)訪存指令,多數(shù)據(jù)訪存指令,數(shù)據(jù)交換指令●異常產(chǎn)生指令:SWI和BKPT●協(xié)處理器指令:CDP、LDC、STC、MCR、MRC圖3.1ARM數(shù)據(jù)處理類指令編碼格式

5

這里以ARM數(shù)據(jù)處理類指令為例,說明ARM指令格式。ARM數(shù)據(jù)處理類指令編碼基本格式見圖3.1所示。

ARM數(shù)據(jù)處理指令基本格式如下:

<Opcode>{<cond>}{s}<Rd>,<Rn>,<Operand2>

其中,<>內(nèi)的項(xiàng)是必須的,{}內(nèi)的項(xiàng)是可選的。如<Opcode>是指令助記符,是必須的,而{<cond>}是指令執(zhí)行條件,是可選的,如果不寫則使用默認(rèn)條件AL(無條件執(zhí)行)。

cond:指令的條件碼。Opcode:指令操作碼(有16種編碼,對(duì)應(yīng)于16條指令,見下頁)。S:操作是否影響cpsr。Rn:表示第1個(gè)操作數(shù)的寄存器編碼。Rd:目標(biāo)寄存器編碼。Operand2:第2操作數(shù)(立即數(shù)/寄存器/寄存器移位)。X:1-第2操作數(shù)是立即數(shù)尋址,0-第2操作數(shù)是寄存器尋址6Opcode:bit[24:21]Operationcodes(未含乘法指令)0000=AND-Rd:=Op1ANDOp20001=EOR-Rd:=Op1EOROp20010=SUB-Rd:=Op1-Op20011=RSB-Rd:=Op2-Op10100=ADD-Rd:=Op1+Op20101=ADC-Rd:=Op1+Op2+C0110=SBC-Rd:=OP1-Op2+C-10111=RSC-Rd:=Op2-Op1+C-11000=TST-setconditioncodesonOp1ANDOp21001=TEQ-setconditioncodesonOP1EOROp21010=CMP-setconditioncodesonOp1-Op21011=CMN-setconditioncodesonOp1+Op21100=ORR-Rd:=Op1OROp21101=MOV-Rd:=Op21110=BIC-Rd:=Op1ANDNOTOp21111=MVN-Rd:=NOTOp2

按照?qǐng)D3.1所示的編碼格式,操作碼Opcode(未含乘法指令)所對(duì)應(yīng)的指令助記符及其含義如下:7條件碼的位數(shù)和位置:每條ARM指令包含4位條件碼域<cond>,它占用指令編碼的最高4位[31:28]。條件碼的表示:條件編碼共24

=16種,其中,15種用于指令的條件碼。每種條件碼用2個(gè)英文縮寫字符表示。(見P59表3-1)帶條件指令的執(zhí)行:ARM處理器根據(jù)指令的執(zhí)行條件是否滿足,決定當(dāng)前指令是否執(zhí)行。

只有在cpsr中的條件標(biāo)志位滿足指定的條件時(shí),指令才會(huì)被執(zhí)行。不符合條件的代碼依然占用一個(gè)時(shí)鐘周期(相當(dāng)于一個(gè)NOP指令)。條件碼的書寫方法:條件碼的位置在指令助記符的后面(因此也稱為條件后綴)。

例如:

MOVEQR0,R18條件碼助記符含義標(biāo)志0000EQ相等Z=10001NE不相等Z=00010CS/HS無符號(hào)數(shù)大于或等于C=10011CC/LO無符號(hào)數(shù)小于C=00100MI負(fù)數(shù)N=10101PI非負(fù)數(shù)N=00110VS溢出V=10111VC沒有溢出V=01000HI無符號(hào)數(shù)大于C=1且Z=01001LS無符號(hào)數(shù)小于或等于C=0或Z=11010GE有符號(hào)數(shù)大于或等于N=V1011LT有符號(hào)數(shù)小于N!=V1100GT有符號(hào)數(shù)大于Z=0且N=V1101LE有符號(hào)數(shù)小于或等于Z=1或N!=V1110AL無條件執(zhí)行任意1111保留v5以下版本總執(zhí)行,v5及以上版本有用9(1)ARM數(shù)據(jù)處理指令的功能主要完成寄存器中數(shù)據(jù)的算術(shù)和邏輯運(yùn)算操作。(2)ARM數(shù)據(jù)處理指令的特點(diǎn)

--操作數(shù)來源:所有的操作數(shù)要么來自寄存器,要么來自立即數(shù),不會(huì)來自存儲(chǔ)器。

--操作結(jié)果:如果有結(jié)果,則結(jié)果一定是為32位寬、或64位寬(長乘法指令),并且放在一個(gè)或兩個(gè)寄存器中,不會(huì)寫入存儲(chǔ)器。

--有第2個(gè)操作數(shù)(除了乘法指令)Operand2:切記其三種形式:立即數(shù)、寄存器、寄存器移位。

--乘法指令的操作數(shù):全部是寄存器。103.1.2ARM指令尋址方式

所謂尋址方式就是處理器根據(jù)指令中給出的地址信息來尋找操作數(shù)物理地址的方式。目前ARM處理器支持幾種常見的尋址方式。1.寄存器尋址寄存器尋址是指所需要的值在寄存器中,指令中地址碼給出的是寄存器編號(hào),即寄存器的內(nèi)容為操作數(shù)。例:ADDR0,R1,R2;R0←R1+R2112.立即尋址

立即尋址是一種特殊的尋址方式,指令中在操作碼字段后面的地址碼部分不是操作數(shù)地址,而是操作數(shù)本身。例:ADDR3,R3,#10;R3←R3+10立即數(shù)要以“#”號(hào)作前綴,以十進(jìn)制數(shù)10為例:它的16進(jìn)制立即數(shù)為#0xa;它的2進(jìn)制立即數(shù)為#0b1010。關(guān)于立即數(shù)的構(gòu)成,可參考圖3.2。圖3.2立即數(shù)構(gòu)成示意圖

12

從圖3.2可知,有效的立即數(shù)可以表示為:

<immediate>=Immed_8循環(huán)右移2×rot位由于4位rot移位值的取值(0~15)乘于2,得到一個(gè)范圍在0~30、步長為2的移位值。因此,ARM中的立即數(shù)又稱為8位位圖。我們只需記住一條準(zhǔn)則:“最后8位Immed_8移動(dòng)偶數(shù)位”得到立即數(shù)。只有通過此構(gòu)造方法得到的立即數(shù)才是合法的。下面是三條帶有立即數(shù)的MOV指令及對(duì)應(yīng)的機(jī)器碼,請(qǐng)注意機(jī)器碼中的立即數(shù)計(jì)算:MOVR0,#0xF200;E3A00CF2,0xF200=0xF2循環(huán)右移(2×C)MOVR1,#0x110000;E3A01811,0x110000=0x11循環(huán)右移(2×8)MOVR4,#0x12800;E3A04B4A,0x12800=0x4A循環(huán)右移(2×B)又如,0xFF、0x104(其8位圖為0x41)、0xFF0、0xFF00是合法的立即數(shù);0x101、0x102、0xFF1是非法的立即數(shù)。133.寄存器移位尋址

寄存器移位尋址方式是ARM指令集中所特有的,第二個(gè)寄存器操作數(shù)在與第一個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。在寄存器移位尋址中,移位的位數(shù)可以用立即數(shù)或寄存器方式表示。例:ADDR3,R2,R1,LSL#3;R3←R2+8×R1(即R1中的值向左移3位,與R2中的值相加,結(jié)果存入R3)MOVR0,R1,RORR2;R0←R1循環(huán)右移R2位ARM中有一桶式移位器,途經(jīng)它的操作數(shù)在被使用前能夠被移位或循環(huán)移位任意位數(shù),這在處理列表、表格和其他復(fù)雜數(shù)據(jù)結(jié)構(gòu)時(shí)非常有用。14

ARM中常用的幾種移位操作指令:(1)算術(shù)右移ASR存儲(chǔ)第二操作數(shù)的寄存器算術(shù)右移。算術(shù)移位的操作數(shù)是帶符號(hào)數(shù),完成移位時(shí)應(yīng)該保持操作數(shù)的符號(hào)不變。因此,當(dāng)被移位的操作數(shù)為正數(shù)時(shí),寄存器的高端空出位補(bǔ)0;當(dāng)被移位的操作數(shù)為負(fù)數(shù)時(shí),寄存器的高端空出位補(bǔ)1。(2)邏輯左移LSL存儲(chǔ)第二操作數(shù)的寄存器邏輯左移。寄存器中的高端送至C標(biāo)志位,低端空出位補(bǔ)0。(3)邏輯右移LSR

存儲(chǔ)第二操作數(shù)的寄存器邏輯右移。寄存器中的高端空出位補(bǔ)0。(4)循環(huán)右移ROR

存儲(chǔ)第二操作數(shù)的寄存器循環(huán)右移。從寄存器低端移出的位填入到寄存器高端的空出位上。15(5)擴(kuò)展的循環(huán)右移RRX

存儲(chǔ)第二操作數(shù)的寄存器進(jìn)行帶進(jìn)位位的循環(huán)右移。每右移一位,寄存器中高端空出位用原C標(biāo)志位的值填充。若移位的位數(shù)由5位立即數(shù)(取值范圍0-31)給出,就叫作立即數(shù)控制移位方式(immediatespecifiedshift);若移位的位數(shù)由通用寄存器(不能是R15)的低5位決定,就叫做寄存器控制移位方式(registerspecifiedshift)。關(guān)于寄存器控制移位方式,有如下兩點(diǎn)需要說明:●移位的寄存器不能是PC,否則會(huì)產(chǎn)生不可預(yù)知的結(jié)果?!袷褂眉拇嫫骺刂埔莆环绞接蓄~外代價(jià)(overhead),需要更多的周期才能完成指令,因?yàn)锳RM沒有能力一次讀取3個(gè)寄存器。立即數(shù)控制移位方式則沒有上述問題。164.寄存器間接尋址寄存器間接尋址是指指令中的地址碼給出的是某一通用寄存器的編號(hào),在被指定的寄存器中存放操作數(shù)的有效地址,而操作數(shù)則存放在該地址對(duì)應(yīng)的存儲(chǔ)單元中,即寄存器為地址指針。例:LDRR0,[R1];R0←[R1]5.變址尋址

變址尋址(或基址變址尋址)就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)有效地址。變址尋址用于訪問基址附近的單元,包括基址加偏移和基址加索引尋址。寄存器間接尋址是偏移量為0的基址加偏移尋址?;芳悠茖ぶ分械幕芳拇嫫靼牟皇谴_切的地址?;沸杓樱ɑ驕p)最大4KB的偏移來計(jì)算訪問的地址。例:LDRR0,[R1,#4];R0←[R1+4]17

有三種加偏移量(偏移地址)的變址尋址方式:(1)前變址方式(pre-indexed)先將基地址加上偏移量,生成操作數(shù)地址,再做指令指定的操作。該方式不修改基址寄存器。如,上面例子即為此方式。(2)自動(dòng)變址方式(auto-indexed)先將基地址加上偏移量,生成操作數(shù)地址,再做指令指定的操作;然后再自動(dòng)修改基址寄存器。例:LDRR0,[R1,#4]!;R0←[R1+4],R1←R1+4說明:!表示寫回或更新基址寄存器。(3)后變址方式(post-indexed)先將基址寄存器作為操作數(shù)地址;完成指令操作后,再將基地址加上偏移量修改基址寄存器。即先用基地址傳數(shù),然后再修改基地址(基址+偏移)。例:STRR0,[R1],#12;[R1]←R0,R1←R1+12

這里R1是基址寄存器。186.多寄存器尋址多寄存器尋址是指一條指令可以傳送多個(gè)寄存器的值,允許一條指令傳送16個(gè)寄存器的任何子集。例:LDMIAR1,{R0,R2,R5};R0←[R1],R2←[R1+4],R5←[R1+8]上面指令的含義是將R1所指向的連續(xù)3個(gè)存儲(chǔ)單元中的內(nèi)容分別送到寄存器R0,R2,R5中。由于傳送的數(shù)據(jù)項(xiàng)總是32位的字,基址R1應(yīng)該字對(duì)準(zhǔn)。197.堆棧尋址堆棧是一種按特定順序進(jìn)行存取的存儲(chǔ)區(qū),這種特定順序即是“先進(jìn)后出”或“后進(jìn)先出”。堆棧尋址是隱含的,它使用一個(gè)專門的寄存器(堆棧指針)指向一塊存儲(chǔ)器區(qū)域。棧指針?biāo)付ǖ拇鎯?chǔ)單元就是堆棧的棧頂。堆??煞譃閮煞N:●向上生長:又稱遞增(Ascending)堆棧,即地址向高地址方向生長。●向下生長:又稱遞減(Decending)堆棧,即地址向低地址方向生長。若SP指向最后壓入的堆棧的有效數(shù)據(jù)單元,稱為滿堆棧(FullStack);若SP指向下一個(gè)數(shù)據(jù)項(xiàng)放入的空單元,稱為空堆棧(Emptystack)。20

ARM處理器支持上面四種類型的堆棧工作方式:●滿遞增堆棧FA(FullAscending):堆棧指針指向最后壓入的數(shù)據(jù)單元,且由低地址向高地址生成;●滿遞減堆棧FD(FullDescending):堆棧指針指向最后壓入的數(shù)據(jù)單元,且由高地址向低地址生成;●空遞增堆棧EA(EmptyAscending):堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空單元,且由低地址向高地址生成;●空遞減堆棧ED(EmptyDescending):堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空單元,且由高地址向低地址生成;21例:STMFDsp!,{r4-r7,lr};將

r4~r7、lr入棧,滿遞減堆棧LDMFDsp!,{r4-r7,pc};數(shù)據(jù)出棧,放入r4~r7、pc寄存器圖3.3本例堆棧操作示意圖228.塊拷貝(復(fù)制)尋址塊拷貝尋址是指把存儲(chǔ)器中的一個(gè)數(shù)據(jù)塊加載到多個(gè)寄存器中,或者是把多個(gè)寄存器中的內(nèi)容保存到存儲(chǔ)器中?!駢K拷貝尋址是多寄存器傳送指令LDM/STM的尋址方式,因此也叫多寄存器尋址;●多寄存器傳送指令用于把一塊數(shù)據(jù)從存儲(chǔ)器的某一位置拷貝到另一位置;●塊拷貝指令的尋址操作取決于數(shù)據(jù)是存儲(chǔ)在基址寄存器所指的地址之上還是之下、地址是遞增還是遞減,并與數(shù)據(jù)的存取操作有關(guān);●塊拷貝尋址操作中的寄存器,可以是R0~R15這16個(gè)寄存器的子集,或是所有寄存器。幾種塊拷貝指令及其尋址操作說明如下:LDMIA/STMIA:先傳送,后地址加4(IncrementAfter);LDMIB/STMIB:先地址加4,后傳送(IncrementBefore);LDMDA/STMDA:先傳送,后地址減4(DecrementAfter);LDMDB/STMDB:先地址減4,后傳送(DecrementBefore)。23例:STMIAr10,{r0,r1,r4};STMIBr10,{r0,r1,r4};STMDAr10,{r0,r1,r4};STMDBr10,{r0,r1,r4};圖3.4本例的塊拷貝尋址操作示意圖

24表3.2多寄存器load和store指令的堆棧和塊拷貝對(duì)照

棧生長地址頂空滿增減次序棧、塊遞增棧、塊遞減頂滿頂空頂滿頂空地址增加先增STMIBSTMFALDMIBLDMED后增STMIASTMEALDMIALDMFD地址減少先減LDMDBLDMEASTMDBSTMFD后減LDMDALDMFASTMDASTMED259.相對(duì)尋址相對(duì)尋址是變址尋址的一種變通,由程序計(jì)數(shù)器PC提供基地址,指令中的地址碼字段作為偏移量,兩者相加后得到操作數(shù)的有效地址。偏移量指出的是操作數(shù)與當(dāng)前指令之間的相對(duì)位置。子程序調(diào)用指令BL即是相對(duì)尋址指令。例:BLROUTE_A;調(diào)用ROUTE_A子程序BEQLOOP;條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處......LOOPMOVR2,#2......ROUTE_A:......26數(shù)據(jù)傳送指令:MOV、MVN語法<Operation>{<cond>}{s}<Rd>,#<immed><Operation>{<cond>}{s}<Rd>,<Rm><Operation>{<cond>}{s}<Rd>,<Rm>,LSL#<immed_5><Operation>{<cond>}{s}<Rd>,<Rm>,LSL<Rs>偽代碼

ifConditionPassed(cond)then Rd=第2操作數(shù)

ifs==1andRd==pcthen

cpsr==spsr elseifs==1then setNZCVflagsincpsrMVN:movenegative3.1.3常用ARM指令

27MOV指令的功能寄存器之間傳送。立即數(shù)傳送到寄存器中(8位立即數(shù)位圖)。實(shí)現(xiàn)單純的移位操作。MOVRd,Rd,LSL,#3實(shí)現(xiàn)子程序調(diào)用、從子程序中返回。當(dāng)PC寄存器作為目標(biāo)寄存器時(shí)可以實(shí)現(xiàn)程序跳轉(zhuǎn)。實(shí)現(xiàn)把當(dāng)前處理器模式的SPSR寄存器內(nèi)容復(fù)制到CPSR中。

方法:當(dāng)PC寄存器作為目標(biāo)寄存器且指令中S位被設(shè)置時(shí),指令在執(zhí)行跳轉(zhuǎn)操作的同時(shí),將當(dāng)前處理器模式的SPSR寄存器內(nèi)容復(fù)制到CPSR中。這樣可以實(shí)現(xiàn)從某些異常中斷中返回。

例子:MOVS PC,LR28mvn意為“取反傳送”,它把源寄存器的每一位取反,將得到的結(jié)果寫入結(jié)果寄存器。對(duì)于mov和mvn指令,編譯器會(huì)進(jìn)行智能轉(zhuǎn)化。如指令“movr1,0xffffff00”中的立即數(shù)是非法的。在編譯時(shí),編譯器將其轉(zhuǎn)化為“mvnr1,0xff”,這樣就不違背立即數(shù)的要求。所以對(duì)于mov和mvn指令,可以認(rèn)為:合法的立即數(shù)反碼也是合法的立即數(shù)。29舉例mov r0,r1 /*r0=r1,不修改cpsr*/mov r0,#0x0 /*r0=0,不修改cpsr*/movs r0,#0x0 /*r0=0,同時(shí)設(shè)置cpsr的Z位*/movs r0,#-10 /*r0=0xfffffff6,同時(shí)設(shè)置cpsr的N位*/mvn r0,r2 /*r0=NOTr2,不修改cpsr*/mvn r0,0xffffffff /*r0=0x0,不修改cpsr*/mvns r0,0xffffffff /*r0=0x0,同時(shí)設(shè)置cpsr的Z位*/mov r0,r1,LSL#1 /*r0=r1<<1*/mov r0,r1,LSRr2 /*r0=r1>>r2*/movsr3,r1,LSL#2 /*r3=r1<<2,影響標(biāo)志位

*/30算術(shù)指令:add、adc、sub、sbc

、

rsb

、rsc語法<Operation>{<cond>}{s}<Rd>,<Rn>,#<immed><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm>,LSL#<immed_5><Operation>{<cond>}{s}<Rd>,<Rn>,<Rm>,LSL<Rs>偽代碼(以加法add為例)

ifConditionPassed(cond)then Rd=Rn+第2操作數(shù)

ifs==1andRd==pcthen

cpsr=spsr elseifs==1then setNZCVflagsincpsrRSB:ReverseSubtractRSC:ReverseSubtractwithCarry31說明:ADD,SUB,RSB不帶進(jìn)位或借位ADC,SBC,RSC帶進(jìn)位或借位。其句法是:op{cond}{S}Rd,Rn,Operand2ADD指令用于將Rn和Operand2的值相加;SUB指令用于從Rn的值中減去Operand2的值;RSB指令用于從Operand2的值中減去Rn的值;32ADC指令用于將Rn和Operand2的值相加,再加上進(jìn)位標(biāo)志C的值;SBC指令用于從Rn的值中減去Operand2的值,若進(jìn)位標(biāo)志C為0,結(jié)果再減1;RSC指令用于從Operand2的值中減去Rn的值,若進(jìn)位標(biāo)志C為0,結(jié)果再減1。以上指令執(zhí)行的結(jié)果均存于Rd中。S為可選的后綴。若指定S,則根據(jù)操作結(jié)果更新條件碼標(biāo)志33注意:若在這些指令后面加上后綴S,那么這些指令將根據(jù)其運(yùn)算結(jié)果更新標(biāo)志N,Z,C和V。若R15作為Rn使用,則使用的值是當(dāng)前指令的地址加8。若R15作為Rd使用,則執(zhí)行完指令后,程序?qū)⑥D(zhuǎn)移到結(jié)果對(duì)應(yīng)的地址處。若此時(shí)指令還加有后綴S,則還會(huì)將當(dāng)前模式的SPSR拷貝到CPSR??梢允褂眠@一點(diǎn)從異常返回。在有寄存器控制移位的任何數(shù)據(jù)處理指令中,不能將R15作為Rd或任何操作數(shù)來使用。34例:ADDR3,R7,#1020

;immed_8r為1020(0x3FC),是0xFF循環(huán)右移30位SUBSR8,R6,#240;R8←R6-240,運(yùn)算完成后將根據(jù)結(jié)果更新標(biāo)志RSBR4,R4,#1280;R4←1280-R4RSCLESR0,R5,R0,LSLR4;有條件執(zhí)行,執(zhí)行完后更新標(biāo)志35實(shí)現(xiàn)64位數(shù)據(jù)加法:

假設(shè)R0和R1存放一個(gè)64位的數(shù),R0存放低32位;R2和R3存放另一個(gè)64位的數(shù),R2存放低32位,兩個(gè)數(shù)相加,結(jié)果放回[R1:R0]中(R0中存放低位)ADDSR0,R0,R2;低32位相加并影響標(biāo)志位ADCR1,R1,R3;高32位相加并加上C標(biāo)志位(進(jìn)位值)36實(shí)現(xiàn)64位數(shù)據(jù)減法:

如果寄存器R0和R1中放置一個(gè)64位的被減數(shù),其中R0放置低32位;寄存器R2和R3放置一個(gè)64位的減數(shù),其中R2放置低32位.運(yùn)算結(jié)果放回[R1:R0]中(R0中放置低32位)SUBSR0,R0,R2;低32位相減并影響標(biāo)志位SBCR1,R1,R3;高32位相減再減去C標(biāo)志位的反碼37邏輯指令A(yù)ND,ORR,EOR和BIC指令邏輯與、或、異或等指令。其句法是:op{cond}{S}Rd,Rn,Operand2其中所用到的符號(hào)意義與前述的相同。AND,ORR和EOR指令分別完成按位將Rn和Operand2的值進(jìn)行“與”、“或”和“異或”操作,結(jié)果存于Rd中。BIC指令用于將Rn中的各位與Operand2的相應(yīng)位的反碼進(jìn)行“與”操作,結(jié)果存于Rd中。38使用這些指令時(shí)應(yīng)注意:若加有后綴S,這些指令執(zhí)行完后將根據(jù)結(jié)果更新標(biāo)志N和Z,在計(jì)算Operand2時(shí)更新標(biāo)志C,不影響標(biāo)志V。如:EORSR0,R0,R3,RORR6BICNESR8,R10,R0,RRX

39邏輯運(yùn)算指令舉例:ANDSR0,R0,#0x01;R0=R0&0x01;取出最低位數(shù)據(jù)ANDR2,R1,R3;R2=R1&R3·AND指令可用于提取寄存器中某些位的值。ORRR0,R0,#0x0F;將R0的低4位置1·ORR指令用于將寄存器中某些位的值設(shè)置成1。EORR1,R1,#0x0F;將Rl的低4位取反EORSR0,R5,#0x01;將R0

R5異或0x01, ;并影響標(biāo)志位

·EOR指令可用于將寄存器中某些位的值取反。將某一位與0異或,該位值不變;與1異或,該位值被求反。BICR1,R1,#0x0F;將R1的低4位清0, ;其它位不變

·BIC指令可用于將寄存器中某些位的值設(shè)置成0。將某一位與1做BIC操作,該位值被設(shè)置成0;將某一位與0做BIC操作,該位值不變。40比較指令CMP和CMN指令比較和比較反值指令。其句法如下:op{cond}Rn,Operand2其中所用到的符號(hào)意義與上述的相同。CMP指令從Rn的值中減去Operand2的值。除結(jié)果被舍棄外,其他與SUBS指令一樣;CMN(CompareNegative)指令將Operand2的值加到Rn的值中,除結(jié)果被舍棄外,其他與ADDS指令一樣。CMP和CMN指令執(zhí)行后均根據(jù)結(jié)果更新標(biāo)志N、Z、C和V。

CMN:CompareNegative41例:CMPR2,R9;N、Z、C、V←R2-R9CMNR0,#6400;N、Z、C、V←#6400-R0CMPGTR13,R7,LSL#2;帶符號(hào)大于42TST和TEQ指令測試和測試相等指令,其句法如下:op{cond}Rn,Operand2其中所用到的符號(hào)意義與上述的相同。TST指令對(duì)Rn的值和Operand2的值進(jìn)行按位與,除結(jié)果被舍棄外,其他與ANDS指令一樣;TEQ指令對(duì)Rn的值和Operand2的值進(jìn)行按位異或,除結(jié)果被舍棄外,其他與EORS指令一樣。TST和TEQ指令執(zhí)行后均根據(jù)結(jié)果更新標(biāo)志N、Z、C和V。43例:

TSTR0,#0x01

;判斷R0的最低位是否為0

TSTRl,#0x0F

;判斷R1的低4位是否為0

TEQR0,R1

;比較R0與R1是否相等 ;(不影響V位和C位)TST指令通常與EQ、NE條件碼配合使用。當(dāng)所有測試位均為0時(shí),EQ有效。而只要有一個(gè)測試位不為0,則NE有效。

TSTNER1,R5,ASRR1 TEQ指令與EORS指令的區(qū)別在于TEQ指令不保存運(yùn)算結(jié)果。使用TEQ進(jìn)行相等測試時(shí),常與EQ、NE條件碼配合使用。當(dāng)兩個(gè)數(shù)據(jù)相等時(shí),EQ有效;否則NE有效。

TEQEQR10,R944乘法指令(*:了解)ARM有兩類乘法指令:32位的乘法指令,即乘法操作的結(jié)果為32位;64位的乘法指令,即乘法操作的結(jié)果為64位。MULRd,Rm,Rs32位乘法指令MUARd,Rm,Rs,Rn32位乘加指令UMULLRdL,RdH,Rm,Rs,Rn64位無符號(hào)乘法UMALRdL,RdH,Rm,Rs,Rn64位無符號(hào)乘加SMULLRdL,RdH,Rm,Rs,Rn64位有符號(hào)乘法SMLALRdL,RdH,Rm,Rs,Rn64位有符號(hào)乘加45助記符說明操作條件碼位置MULRd,Rm,Rs32位乘法指令RdRm*Rs(Rd≠Rm)MUARd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn(Rd≠Rm)UMULLRdL,RdH,Rm,Rs64位無符號(hào)乘法(RdL,RdH)Rm*RsUMALRdL,RdH,Rm,Rs64位無符號(hào)乘加(RdL,RdH)Rm*RsSMULLRdL,RdH,Rm,Rs64位有符號(hào)乘法SMLALRdL,RdH,Rm,Rs64位有符號(hào)乘加461.MUL——32位乘法指令指令格式:MUL{cond}{S}Rd,Rm,Rs;RdRm*Rs MUL指令將Rm和Rs中的值相乘,結(jié)果的低32位保存到Rd中。

指令舉例:

MULR1,R2,R3;R1=R2×R3 MULSR0,R3,R7;R0=R3×R7,

;設(shè)置CPSR的N位和Z位

472.MLA——32位乘加指令

指令格式:

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

Rm*Rs+Rn

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

指令舉例:

MLAR1,R2,R3,R0;R1=R2xR3+R0483.UMULL—64位無符號(hào)乘法指令

指令格式:

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

;RdHi,RdLo

Rm*Rs UMULL指令將Rm和Rs中的值作無符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,高32位保存到RdHi中。

指令舉例:

UMULLR0,R1,R5,R8;(R1,R0)

R5×R8494.UMLAL—64位無符號(hào)乘加指令

指令格式:

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

Rm*Rs+RdHi,RdLo UMLAL指令將Rm和Rs中的值作無符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。

指令舉例:

UMLALR0,R1,R5,R8 ;(R1,R0)

R5×R8+(R1,R0)505.SMULL—64位有符號(hào)乘法指令

指令格式:SMULL{cond}{S}RdLo,RdHi,Rm,Rs;RdHi,RdLo

Rm*Rs SMULL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。

指令舉例:

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

R7xR6516.SMLAL—64位有符號(hào)乘加指令

指令格式:SMLAL{cond}{S}RdLo,RdHi,Rm,Rs;RdHi,RdLo

Rm*Rs+RdHi,RdLo SMLAL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,高32位保存到RdHi中。

指令舉例:

SMLALR2,R3,R7,R6 ;(R3,R2)

R7×R6+(R3,R2)527.乘法指令的特點(diǎn)

(1)不支持第2操作數(shù)為立即數(shù)。(2)結(jié)果寄存器不能與第1源寄存器相同。Rd、RdHi、RdLo不能與Rm為同一寄存器。RdHi和RdLo不能為同一寄存器。(3)避免將R15定義為任一操作數(shù)或結(jié)果寄存器。(4)早期的ARM處理器僅支持32位乘法指令。ARM7版本和后續(xù)的在名字中有M的處理器才支持64位乘法指令。53(5)對(duì)標(biāo)志位的影響對(duì)N標(biāo)志位:對(duì)有符號(hào)數(shù)乘法,若結(jié)果是32位指令形式,Rd的第31位是標(biāo)志位N;對(duì)于產(chǎn)生長結(jié)果的指令形式,RdHi的第31位是標(biāo)志位。對(duì)Z標(biāo)志位:如果Rd或RdHi、RdLo為0,則標(biāo)志位Z置位。對(duì)V標(biāo)志位:乘法指令不影響V標(biāo)志位。對(duì)C標(biāo)志位:

ARMv5及以上的版本不影響C標(biāo)志位;ARMv5以前的版本,C標(biāo)志位數(shù)值不確定。54寫出執(zhí)行完下面程序段后,[R3:R2]、[R4:R5]所存放的64位乘法結(jié)果分別為多少?MVNR0,#0X0 MOVR1,#0X1UMULLR2,R3,R1,R0SMULLR4,R5,R1,R0解:[R3:R2]為0XFFFFFFFF[R4:R5]為0XFFFFFFFFFFFFFFFF(-1)5556

程序狀態(tài)訪問指令當(dāng)需要修改cpsr/spsr的內(nèi)容時(shí),首先要讀取它的值到一個(gè)通用寄存器,然后修改某些位,最后將數(shù)據(jù)寫回到狀態(tài)寄存器(即:修改狀態(tài)寄存器一般是通過“讀?。薷模瓕懟亍比齻€(gè)步驟的操作來實(shí)現(xiàn)的)。cpsr/spsr不是通用寄存器,不能使用mov指令來讀寫。在ARM處理器中,只有mrs指令可以讀取cpsr/spsr;只有msr可以寫cpsr/spsr。56313029282726…876543210NZCVQ(保留)IFTM4M3M2M1M0圖ARM狀態(tài)寄存器的格式

條件碼標(biāo)志位(保存ALU中的當(dāng)前操作信息)N:正負(fù)號(hào)/大小標(biāo)志位

0表示:正數(shù)/大于;1表示:負(fù)數(shù)/小于Z:零標(biāo)志位

0表示:結(jié)果不為零;1表示:結(jié)果為零C:進(jìn)位/借位/移出位

0表示:未進(jìn)位/借位/移出0;1表示:進(jìn)位/未借位/移出1V:溢出標(biāo)志位

0表示:結(jié)果未溢出;1表示:結(jié)果溢出Q:DSP指令溢出標(biāo)志位(用于v5以上E系列)

0表示:結(jié)果未溢出;1表示:結(jié)果溢出57581.mrs-讀狀態(tài)寄存器指令

(MovePSRstatus/flagstoregister)

指令格式如下:

MRS{cond}Rd,psr

;Rd

psr

把狀態(tài)寄存器psr(CPSR或SPSR)的內(nèi)容傳送到目標(biāo)寄存器中。其中:Rd——

目標(biāo)寄存器。Rd不允許為R15。

psr

——CPSR或SPSR。

注意:在ARM處理器中,只有MRS指令可以將狀態(tài)寄存器CPSR或SPSR讀出到通用寄存器中。5859

MRS指令舉例:

MRSR1,CPSR ;R1

CPSR MRSR2,SPSR ;R2

SPSR MRS與MSR指令的應(yīng)用目的:獲得CPSR或SPSR的狀態(tài):

●用MRS指令讀取CPSR,可用來判斷ALU的狀態(tài)標(biāo)志,或IRQ、FIQ中斷是否允許等。

●用MRS指令在異常處理程序中,讀SPSR可知道進(jìn)行異常前的處理器狀態(tài)等。CPSR或SPSR進(jìn)行修改:

MRS與MSR配合使用,實(shí)現(xiàn)CPSR或SPSR寄存器的讀—修改—寫操作,可用來進(jìn)行處理器模式切換、允許/禁止IRQ/FIQ中斷等設(shè)置。59602.MSR——寫狀態(tài)寄存器指令

(MoveregistertoPSRstatus/flags)

在ARM處理器中,只有MSR指令可以直接設(shè)置狀態(tài)寄存器CPSR或SPSR。指令格式:

MSR{cond}psr_fields,#immed

MSR{cond}psr_fields,Rm

其中:

·

psr:CPSR或SPSR。

.immed:要傳送到狀態(tài)寄存器指定域的8位立即數(shù)。

.Rm:要傳送到狀態(tài)寄存器指定域的數(shù)據(jù)的源寄存器。6061fields

指定傳送的區(qū)域。fields可以是以下的一種或多種(字母必須為小寫):

c

控制域(psr[7…0]);

x

擴(kuò)展域(psr[15…8]);(暫未用)s

狀態(tài)域(psr[23…16]);(暫未用)f

標(biāo)志位域(psr[31…24])。31242316NZCVQ保留保留f(標(biāo)志位域)s(狀態(tài)域)158740保留IFTmodex(擴(kuò)展域)c(控制域)6162寫狀態(tài)寄存器指令msr的二進(jìn)制編碼格式0condR10fsxc1111操作數(shù)01112151619202122102324#25002627283118位立即數(shù)#rot0781100000000Rm03411cpsr/spsr域屏蔽立即數(shù)對(duì)準(zhǔn)操作數(shù)寄存器62指令舉例:

MSRCPSR_f,#0xf0 ;CPSR[31:28]=0xf(0b1111) ;即N,Z,C,V均被置1。

修改狀態(tài)寄存器一般是通過“讀?。薷模瓕懟亍比齻€(gè)步驟的操作來實(shí)現(xiàn)的。

CPSR的讀—修改—寫操作舉例:

例1:設(shè)置進(jìn)位位CMRS R0,CPSR ;R0CPSR

ORRR0,R0,#0x20000000;置1進(jìn)位位CMSR CPSR_f,R0 ;CPSR_fR0[31:24]

例2:從管理模式切換到IRQ模式

MRS R0,CPSR ;R0CPSRBIC R0,R0,#0x1f ;低5位清零

ORR R0,R0,#0x12;設(shè)置為IRQ模式(P50表2-3)MSR CPSR_c,R0 ;傳送回CPSR

例3:MSR CPSR_c,#0xd3

;切換到SVC模式MSR CPSR_cxsf,R3 ;CPSR=r363注意:●控制域的修改問題:只有在特權(quán)模式下才能修改狀態(tài)寄存器的控制域[7:0],以實(shí)現(xiàn)處理器模式轉(zhuǎn)換,或設(shè)置開/關(guān)異常中斷?!?/p>

T控制位的修改問題:程序中不能通過MSR指令,直接修改CPSR中的T控制位來實(shí)現(xiàn)ARM狀態(tài)/Thumb狀態(tài)的切換,必須使用BX指令完成處理器狀態(tài)的切換?!裼脩裟J较履軌蛐薷牡奈唬涸谟脩裟J街荒苄薷摹皹?biāo)志位域”,不能對(duì)CPSR[23:0]做修改?!馭后綴的使用問題:在MRS/MSR指令中不可以使用S后綴。64

跳轉(zhuǎn)/分支指令1.B——轉(zhuǎn)移指令

指令格式:

B{cond}labelB指令跳轉(zhuǎn)到指定的地址執(zhí)行程序。指令舉例:

BWAITA;跳轉(zhuǎn)到WAITA標(biāo)號(hào)處

B0x1234;跳轉(zhuǎn)到絕對(duì)地址0x1234處轉(zhuǎn)移指令B限制在當(dāng)前指令的±32MB的范圍內(nèi)。65

跳轉(zhuǎn)/分支指令1.B——轉(zhuǎn)移指令

指令格式:

B{cond}labelB指令跳轉(zhuǎn)到指定的地址執(zhí)行程序。指令舉例:

BWAITA;跳轉(zhuǎn)到WAITA標(biāo)號(hào)處

B0x1234;跳轉(zhuǎn)到絕對(duì)地址0x1234處轉(zhuǎn)移指令B限制在當(dāng)前指令的±32MB的范圍內(nèi)。66

舉例:

無條件跳轉(zhuǎn):

Blabel……label……

執(zhí)行10次循環(huán):

MOVR0,#10LOOP ……SUBSR0,R0,#1BNELOOP;z=0轉(zhuǎn)LOOP672.BL——帶鏈接的轉(zhuǎn)移指令

指令格式如下:

BL{cond}labelBL指令先將下一條指令的地址拷貝到LR

鏈接寄存器中,然后跳轉(zhuǎn)到指定地址運(yùn)行程序。

指令舉例:

BLSUB1 ;LR

下條指令地址

;轉(zhuǎn)至子程序SUB1處

…SUB1…MOVPC,LR ;子程序返回

注意:轉(zhuǎn)移地址限制在當(dāng)前指令的±32MB的范圍內(nèi)。BL指令常用于子程序調(diào)用。68

例子:根據(jù)不同的條件,執(zhí)行不同的子程序。

CMPR1,#5 BLLTADD11 ;有符號(hào)數(shù)< BLGESUB22 ;有符號(hào)數(shù)≧

…ADD11…SUB22…

注:如果R1<5,只有ADD11不改變條件碼,本例才能正常工作。69例子:

BLSUB1……SUB1STMFDSP!,{R0-R3,R14}……BLSUB2……SUB2……

注意:在保存R14之前子程序不應(yīng)再調(diào)用下一級(jí)的嵌套子程序。否則,新的返回地址將覆蓋原來的返回地址,就無法返回到原來的調(diào)用位置。703.BX——帶狀態(tài)切換的轉(zhuǎn)移指令

指令格式:

BX{cond}Rm

功能:PC=Rm&0xfffffffe,T=Rm[0]&1BX指令跳轉(zhuǎn)到Rm指定的地址執(zhí)行程序。若Rm的位[0]為1,則跳轉(zhuǎn)時(shí)自動(dòng)將CPSR中的標(biāo)志T置位,即把目標(biāo)地址的代碼解釋為Thumb代碼;若Rm的位[0]為0,則跳轉(zhuǎn)時(shí)自動(dòng)將CPSR中的標(biāo)志T復(fù)位,即把目標(biāo)地址的代碼解釋為ARM代碼。71

舉例:

……

ADRR0,THUMBCODE+1;將R0的bit[0]置1

BXR0;跳轉(zhuǎn),并根據(jù)R0的bit[0]實(shí)現(xiàn)狀態(tài)切換

CODE16;16位Thumb代碼THUMBCODEMOVR2,#2

……ADRR0,ARMCODE;加載ARMCODE地址到R0中

BXR0CODE32;32位ARM代碼ARMCODEMOVR4,#4……72

訪存指令(數(shù)據(jù)加載與存儲(chǔ)器指令):

1、單數(shù)據(jù)訪存指令

2、多數(shù)據(jù)訪存指令

3、數(shù)據(jù)交換/信號(hào)量操作指令73單數(shù)據(jù)訪存指令第一類:讀寫字: ldr/str讀寫無符號(hào)字節(jié): ldrb/strb第二類:讀寫無符號(hào)半字: ldrh/strh讀有符號(hào)半字: ldrsh讀有符號(hào)字節(jié): ldrsbldr:load

registerfrommemorystr:storeregistertomemory74第一類指令的指令格式0000000000Rm03411方式2:Rm例子:ldrr0,[r1,+r2]011#immed_12方式1:#immed_12(取值范圍0–0xfff)例子:ldrr0,[r1,#+0xfff]shiftRm03411#immed_567方式3:RmLSL#immed_5(取值范圍0-31)例子:ldrr0,[r1,r2LSL#31]050/1:str/ldr0/1:無/有(!)0/1:后變址/前變址0/1:字/無符號(hào)字節(jié)condRnRd第2操作數(shù)07811121516192022012728312324UBWL2126PI250/1:加/減(第2操作數(shù))0/1:立即數(shù)(方式1)/寄存器(方式2,3)75第一類指令的語法語法ldr|str{<cond>}<Rd>,[<Rn>,#+<immed_12]{!}ldr|str{<cond>}<Rd>,[<Rn>,+<Rm>]{!}ldr|str{<cond>}<Rd>,[<Rn>,+<Rm>,<shift>#<immed_5>]{!}ldr|str{<cond>}<Rd>,[<Rn>],#+<immed_12ldr|str{<cond>}<Rd>,[<Rn>],+<Rm>ldr|str{<cond>}<Rd>,[<Rn>],+<Rm>,<shift>#<immed_5>舉例ldrbr0,[r1,#+0xfff] ;把r1+0xfff地址的字節(jié)讀入r0ldrr0,[r1,+r2]! ;把r1+r2地址的32比特?cái)?shù)讀入r0,然后r1=r1+r2strr0,[r1,+r2,LSL#31];把r0(32bit)寫到地址r1+(r2<<31)ldrr0,[r1],#+0xfff ;把r1地址的數(shù)讀入r0,然后r1=r1+0xfffldrr0,[r1],+r2 ;把r1地址的數(shù)讀入r0,然后r1=r1+r2ldrr0,[r1],+r2,LSL#31;把r1地址的數(shù)讀入r0,然后r1=r1+(r2<<31)76說明ldr/str

讀/寫一個(gè)32bit字到/從一個(gè)32bit的寄存器,要求讀/寫地址字對(duì)齊。ldrb:讀一個(gè)8bit字節(jié)到一個(gè)32bit的寄存器,不要求地址對(duì)齊,寄存器的高24位清零。strb:將寄存器的低8位,寫入內(nèi)存的某個(gè)地址。不要求地址對(duì)齊。77第二類指令讀寫無符號(hào)半字: ldrh/str讀有符號(hào)半字: ldrsh讀有符號(hào)字節(jié): ldrsb78指令匯總:LDR 字?jǐn)?shù)據(jù)讀取指令LDRH 字節(jié)數(shù)據(jù)讀取指令LDRBT 用戶模式的字節(jié)數(shù)據(jù)讀取指令LDRH 半字?jǐn)?shù)據(jù)讀取指令LDRSB 有符號(hào)的字節(jié)數(shù)據(jù)讀取指令LDRSH 有符號(hào)的半字?jǐn)?shù)據(jù)讀取指令LDRT 用戶模式的字?jǐn)?shù)據(jù)讀取指令STR 字?jǐn)?shù)據(jù)寫入指令STRB 字節(jié)數(shù)據(jù)寫入指令STRBT 用戶模式字節(jié)數(shù)據(jù)寫入指令STRH 半字?jǐn)?shù)據(jù)寫入指令STRT 用戶模式字?jǐn)?shù)據(jù)寫入指令79T后綴.T為可選后綴,若指令有T,那么即使處理器是在特權(quán)模式下,存儲(chǔ)系統(tǒng)也將訪問看成是處理器在用戶模式下。.用于存儲(chǔ)器保護(hù)。.不能與前變址尋址、自動(dòng)變址尋址一起使用(即不能改變基址寄存器值)。.T在用戶模式下無效。80操作數(shù)的尋址方式:

LDR/STR指令為變址尋址,由兩部分組成:

——基地址部分:為一個(gè)基址寄存器,可以為任一個(gè)通用寄存器;

——偏移地址部分:這一部分非常靈活,實(shí)際就是第2個(gè)操作數(shù),可以有以下3種形式:

立即數(shù)

寄存器

寄存器移位及移位常數(shù)81①立即數(shù)

——12位立即數(shù)可以是一個(gè)無符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 指令舉例:LDRR1,[R0,#0x12]

;將R0+0x12地址處的數(shù)據(jù)讀出,保存到R1中(R0的值不變)LDRR1,[R0,#-0x12]

;將R0-0x12地址處的數(shù)據(jù)讀出,保存到R1中(R0的值不變)82②

寄存器

——寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。

指令舉例如下:LDRR1,[R0,R2]

;將R0+R2地址處的數(shù)據(jù)讀出,保存到R1中LDRR1,[R0,-R2]

;將R0-R2地址處的數(shù)據(jù)讀出,保存到R1中83③寄存器移位及移位常數(shù)

——寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 指令舉例:LDRR1,[R0,R2,LSL#2]

;將R0+R2×4地址處的數(shù)據(jù)讀出,保存到R1中(R0、R2的值不變)LDRR1,[R0,-R2,LSL#2]

;將R0-R2×4地址處的數(shù)據(jù)讀出,保存到R1中(R0、R2的值不變)

注意:移位位數(shù)最多是5比特位的立即數(shù),不能使用寄存器指定移位位數(shù)。84④

PC(即R15)使用的幾個(gè)問題使用PC作為基址時(shí),使用的數(shù)值是指令的地址加8個(gè)字節(jié)(取指與執(zhí)行相差8個(gè)字節(jié))。PC不能用做偏移寄存器,也不能用于任何變址尋址模式。把一個(gè)字加載到PC,將使程序轉(zhuǎn)移到所加載的地址,這是一個(gè)公認(rèn)的實(shí)現(xiàn)跳轉(zhuǎn)的方法。但是應(yīng)當(dāng)避免將一個(gè)字節(jié)加載到PC。把PC存到存儲(chǔ)器的操作在不同體系結(jié)構(gòu)的處理器中產(chǎn)生不同的結(jié)果,應(yīng)盡可能避免。85半字和有符號(hào)字節(jié)的加載/存儲(chǔ)指令說明:

這類LDR/STR指令可實(shí)現(xiàn)半字(有符號(hào)和無符號(hào))、有符號(hào)字節(jié)數(shù)據(jù)的傳送。

(1)特點(diǎn):

偏移量格式、尋址方式與加載/存儲(chǔ)字和無符號(hào)字節(jié)指令基本相同。

立即數(shù)偏移量限定在8位,寄存器偏移量不可經(jīng)過移位得到。86(2)兩點(diǎn)說明:符號(hào)位——有符號(hào)字節(jié)或有符號(hào)半字的加載,用“符號(hào)位”擴(kuò)展到32位;無符號(hào)半字傳送是用0擴(kuò)展到32位。地址對(duì)齊——對(duì)半字傳送的地址必須為偶數(shù)。非半字對(duì)齊的半字加載將使Rd內(nèi)容不可靠;非半字對(duì)齊的半字存儲(chǔ)將使指定地址的2字節(jié)存儲(chǔ)內(nèi)容不可靠。87(3)指令舉例

LDRSBR1,[R0,R3]

;將R0+R3地址上的字節(jié)數(shù)據(jù)讀到R1,高24位用符號(hào)位擴(kuò)展。

LDRSHR1,[R9]

;將R9地址上的半字?jǐn)?shù)據(jù)讀出到R1,高16位用符號(hào)位擴(kuò)展。

LDRHR6,[R2],#2

;將R2地址上的半字?jǐn)?shù)據(jù)讀出到R6,高16位用零擴(kuò)展,然后修改R2=R2+2。

STRHR1,[R0,#2]!

;將R1的數(shù)據(jù)保存到R0+2地址中,只存儲(chǔ)低2字節(jié)數(shù)據(jù),并且修改R0=R0+2。88尋址(復(fù)習(xí))基址寄存器數(shù)據(jù)訪問strr0,[r1]ldrr2,[r1]89前變址尋址strr0,[r1,#12]{!};mem32[r1+12]=r0;{r1=r1+12;}90后變址尋址數(shù)據(jù)訪問strr0,[r1],#12mem32[r1]=r0;r1=r1+12;91多數(shù)據(jù)訪存指令批量訪存指令可以實(shí)現(xiàn)一組(1-16)寄存器和一塊(4-64字節(jié))連續(xù)內(nèi)存單元之間的數(shù)據(jù)傳輸。92指令格式93LDM/STM指令的語法語法ldm|stm{<cond>}<addressing_mode><Rn>{!},<registers>{^}<addressing_mode>——地址變化方式有4種:IA(IncrementAfter) 事后遞增IB(IncrementBefore) 事先遞增DA(DecrementAfter) 事后遞減DB(DecrementBefore)事先遞減例子ldmiar0,{r5-r8} /*將內(nèi)存中(r0)到(r0+12)4個(gè)字讀取到r5~r8的4個(gè)寄存器中*/ldmibr0,{r5-r8}/*將內(nèi)存中(r0+4)到(r0+16)4個(gè)字讀取到r5~r8的4個(gè)寄存器中*/ldmdar0,{r5-r8}/*將內(nèi)存中(r0-12)到(r0)4個(gè)字讀取到r5~r8的4個(gè)寄存器中*/ldmdbr0,{r5-r8}/*將內(nèi)存中(r0-16)到(r0-4)4個(gè)字讀取到r5~r8的4個(gè)寄存器中*/94--指令格式說明

(1)Rn:表示基址寄存器,裝有傳送數(shù)據(jù)的初始地址,Rn不允許為R15(即PC)。

(2)Rn后綴“!”:表示最后的地址寫回到Rn中。

(3)Registers:表示寄存器列表,可包含多個(gè)序號(hào)連續(xù)的或者分離的寄存器,用“,”分開。格式例子:{R1,R2,R6-R9}列表寄存器和存儲(chǔ)器地址的關(guān)系規(guī)則:

編號(hào)低的寄存器對(duì)應(yīng)于存儲(chǔ)器中低地址單元,編號(hào)高的寄存器對(duì)應(yīng)于存儲(chǔ)器中高地址單元。95(4)后綴“^”說明寄存器列表不包含PC:使用后綴“^”進(jìn)行數(shù)據(jù)傳送時(shí),加載/存儲(chǔ)的是用戶模式的寄存器,而不是當(dāng)前模式的寄存器。寄存器列表包含有PC:除了正常的多寄存器傳送外,還要將SPSR拷貝到CPSR中。 該用法可用于異常處理返回。禁用情況:后綴“^”不允許在用戶模式或系統(tǒng)模式下使用,因?yàn)樗鼈儧]有SPSR。96(5)當(dāng)Rn在寄存器列表中且使用后綴“!”對(duì)于STM指令,若Rn為寄存器列表中的最低數(shù)字的寄存器,則會(huì)將Rn的初值保存;其它情況下Rn的加載值和存儲(chǔ)值不可預(yù)知。(6)地址字對(duì)齊

——這些指令尋址是字對(duì)齊的,即忽略地址位[1:0]。97

(7)關(guān)于模式項(xiàng)

LDM/STM的主要用途是現(xiàn)場保護(hù)、數(shù)據(jù)復(fù)制和參數(shù)傳送等。其模式有如下8種{前面4種用于數(shù)據(jù)塊的傳送(為訪存操作),后面4種是堆棧操作}:IA:先傳、后地址加4;IB:先地址加4、后傳;DA:先傳、后地址減4;DB:先地址減4、后傳;FD:滿遞減堆棧,先地址減4、后傳,與DB對(duì)應(yīng);ED:空遞減堆棧,先傳、后地址減4,與DA對(duì)應(yīng);FA:滿遞增堆棧,先地址加4、后傳,與IB對(duì)應(yīng);EA:空遞增堆棧,先傳、后地址加4,與IA對(duì)應(yīng)。98LDM指令的三種用法編號(hào)!^pcldm指令不同的功能用法1是是是同(5),但是更新<Rn>

溫馨提示

  • 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)論