嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第3、4章 ARM微處理器指令系統(tǒng)、微處理器ARM程序設(shè)計(jì)_第1頁
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第3、4章 ARM微處理器指令系統(tǒng)、微處理器ARM程序設(shè)計(jì)_第2頁
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第3、4章 ARM微處理器指令系統(tǒng)、微處理器ARM程序設(shè)計(jì)_第3頁
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第3、4章 ARM微處理器指令系統(tǒng)、微處理器ARM程序設(shè)計(jì)_第4頁
嵌入式系統(tǒng)原理與應(yīng)用 第3版 課件 第3、4章 ARM微處理器指令系統(tǒng)、微處理器ARM程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩169頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1第3章ARM微處理器指令系統(tǒng)ARM指令系統(tǒng)有標(biāo)準(zhǔn)的32bitARM指令集和16bit的Thumb指令集,通常人們心中所想的也就是前者,這也是本節(jié)所介紹的主要內(nèi)容,以后簡稱ARM指令集。

不管是進(jìn)行裸機(jī)的ARM應(yīng)用系統(tǒng)開發(fā),還是在移植了操作系統(tǒng)的基礎(chǔ)上進(jìn)行開發(fā),ARM匯編程序都是不可逾越的鴻溝。因?yàn)锳RM微處理器要想正常工作,就必須配置好它的硬件環(huán)境,這也就相當(dāng)于PC機(jī)主板上的BIOS固化程序,在ARM中是系統(tǒng)啟動(dòng)引導(dǎo)程序Bootloader,這需要使用ARM匯編指令來編寫。

本章介紹ARM9微處理器的指令格式與特點(diǎn)、ARM9的尋址方式,分類講述ARM9指令的功能,并給出了一些應(yīng)用示例。23.1ARM9的指令格式ARM指令集中的指令均為單字指令,它為指令的流水線執(zhí)行創(chuàng)造了條件;大部分都以寄存器作為它的操作數(shù),指令執(zhí)行速度快,尋址方式靈活多樣。但是對于32位的ARM處理器來講,指令中的立即數(shù)卻有特殊的限制,必須滿足一定的條件。當(dāng)要向某一寄存器送入任意32位的立即數(shù)數(shù)時(shí),必須使用ARM中定義的“假偽指令”LDR來實(shí)現(xiàn)。之所以稱為“假偽指令”就是因?yàn)樗c其他的偽指令不同,編譯器可以通過文字池將它等效為ARM指令,因此它有機(jī)器碼。31.ARM指令的特點(diǎn)

ARM指令都是單字指令,占32bit?;局噶钪挥?6條。

指令可以有條件的執(zhí)行,也可以無條件執(zhí)行。當(dāng)指令帶有條件碼并且條件滿足時(shí)執(zhí)行該指令,條件不滿足時(shí)該指令被當(dāng)作一條空操作NOP指令。

靈活的尋址方式。計(jì)算機(jī)的尋址方式是計(jì)算機(jī)的主要性能特征之一,ARM指令有7種基本尋址方式,5種復(fù)合尋址方式。3.1.1ARM9處理器的指令格式與特點(diǎn)1.ARM指令的特點(diǎn)(續(xù))

對協(xié)處理器的支持。在很多以ARM為核的微處理器中,都集成了增強(qiáng)浮點(diǎn)運(yùn)算功能的協(xié)處理器。ARM內(nèi)核提供了協(xié)處理器接口,通過擴(kuò)展協(xié)處理器可以增加許多新的功能。因此,ARM指令中還包含許多條協(xié)處理器指令。

Thumb指令集。ARM中有2種工作狀態(tài)決定著它有2種指令集:32bit的ARM指令集和16bit的Thumb指令集。Thumb指令集是重新編碼的ARM指令集的子集,通常運(yùn)行于16位或低于16位的內(nèi)存數(shù)據(jù)總線上。使用16位的存儲器可以降低成本,同時(shí)Thumb指令集的執(zhí)行速度比ARM32bit指令集要快,而且提高了代碼密度。452.ARM指令的一般編碼格式與語法格式1)ARM指令使用固定的32bit字長,典型的ARM指令編碼格式如下圖。2)ARM指令的語法格式如下:{label}<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}{;comment}

其中:{}中的內(nèi)容為可選項(xiàng),<>中的內(nèi)容為必選項(xiàng)。6以下是一小段匯編程序。LDRR0,[R1];以R1的內(nèi)容為內(nèi)存地址,讀出該單元的數(shù)據(jù)送R0,無條件執(zhí)行BEQSUBPROG;B是跳轉(zhuǎn)指令,當(dāng)條件EQ滿足時(shí),程序跳轉(zhuǎn)到SUBPROG。

ADDSR1,R1,#10;ADD加法指令,實(shí)現(xiàn)R1+10→R1,帶有S,影響條件標(biāo)志位。SUBNESR1,R1,#0xC;SUB減法指令,當(dāng)NE條件滿足時(shí)執(zhí)行該指令,并影響標(biāo)志位。3)應(yīng)用舉例對第2操作數(shù)使用的一些說明:它共占12bit,可以用來存儲立即數(shù),具體的形式見下⑴;還可以進(jìn)行寄存器移位的偏移量操作,這時(shí)移位的寄存器Rm編碼占4bit,移位類型操作碼占3bit,移位常數(shù)占5bit。在ARM指令中為了提高代碼的執(zhí)行效率,可以靈活地使用第2操作數(shù),上面的后2條指令就使用了第2操作數(shù),它們是以立即數(shù)的形式出現(xiàn)的。第2操作數(shù)也可以實(shí)現(xiàn)復(fù)合尋址方式。以下較為詳細(xì)地介紹它的操作數(shù)形式。7⑴立即數(shù)形式用#immed_8r表示,即數(shù)據(jù)前使用符號“#”。immed_8r對應(yīng)一個(gè)8位位圖的常數(shù),即一個(gè)8bit的二進(jìn)制常數(shù)向右循環(huán)移動(dòng)偶數(shù)位得到的結(jié)果。具體的移位由4bit二進(jìn)制數(shù)乘以2確定,取值范圍是(0~24-1)×2=0~30。由前圖3-1典型的ARM編碼格式可以看出,第2操作立即數(shù)共占用12bit(b11~b0),這里的8bit指的是b7~b0,4bit指的是b11~b8。8注意:在寫匯編程序時(shí),只要指令中的立即數(shù)通過上述運(yùn)算可以獲得就是正確的,程序員不需要考慮立即數(shù)在指令代碼中的具體存儲,由ARM匯編編譯器確定。還有一點(diǎn)也要特別留心,就是最后形成的是一個(gè)32bit的數(shù)據(jù)常量。例如:合法的常數(shù)有:0x2FC、0xFF000000、0xF0000001、0x00~0xFF。非法的常數(shù)有:0x1FE、511、0xFFFF、0x10100和xF000010。常數(shù)表達(dá)式應(yīng)用舉例如下:MOVR0,#20;立即數(shù)20→R0ANDR1,R2,#0xAF;R2邏輯“與”立即數(shù)0xAF→R1LDRR0,[R1],#4;讀以R1內(nèi)容為地址的存儲單元數(shù)據(jù)→R0,之后R1←R1+4910⑵Rm寄存器形式在這種方式下,第2操作數(shù)就是Rm寄存器的內(nèi)容,具體應(yīng)用實(shí)例如下:SUBR1,R1,R2;R1←R1-R2MOVPC,R1;PC←R1,程序跳轉(zhuǎn)到指定地址去執(zhí)行LDRR0,[R1],-R2;讀以R1內(nèi)容為地址的存儲單元數(shù)據(jù)→R0,之后R1←R1-R211⑶Rm寄存器移位形式Rm寄存器移位形式需要算術(shù)移位或邏輯移位的操作符與常數(shù)結(jié)合完成,操作完成后,Rm中的內(nèi)容不變。移位的方法如下:ASR#n;算術(shù)右移(ArithmeticShiftRight)n位,移位過程中保持符號位不變,即如果源操作數(shù)為正數(shù),則字的高端空出的位補(bǔ)0,否則補(bǔ)1。要求1≤n≤31。LSL#n;邏輯左移(LogicalShiftLeft)n位,寄存器中字的低端空出的位補(bǔ)0。要求1≤n≤31。LSR#n;邏輯右移(LogicalShiftRight)n位,寄存器中字的高端空出的位補(bǔ)0。要求1≤n≤31ROR#n;循環(huán)右移(RotateRight)n位,由字的低端移出的位填入字的高端空出的位。要求1≤n≤31。RRX#n;帶擴(kuò)展的循環(huán)右移(RotateRightextendedby1place),操作數(shù)每右移一位,高端空出的位用進(jìn)位位C標(biāo)志值填充。注意:當(dāng)n不在規(guī)定的取值范圍時(shí),它們運(yùn)算的結(jié)果為0。寄存器移位形式應(yīng)用舉例:ADDR1,R1,R1,LSL#3;R1←R1左移3位(即×8)+R1SUBR0,R0,R1,LSL#2;R0←R0-R1左移2位(即×4)

3.1.2指令執(zhí)行的條件碼

大多數(shù)ARM指令都是有條件執(zhí)行的,也就是說根據(jù)當(dāng)前程序狀態(tài)寄存器CPSR中的條件標(biāo)志位來決定是否執(zhí)行該指令。另外還必須在指令格式中包含條件助記符。從指令的編碼格式中可以得知,條件碼cond占32bit指令的最高4bit,也就是說它可以組合成16種條件碼。每種條件碼的含義和助記符如表3-1所示。1213操作碼[31:28]條件碼助記符CPSR中的標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負(fù)數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數(shù)大于1001LSC=0,Z=1無符號數(shù)小于或等于1010GEN=V帶符號數(shù)大于或等于1011LTN!=V帶符號數(shù)小于1100GTZ=0,N=V帶符號數(shù)大于1101LEZ=1,N!=V帶符號數(shù)小于或等于1110AL無條件執(zhí)行任何版本1111AL無條件執(zhí)行任何(v5以上版本)表3-1ARM指令的條件碼含義和助記符表143.2ARM9處理器指令的尋址方式與應(yīng)用示例尋址方式是計(jì)算機(jī)的主要性能特征表現(xiàn)之一。所謂尋址方式就是微處理器在指令碼中尋找操作數(shù)地址的方式。標(biāo)準(zhǔn)的ARM都是32bit的指令,它們可以有3個(gè)操作數(shù),其中第1個(gè)操作數(shù)一般為基本操作數(shù)尋址方式,第2、第3個(gè)操作數(shù)可采用復(fù)合尋址方式。以下介紹ARM微處理器的9種尋址方式。153.2.1立即數(shù)尋址方式立即數(shù)尋址即操作數(shù)就在指令的代碼中。立即數(shù)要以“#”為前綴,表示16進(jìn)制數(shù)值時(shí)以“0x”表示。應(yīng)用示例:ADDR0,R0,#1;R0←R0+1,不影響標(biāo)志位MOVR0,#0xff00;R0←0xff00,不影響標(biāo)志位注意:指令中的立即數(shù)是用12bit表示的。前已介紹它是由一個(gè)8bit的常數(shù)(圖中的immed_8)乘以一個(gè)4bit二進(jìn)制數(shù)(圖中的rotate_imm)的2倍后獲得的。即8bit常數(shù)×(0~15)×2。并不是所有的32bit都可以作為合法的立即數(shù)。具體描述如3-2圖所示。書寫立即數(shù)時(shí),必須以“#”開頭。對于不同進(jìn)制的立即數(shù)有不同的書寫方式。

對于十六進(jìn)制數(shù),“#”后加“0x”或“&”,如#0xaf或&af。

對于二進(jìn)制數(shù),“#”后加“0b”或“%”,如#0b10101011或#%10101011。

對于十進(jìn)制數(shù),“#”后加“0d”或省略,如#0d123或547。16

3.2.2寄存器尋址方式寄存器尋址的操作數(shù)就是寄存器的內(nèi)容。指令中的地址碼字段給出的是寄存器編號,寄存器的內(nèi)容就是操作數(shù),指令執(zhí)行時(shí)直接取出寄存器值操作。應(yīng)用示例:MOVR1,R2

;R1←R2

SUBR0,R1,R2;R0←R1-R2173.2.3寄存器偏移尋址方式寄存器偏移尋址是ARM指令集特有的尋址方式。以下用其中的一條指令進(jìn)行說明。MOVRd,Rn,Rm,{<shift>}

其中:Rm被稱為第2操作數(shù)寄存器。<shift>被用來指定移位類型和移位位數(shù),有2種形式:一是5bit二進(jìn)制構(gòu)成的立即數(shù),其值范圍在0~31之間;二是使用寄存器的內(nèi)容,其值的范圍也在0~31之間。應(yīng)用舉例:MOVR0,R2,LSL#3;R2的值左移3位,結(jié)果放入R0,即R0←R2*8ANDSR1,R1,R2,LSLR3;R2左移R3位,然后和R1相與操作,結(jié)果放入R1。18

1.第2操作數(shù)的移位方式第2操作數(shù)的移位方式共有6種:邏輯左移LSL、邏輯右移LSR、算術(shù)左移ASL、算術(shù)右移ASR、循環(huán)右移ROR、帶擴(kuò)展的循環(huán)右移。它們的操作示意圖如下:

邏輯左移LSL:向左移位時(shí)低端空出位補(bǔ)0,在不溢出情況下等價(jià)于乘2。如圖3-3所示。

邏輯右移LSR:向右移位時(shí)高端空出的位補(bǔ)0,等價(jià)于整除2,舍去余數(shù)。如圖3-4所示。應(yīng)用舉例:SUBR3,R2,R1,LSL#3;R3←R2-(R1邏輯左移3位)SUBR3,R2,R1,LSRR0;R3←R2-(R1邏輯右移R0位)移位運(yùn)算示意圖1920

1.第2操作數(shù)的移位方式(續(xù))算術(shù)左移ASL:向左移位時(shí)低端空出的位補(bǔ)0,最高負(fù)號位保持不變。如圖3-5所示。算術(shù)右移ASR:向右移位時(shí)若為正數(shù),最高位為0,此時(shí)移出高端空出位補(bǔ)0;若為負(fù)數(shù),最高位為1,此時(shí)移出高端空出位補(bǔ)1;算術(shù)右移ASR等價(jià)于整除2,舍去余數(shù)。如圖3-6所示。應(yīng)用舉例:ADDR3,R2,R1,ASL#2;R3←R2+(R1算術(shù)左移2位)SUBR3,R2,R1,ASRR0;R3←R2-(R1算術(shù)右移R0位)循環(huán)右移ROR:由字的b0輸出,進(jìn)入字的b32,依次進(jìn)行。如圖3-7所示。帶擴(kuò)展的循環(huán)右移:就是帶進(jìn)位循環(huán)右移操作一位,高端空出位使用進(jìn)位位C填充。如圖3-8所示。應(yīng)用示例:SUBR3,R2,R1,ROR#2;R3←R2-(R1循環(huán)右移2位)SUBR3,R2,R1,RRX#0x04

;R3←R2-(R1帶進(jìn)位循環(huán)右移4位)212.第2操作數(shù)的移位位數(shù)移位位數(shù)可以用立即數(shù)表示或由寄存器方式給出,其值的范圍在0~31之間。上述的許多應(yīng)用舉例使用的是立即數(shù)或由寄存器給出,但是一定要注意,給定的數(shù)值必須在指定的范圍之內(nèi)。223.2.4寄存器間接尋址方式寄存器間接尋址就是將寄存器的內(nèi)容作為操作數(shù)的地址。指令中的地址碼給出的是一個(gè)通用寄存器編號,所需要的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針,操作數(shù)存放在存儲器中。應(yīng)用示例:LDRR0,[R1];R0←[R1],此處的方括號是寄存器間接尋址的意思STRR0,[R1];[R1]←R0,將R0的內(nèi)容送入R1的內(nèi)容作為地址的單元中。233.2.5基址+變址尋址方式基址+變址尋址方式([Rn,偏移量]){!}也叫變址尋址方式,它是將基址寄存器Rn的內(nèi)容與指令中給出的地址偏移量相加,形成操作數(shù)的有效地址。若使用后綴“!”,則有效地址最后寫回Rn中,也叫自動(dòng)修改指針,且Rn不允許使用R15。變址尋址方式用于訪問基址附近的存儲單元,常用于查表,數(shù)組操作,功能部件寄存器訪問等。變址尋址方式分為3種,即前變址模式、自動(dòng)變址模式、后變址模式;偏移量有立即數(shù)偏移量、寄存器偏移量、寄存器移位偏移量3種形式。ARM指令中使用的是它們的組合體,這樣前變址尋址模式[Rn,偏移量]就包括以下幾種形式。自動(dòng)變址模式不再單獨(dú)介紹,同其它2種模式一并介紹。以下通過應(yīng)用示例進(jìn)行介紹。241.立即數(shù)偏移量應(yīng)用示例LDRR2,[R3,#4];R2←[R3+4],R3的內(nèi)容不變LDRR2,[R3,#4]!

;R2←[R3+4],R3←R3+42.寄存器偏移量應(yīng)用示例

STRR1,[R0,R2];[R0+R2]←R1。R0作為基址,內(nèi)容不變

如果在這對雙括號后加上“!”,則完成后R0←R0+R2。253.寄存器移位偏移量應(yīng)用示例LDRR0,[R1,R2,LSL#3];R0←[(R1)+(R2)*8]

該條指令的功能是將基址寄存器R1的內(nèi)容加上R2的內(nèi)容乘8作為有效地址存儲單元的內(nèi)容傳送到R0寄存器中,R1的內(nèi)容保持不變。方括號后若有“!”,則R1地址指針自動(dòng)修改。注意:對于后變址偏移尋址模式([Rn],偏移量)Rn的值用作傳送數(shù)據(jù)的存儲器地址。在操作完數(shù)據(jù)后,Rn+偏移量送到Rn,即修改了Rn中的地址指針。同樣,后變址模式也有立即數(shù)尋址方式、寄存器尋址方式和寄存器移位尋址方式3種情況。注意:后變址模式不需要加“!”就可修改地址指針。以下列舉幾個(gè)應(yīng)用示例:LDRR0,[R1],#4;R0←[R1];R1←R1+4STRR0,[R3],-R8;[R3]←R0;R3←R3-R8263.2.6多寄存器尋址方式多寄存器尋址是ARM微處理器獨(dú)有的尋址方式。多寄存器尋址方式就是一條指令可以完成多個(gè)寄存器值的傳送,這種尋址方式用一條指令最多可以完成16個(gè)寄存器值的傳送。應(yīng)用示例:LDMIAR0,{R1,R2,R3,R5}

;R1←[R0];R2←[R0+4];R3←[R0+8];R5←[R0+12]若要隨時(shí)改變R0的內(nèi)容,則執(zhí)行的指令是:LDMIAR0!,{R1,R2,R3,R5},這條指令的執(zhí)行,R1、R2、R3、R5的內(nèi)容同前,但最后R0的內(nèi)容等于R0+12。注意:花括號中是16個(gè)寄存器R0~R15的子集,寄存器的編號從小到大排列,使用逗號“,”隔開,編號連續(xù)時(shí)可以使用“-”連接,例如:LDMIAR1!,{R2-R9,R12}STMIAR0!,{R3-R8,R10}273.2.6多寄存器尋址方式(續(xù))還要注意:指令中的后綴IA(IncrementAfter)為操作模式,意思是傳送數(shù)據(jù)之后,再增加地址指針,即傳送完成后地址加4。另外還有后綴:IB(IncrementBefore):指傳送前地址先加4。DA(DecrementAfter):指傳送后地址減4。DB(DecrementBefore):指傳送前地址先減4。283.2.7堆棧尋址方式

堆棧是一種數(shù)據(jù)結(jié)構(gòu),堆棧是按特定順序進(jìn)行存取的存儲區(qū),操作順序分為“后進(jìn)先出”和“先進(jìn)后出”,堆棧尋址是隱含的,它使用一個(gè)專門的寄存器(堆棧指針寄存器R13)指向一塊存儲區(qū)域(堆棧),指針?biāo)赶虻拇鎯卧褪嵌褩5臈m敗?91.存儲器堆棧的相關(guān)概念遞增堆棧:堆棧區(qū)由低地址向高地址方向生長,稱為遞增堆棧(AscendingStack)。遞減堆棧:堆棧區(qū)由高地址向低地址方向生長,稱為遞減堆棧(DescendingStack)。滿堆棧:堆棧指針指向最后壓入堆棧的有效數(shù)據(jù)項(xiàng),稱為滿堆棧(FullStack)。對于滿堆棧的操作,在進(jìn)行壓棧時(shí)要先修改堆棧指針,再壓入數(shù)據(jù);在彈棧時(shí)要先彈出數(shù)據(jù),再修改指針。否則,就會發(fā)生錯(cuò)誤??斩褩#憾褩V羔樦赶蛳乱粋€(gè)要放入的空位置,稱為空堆棧(EmptyStack)。對于空堆棧的操作,在進(jìn)行壓棧時(shí)要先壓入數(shù)據(jù),再修改堆棧指針;在彈棧時(shí)要先修改指針,再彈出數(shù)據(jù)。否則,就會發(fā)生錯(cuò)誤。

30滿遞增堆棧FA(Full&Ascendingstack):堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。如指令LDMFA,STMFA等。滿遞減堆棧FD(Full&Descendingstack):堆棧指針指向最后壓入的數(shù)據(jù),且棧區(qū)由高地址向低地址生成。如指令LDMFD,STMFD等??者f增堆棧EA(Empty&Ascendingstack):堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且棧區(qū)由低地址向高地址生成。如指令LDMEA,STMEA等??者f減堆棧ED(Empty&Descendingstack):堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且棧區(qū)由高地址向低地址生成。如指令LDMED,STMED等。

2.堆棧的四種工作方式313.使用堆棧時(shí)注意事項(xiàng)上述每種堆棧工作方式的壓棧指令和彈棧指令要成對使用,千萬不能錯(cuò)配;壓棧和彈棧的多寄存器列表必須一一對應(yīng),而且排列次序也是由寄存器下標(biāo)小的到大的。需要說明的是,按照堆棧操作的原則正確的方法是“先進(jìn)后出,后進(jìn)先出”,那么彈棧的寄存器列表順序應(yīng)該從大到小,實(shí)際書寫編輯時(shí)仍然是從小到大的順序,程序員不必?fù)?dān)心,指令在操作時(shí)會自動(dòng)的按照對堆棧區(qū)的操作原則進(jìn)行。應(yīng)用舉例:STMFDSP!,{R4-R7,RL}

;將R4~R7、鏈接寄存器RL內(nèi)容壓棧(內(nèi)存),屬于滿棧遞減LDMFDSP!,{R4-R7,PC}

;從棧區(qū)彈棧內(nèi)容送R4~R7、程序計(jì)數(shù)器PC,屬于滿棧遞減323.2.8塊復(fù)制尋址方式塊復(fù)制尋址方式就是把一塊從存儲器的某一位置開始的數(shù)據(jù)復(fù)制到多個(gè)寄存器中,或者把多個(gè)寄存器的內(nèi)容復(fù)制到存儲器的某一塊中。它是多地址多寄存器尋址方式的一種應(yīng)用,實(shí)際上要完成的是從存儲器的某一塊開始的數(shù)據(jù)復(fù)制到存儲器的另外一塊中去,這里中間的過渡緩沖區(qū)就是這多個(gè)寄存器列表。它與堆棧的操作基本相同,也有4組配對的操作模式指令:LDMIA/STMIA:在傳送數(shù)據(jù)之后增加地址指針,塊中的首地址值最小

LDMIB/STMIB:在傳送數(shù)據(jù)之前增加地址指針,塊中的首地址值最小

LDMDA/STMDA:在傳送數(shù)據(jù)之后減小地址指針,塊中的首地址值最大

LDMDB/STMDB:在傳送數(shù)據(jù)之前減小地址指針,塊中的首地址值最大33應(yīng)用示例:

LDMIAR0!,{R2-R12}

STMIAR1!,{R2-R12}這2條指令結(jié)合在一起實(shí)現(xiàn)的功能就是將以R0為首地址的字單元存儲器內(nèi)容拷貝到以R1為首地址的字存儲單元塊中,共11×4=44字節(jié)數(shù)據(jù)。塊復(fù)制尋址方式與堆棧尋址方式基本相同,差異就在將指令格式中的SP!修改為Rn!,n=1,2,….11,12。注意:如果基址寄存器使用的那個(gè)寄存器,該寄存器就不要出現(xiàn)在指令的花括號{}中了。34相對尋址是變址尋址的一種變通,由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。應(yīng)用示例:BLROUTINE1;調(diào)用子程序ROUTINE1BEQLOOP;條件跳轉(zhuǎn)到LOOP標(biāo)號處執(zhí)行,不返回…LOOPMOVR2,#2…ROUTINE1…;語句BLROUTINE1,是調(diào)用ROUTINE1子程序,ROUTINE1實(shí)際上是子程序標(biāo)號,是一個(gè)相對于PC指針的值。執(zhí)行完子程序后返回。3.2.9相對尋址方式35ARM指令集可以分為:ARM數(shù)據(jù)處理指令;

寄存器裝載及存儲指令;ARM跳轉(zhuǎn)指令;ARM雜項(xiàng)指令;ARM協(xié)處理器指令和ARM偽指令。

3.3ARM9指令系統(tǒng)363.3.1ARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令大致可分為3類。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以影響狀態(tài)標(biāo)志。數(shù)據(jù)傳送指令:只用于在寄存器與寄存器之間進(jìn)行數(shù)據(jù)的雙向傳輸。比較指令和測試指令:不需要后綴S,它們會直接影響CPSR的條件標(biāo)志位,并且比較指令不保存運(yùn)算結(jié)果,只起到更新CPSR中相應(yīng)條件標(biāo)志位的作用。算術(shù)邏輯運(yùn)算指令:完成常用的算術(shù)與邏輯的運(yùn)算,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時(shí)也可更新CPSR中的相應(yīng)條件標(biāo)志位。乘法指令:其操作數(shù)全部是寄存器。凡是具有第2操作數(shù)operand2的指令(乘法指令除外),切記有3種使用形式:立即數(shù)形式、寄存器形式和寄存器移位形式。37操作碼[24:21]助記符功

能完成的操作0000AND邏輯位“與”Rd←RnANDOp20001EOR邏輯位“異或”Rd←RnEOROp20010SUB算術(shù)減法Rd←Rn-Op20011RSB算術(shù)反向減法Rd←Op2-Rn0100ADD算術(shù)加法Rd←Rn+Op20101ADC帶進(jìn)位算術(shù)加法Rd←Rn+Op2+C0110SBC帶進(jìn)位算術(shù)減法Rd←Rn-Op2-(not)C0111RSC帶進(jìn)位反向算術(shù)減法Rd←Op2-Rn-(not)C1000TST按位測試根據(jù)RnANDOp2設(shè)置條件標(biāo)志位1001TEQ按位相等測試根據(jù)RnEOROp2設(shè)置條件標(biāo)志位1010CMP比較根據(jù)Rn-Op2設(shè)置條件標(biāo)志位1011CMN負(fù)數(shù)比較根據(jù)Rn+Op2設(shè)置條件標(biāo)志位1100ORR邏輯位“或”Rd←RnOROp21101MOV傳送Rd←Op21110BIC按位清0Rd←RnAND(not)Op21111MVN按位求反Rd←(not)Op2表3-2ARM微處理器的主要數(shù)據(jù)處理指令38⑴ADD加法運(yùn)算指令

加法運(yùn)算指令A(yù)DD。將Rn的數(shù)值與operand2的數(shù)值相加,結(jié)果保存到Rd寄存器中。指令格式如下:ADD{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:

ADDSR1,R1,#0x03;R1←R1+0x03,影響條件標(biāo)志位ADDR0,R2,R4;R0←R2+R4,不影響條件標(biāo)志位ADDSR1,R2,R3,LSL#3;R1←R2+R3×8,影響條件標(biāo)志位1.算術(shù)運(yùn)算指令⑵ADC帶進(jìn)位加法運(yùn)算指令A(yù)DC指令是將Rn的數(shù)值與operand2的數(shù)值相加,再加上CPSR中的進(jìn)位標(biāo)志C,結(jié)果保存到Rd寄存器中。指令格式如下:ADC{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:使用ADC實(shí)現(xiàn)64bit的2個(gè)二進(jìn)制數(shù)相加,即(R1,R0)=(R5,R4)+(R3,R2)。ADDSR0,R2,R4;R0←R2+R4,低32位相加,影響條件標(biāo)志位ADCR1,R3,R5;R1←R3+R5,高32位數(shù)相加,不需影響條件標(biāo)志位39⑶SUB減法指令減法運(yùn)算指令SUB,是用Rn的數(shù)值減去operand2的數(shù)值,結(jié)果保存到Rd寄存器中。指令格式如下:SUB{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:SUBSR10,R10,#2;R10←R10-2,影響條件標(biāo)志位SUBSR0,R2,R0;R0←R2-R0,影響條件標(biāo)志位SUBR1,R2,R3,LSL#0x04

;R1←R2-R3×16,不影響條件標(biāo)志位40⑷帶借位減法運(yùn)算SBC指令

SBC指令是用Rn的數(shù)值減去operand2的數(shù)值,再減去CPSR中的進(jìn)位標(biāo)志C,結(jié)果保存到Rd寄存器中。注意:雖然在ARM中有借位時(shí)C=0,無借位時(shí)C=1。但是使用該條指令時(shí),程序員不必考慮這些,由ARM系統(tǒng)自動(dòng)完成。指令格式如下:

SBC{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:使用SBC實(shí)現(xiàn)64bit的2個(gè)二進(jìn)制數(shù)相減,即(R7,R6)=(R5,R4)-(R3,R2)。SUBSR6,R4,R2;R6←R4-R2,低32bit相減,影響條件標(biāo)志位SBCR7,R5,R3;R7←R5-R3,高32bit數(shù)相減,不影響條件標(biāo)志位41⑸RSB反向減法運(yùn)算指令

反向減法運(yùn)算指令RSB,是用operand2的數(shù)值減去Rn的數(shù)值,結(jié)果保存到Rd寄存器中。指令格式如下:RSB{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:RSBR3,R1,#0xFF00;R3←0xFF00-R1,不影響條件標(biāo)志位RSBSR3,R2,R1;R3←R1-R2,影響條件標(biāo)志位RSBSR1,R2,R3,LSL#0x02;R1←R3×4-R2,影響條件標(biāo)志位42⑹RSC反向帶進(jìn)位減法運(yùn)算指令

RSC指令是用operand2的數(shù)值減去Rn的數(shù)值,再減去CPSR中的進(jìn)位標(biāo)志C,結(jié)果保存到Rd寄存器中。指令格式如下:

RSC{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:使用RSC實(shí)現(xiàn)64bit的2個(gè)二進(jìn)制數(shù)的負(fù)數(shù),源數(shù)(R5,R4),結(jié)果存(R3,R2)。RSCSR2,R4,#0;R2←0-R4,低32bit相減,影響條件標(biāo)志位RSCR3,R5,#0;R3←0-R5,高32bit數(shù)相減,不需影響條件標(biāo)志位43⑺32位乘法指令MUL

32位乘法指令MUL指令是將Rm的值與Rs中的值相乘,結(jié)果的低32位保存在Rd中。指令的格式如下:

MUL{cond}{S}<Rd>,<Rm>,<Rs>應(yīng)用示例:

MULR1,R2,R3;R1←R2×R3MULSR1,R3,R5;R1←R3×R5,影響條件標(biāo)志位44⑻32位乘加指令MLA

32位乘加指令MLA指令是將Rm的值與Rs中的值相乘,再加上Rn的值,結(jié)果的低32位保存在Rd中。指令的格式如下:

MLA{cond}{S}<Rd>,<Rm>,<Rs>,<Rn>應(yīng)用示例:MLAR1,R2,R3,R4;R1←R2×R3+R4MLASR1,R3,R5,R7

;R1←R3×R5+R7,影響條件標(biāo)志位45⑼64位有符號乘法指令SMULL

64位有符號乘法指令SMULL,是將Rm的值與Rs中的值相乘,結(jié)果的低32位保存在RdLo寄存器中,高32位保存在RdHi寄存器中。指令的格式如下:

SMULL{cond}{S}<RdLo>,<RdHi>,<Rm>,<Rs>應(yīng)用示例:

SMULLR1,R2,R3,R4;R1←(R3×R4)低32位;R2←(R3×R4)高32位46⑽64位有符號數(shù)乘加指令SMLAL

SMLAL指令是將Rm的值與Rs的值相乘,其乘積低32位與寄存器RdLo的值相加同時(shí)影響進(jìn)位標(biāo)志,再回送給寄存器RdLo;而高32位與寄存器RdHi的值相加,并加上低32位的進(jìn)位C,再回送給寄存器RdHi中。指令的格式如下:

SMLAL{cond}{S}<RdLo>,<RdHi>,<Rm>,<Rs>

應(yīng)用示例:SMLALR2,R3,R7,R6

;R2←(R7×R6)低32位+R2;R3←(R7×R6)高32位+R347482.邏輯運(yùn)算指令

⑴AND指令A(yù)ND邏輯“位與”操作指令,將Rn的值與operand2的值按位進(jìn)行邏輯“與”操作,并將結(jié)果保存到Rd中。指令的格式如下:AND{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:ANDR0,R0,0x01

;R0←R0&0x01?!?”是C語言中的“位與”操作符ANDSR0,R1,R2

;R0←R1&R2,影響條件標(biāo)志位。如果邏輯運(yùn)算的結(jié)果為0,則Z=149⑵ORR指令ORR邏輯“位或”操作指令,將Rn的值與operand2的值按位進(jìn)行邏輯“或”操作,并將結(jié)果保存到Rd中。指令的格式如下:ORR{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:ORRR0,R0,0x0F

;R0←R0|0x0F,將R0的低4位置“1”O(jiān)RRR0,R1,R2

;R0←R1|R2,“|”是C語言中的“位或”操作符50⑶EOR指令

EOR邏輯“位異或”操作指令,將Rn的值與operand2的值按位進(jìn)行邏輯“異或”操作,并將結(jié)果保存到Rd中。指令的格式如下:

EOR{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:EORR0,R0,0xF0;將R0的b7~b4位取反EORSR0,R1,R2;R0←R1

R2,影響條件標(biāo)志位。如果R1=R2,則Z=151⑷BIC指令位清除指令BIC,是將Rn的值與operand2的值按位取反后,進(jìn)行“與”操作,將結(jié)果保存到Rd中。指令的格式如下:BIC{cond}{S}<Rd>,<Rn>,<operand2>應(yīng)用示例:BICR0,R0,0x0F

;R0←R0AND(~0x0F),將R0的低4位清“1”BICSR2,R5,0xFFFF

;R0←R5AND(~(0xFFFF)),最后R2的結(jié)果是低16比特均為0523.數(shù)據(jù)傳送指令

⑴MOV指令數(shù)據(jù)傳送指令MOV,是將operand2操作數(shù)傳送到目的寄存器Rd中。operand2操作數(shù)可以是立即數(shù)、寄存器、寄存器移位。MOV{cond}{S}<Rd>,<operand2>應(yīng)用示例:MOVR1,#0x100;R1←0x100,完成立即數(shù)送R1MOVSR2,R1;R2←R1,完成寄存器之間傳送。影響條件標(biāo)志,R1=0x0時(shí),Z=1MOVR3,R4,LSR#0x2;R3←R4÷4,完成寄存器移位傳送MOVPC,LR;PC←RL實(shí)現(xiàn)子程序返回注意:在ARM中沒有設(shè)計(jì)專門的子程序返回指令和異常(特別是IRQ和FIQ中斷服務(wù)程序)的返回指令,而是使用MOV指令或其他方式完成從子程序返回和中斷服務(wù)程序返回的。只要向程序計(jì)數(shù)器PC賦值后,就會跳轉(zhuǎn)到相應(yīng)的地址處執(zhí)行程序53⑵MVN指令

數(shù)據(jù)取反傳送指令MVN,是將operand2操作數(shù)按位取反后,傳送到目的寄存器Rd中。指令格式如下:MVN{cond}{S}<Rd>,<operand2>應(yīng)用示例:MVNR1,#0xFF;R1=0xFFFFFF00MVNR2,R3

;R3按位取反送R24.比較指令

⑴CMP指令比較指令CMP,是用Rn的值減去operand2操作數(shù)的值,根據(jù)操作的結(jié)果影響CPSR中的相應(yīng)條件標(biāo)志位,以便其后的指令根據(jù)其條件判斷是否執(zhí)行。這里要說明的是,該指令并不改變其兩個(gè)操作數(shù)的內(nèi)容。

CMP{cond}<Rn>,<operand2>

;注意這里沒有{S}選項(xiàng),但是也影響條件標(biāo)志位應(yīng)用示例:CMPR0,#20;R0-20,對條件標(biāo)志位進(jìn)行影響ADDEQR3,R2,R1;如果R0=20,則Z=1,EQ為真,執(zhí)行該指令,R3←R2+R154⑵CMN指令負(fù)數(shù)比較指令CMN,是將Rn的值加上operand2操作數(shù)的值,根據(jù)操作的結(jié)果影響CPSR中的相應(yīng)條件標(biāo)志位,以便其后的指令根據(jù)其條件判斷是否執(zhí)行。該指令并不改變其兩個(gè)操作數(shù)的內(nèi)容。

CMN{cond}<Rn>,<operand2>;注意這里沒有{S}選項(xiàng),但是也影響條件標(biāo)志位使用方法:Rn中存放的是欲比較的負(fù)數(shù),并且以補(bǔ)碼的形式表示,operand2是另一個(gè)要比較的數(shù)應(yīng)用示例:CMNR0,#1;對條件標(biāo)志位進(jìn)行影響MOVEQR3,R2

;如果R0是-1的補(bǔ)碼,則Z=1,EQ為真,執(zhí)行該指令,R3←R2注意:-1的補(bǔ)碼就是0xFFFFFFFF,與1相加自然就等于0,所以Z=1,滿足MOV指令的執(zhí)行條件。推論:假如立即數(shù)1的位置用正數(shù)N替換,那么,如果R0是-N的補(bǔ)碼,則標(biāo)志位Z=1。555.測試指令

⑴TST指令TST是位測試指令,是將Rn的值與operand2操作數(shù)的值按位做邏輯“與”操作,根據(jù)操作的結(jié)果影響CPSR中的相應(yīng)條件標(biāo)志位,以便其后的指令根據(jù)其條件判斷是否執(zhí)行。TST{cond}<Rn>,<operand2>使用方法:該指令主要用于判斷Rn中的某一比特位或多個(gè)比特位的位值是否為0,只要將操作數(shù)operand2的值對應(yīng)的位取“1”,然后組成一個(gè)32bit立即數(shù)。如果指令作用的結(jié)果使得條件標(biāo)志位Z=1,說明對應(yīng)取值為“1”的比特位全為“0”,達(dá)到了檢測的目的。應(yīng)用示例:TSTR0,#0x01

;對條件標(biāo)志位進(jìn)行影響。如果R0[0]=0,則結(jié)果標(biāo)志位Z=1SUBEQR3,R2,R1

;Z=1,說明EQ為真,執(zhí)行該指令,R3←R2-R156⑵TEQ指令TEQ是測試相等指令,是將Rn的值與operand2操作數(shù)的值按位進(jìn)行邏輯“異或”操作,根據(jù)操作的結(jié)果影響CPSR中的相應(yīng)條件標(biāo)志位,以便其后的指令根據(jù)其條件判斷是否執(zhí)行。

TEQ{cond}<Rn>,<operand2>使用方法:該指令主要用于測試Rn中的值是否與operand2操作數(shù)的值相等,通過按位進(jìn)行邏輯“異或”運(yùn)算,如果兩者的所有對應(yīng)比特位都相同,“異或”結(jié)果為全“0”,則條件標(biāo)志位Z=1,說明兩者相等;否則,說明兩者則不相等。應(yīng)用示例:TEQR0,R1;對條件標(biāo)志位進(jìn)行影響。測試R0是否等于R1。如果相等,則結(jié)果標(biāo)志位Z=1573.3.2寄存器裝載及存儲指令A(yù)RM微處理器系統(tǒng)對于存儲器的操作只能使用寄存器裝載和存儲指令。基本的裝載/存儲指令僅有5條,其它的指令都是由它們派生出來的。將其分為3種:

LDR和STR指令,稱為單寄存器裝載/存儲指令;LDM和STM指令,稱為批量裝載/存儲指令;SWP指令,稱為寄存器與寄存器數(shù)據(jù)交換指令。583.3.2寄存器裝載及存儲指令(續(xù))LDR和STR指令,派生的指令最多,可以進(jìn)行字節(jié)操作、半字操作和字操作。LDR指令的功能是將存儲器中的內(nèi)容裝載到單個(gè)寄存器中去;STR指令的功能是從單個(gè)寄存器向內(nèi)存寫數(shù)據(jù)。LDM和STM指令只能進(jìn)行字的操作,它派生了一是對存儲器塊的操作,二是對堆棧區(qū)數(shù)據(jù)塊的操作。LDM指令的功能是將存儲器或堆棧區(qū)中的塊數(shù)據(jù)裝載到N個(gè)寄存器中;STM的作用是將N個(gè)寄存器的內(nèi)容寫入到塊存儲器或塊堆棧區(qū)中。SWP指令有2種形式:SWP和SWPB。5960指令助記符功

能完成的操作條件碼位置LDRRd,<addr>裝載字?jǐn)?shù)據(jù)Rd←[addr]LDR{cond}LDRBRd,<addr>裝載字節(jié)數(shù)據(jù)Rd←[addr]LDR{cond}BLDRTRd,<addr>以用戶模式裝載字?jǐn)?shù)據(jù)Rd←[addr]LDR{cond}TLDRBTRd,<addr>以用戶模式裝載字節(jié)數(shù)據(jù)Rd←[addr]LDR{cond}BTLDRHRd,<addr>裝載半字?jǐn)?shù)據(jù)Rd←[addr]LDR{cond}HLDRSBRd,<addr>裝載有符號字節(jié)數(shù)據(jù)Rd←[addr]LDR{cond}SBLDRSHRd,<addr>裝載有符號半字?jǐn)?shù)據(jù)Rd←[addr]LDR{cond}SHSTRRd,<addr>存儲字?jǐn)?shù)據(jù)[addr]←RdSTR{cond}STRBRd,<addr>存儲字節(jié)數(shù)據(jù)[addr]←RdSTR{cond}BSTRTRd,<addr>以用戶模式存儲字?jǐn)?shù)據(jù)[addr]←RdSTR{cond}TSTRBTRd,<addr>以用戶模式存儲字節(jié)數(shù)據(jù)[addr]←RdSTR{cond}BTSTRHRd,<addr>存儲半字?jǐn)?shù)據(jù)[addr]←RdSTR{cond}HLDM{mode}Rn{!},reglist塊數(shù)據(jù)裝載到列表寄存器中reglistreglist←[Rn…]LDM{cond}{mode}STM{mode}Rn{!},reglist存儲列表數(shù)據(jù)到存儲器塊[Rn…]←reglistSTM{cond}{mode}SWPRd,Rm,[Rn]寄存器與存儲器字交換Rd←[Rn],[Rn]←RmSWP{cond}SWPBRd,Rm,[Rn]寄存器與存儲器字節(jié)交換Rd←[Rn],[Rn]←RmSWP{cond}B表3-3寄存器裝載和存儲指令表表格中的部分內(nèi)容說明:

<addr>:代表的是存儲器中的地址單元,它可以由寄存器、或寄存器+偏移量、或寄存器+寄存器移位偏移量組成,這在3.2節(jié)ARM尋址方式中已經(jīng)介紹。{mode}:如果對存儲器進(jìn)行塊操作,則模式mode應(yīng)是IA、IB、DA、DB其中之一;如果對堆棧區(qū)進(jìn)行塊操作,則模式mode應(yīng)是FA、FD、EA、ED其中之一。“以用戶模式”:是指在特權(quán)模式下可以以用戶的身份操作用戶寄存器組中的寄存器。在用戶模式下,后綴帶T的指令無效。611.LDR和STR指令寄存器裝載和存儲指令LDR/STR可分為按字操作指令、按半字操作指令、按字節(jié)操作指令,以下進(jìn)行簡要介紹它們的格式與功能、以及尋址方式等。⑴LDR/STR的指令格式與功能※以字方式操作的指令格式與功能如下:LDR{cond}{T}Rd,<addr>;將存儲器地址為addr的內(nèi)容裝載到寄存器Rd中STR{cond}{T}Rd,<addr>;將寄存器Rd的內(nèi)容寫入到存儲器地址addr單元中

以半字方式操作的指令格式與功能如下:LDR{cond}HRd,<addr>;將存儲器地址addr的無符號數(shù)半字裝載到Rd中,高16位補(bǔ)0。LDR{cond}SHRd,<addr>;將存儲器地址addr的有符號數(shù)半字裝載到Rd中,高16位用其符號位填充。STR{cond}HRd,<addr>;將寄存器Rd的半字?jǐn)?shù)據(jù)寫入到存儲器地址addr半字單元中。注意:半字操作時(shí),地址值必須為偶數(shù),即按半字對齊。非半字對齊的操作地址不可靠?!宰止?jié)操作的指令格式與功能LDR{cond}B{T}Rd,<addr>;將存儲器地址addr中的無符號字節(jié)數(shù)據(jù)裝載到Rd中,高24位用0補(bǔ)充。LDR{cond}SBRd,<addr>;將存儲器地址addr中的有符號字節(jié)數(shù)據(jù)裝載到Rd中,高24位用其符號位填充。STR{cond}B{T}Rd,<addr>;將寄存器Rd內(nèi)容低8位字節(jié)數(shù)據(jù)寫入到存儲器地址addr的字節(jié)單元中。62⑵LDR/STR的指令尋址LDR/STR的指令尋址方式非常靈活,由2部分組成,一是基址寄存器,可以使用任意一個(gè)通用寄存器;另一部分是基址偏移量。它有3種形式,以下進(jìn)行簡要介紹?!⒓磾?shù)形式。立即數(shù)用一個(gè)無符號數(shù)表示,它既可以與基址寄存器Rn相加,也可以與基址寄存器相減,從而形成一個(gè)有效的地址存儲器操作地址。例如:LDRRd,[Rn,#0x08];將Rn+0x08地址單元中的內(nèi)容裝載到Rd寄存器,Rn內(nèi)容不變LDRRd,[Rn,#-0x08];將Rn-0x08地址單元中的內(nèi)容裝載到Rd寄存器,Rn內(nèi)容不變LDRRd,[Rn];將Rn地址單元中的內(nèi)容裝載到Rd寄存器,0偏移?!拇嫫餍问?。就是用寄存器的內(nèi)容作為偏移量,與基址寄存器Rn內(nèi)容相加或相。例如:LDRRd,[Rn,Rm];將Rn+Rm地址單元中的內(nèi)容裝載到Rd寄存器,Rn的內(nèi)容不變LDRRd,[Rn,-Rm];將Rn-Rm地址單元中的內(nèi)容裝載到Rd寄存器,Rn的內(nèi)容不變※寄存器移位偏移量形式。就是將寄存器Rm的內(nèi)容經(jīng)過移位操作后,與Rn的內(nèi)容相加,從而形成一個(gè)有效地址作為存儲器操作地址。移位的方法在3.1.1節(jié)已將介紹,主要有邏輯左移LSL、邏輯右移LSR、算術(shù)右移ASR、循環(huán)右位ROR和帶擴(kuò)展的循環(huán)右移RRX。例如:LDRRd,[Rn,Rm,LSL#3];將Rn+Rm*8的內(nèi)容作為存儲器地址,取其內(nèi)容裝載到Rd。632.LDM和STM批量寄存器裝載指令LDM,它完成的操作是將存儲器塊中的n個(gè)字?jǐn)?shù)據(jù)裝載到n個(gè)寄存器中。批量數(shù)據(jù)存儲指令STM,就是將n個(gè)寄存器中的值寫入到地址連續(xù)的存儲器塊中。LDM和STM相配合主要完成2項(xiàng)工作:一是可以完成將存儲器中某一個(gè)首地址連續(xù)的數(shù)據(jù)塊傳送到存儲器中的另一個(gè)數(shù)據(jù)區(qū)域中,實(shí)現(xiàn)數(shù)據(jù)的復(fù)制。二是用于堆棧區(qū)數(shù)據(jù)的壓棧與彈棧。指令的格式如下:LDM{cond}<mode>Rn{!},reglist{^}STM{cond}<mode>Rn{!},reglist{^}

其中:<mode>:根據(jù)完成的工作,可分為2個(gè)類型?!愋?是在進(jìn)行存儲器塊的復(fù)制工作時(shí),使用以下4種模式之一。IA:先傳送數(shù)據(jù)后修改地址指針+4;IB:先修改地址指針+4后傳送數(shù)據(jù)DA:先傳送數(shù)據(jù)后修改地址指針-4;DB:先修改地址指針-4后傳送數(shù)據(jù)?!愋?是當(dāng)進(jìn)行堆棧操作時(shí),使用以下4種模式之一。FA:滿棧增堆棧;FD:滿棧減堆棧;

EA:空棧增堆棧;ED:空棧減堆棧。它們代表的物理操作前已講述。注意:壓棧與彈棧指令選取的mode必須相同。64注意:LDM和STM指令操作時(shí),要求字對齊,否則會出現(xiàn)意想不到的問題;使用這兩條指令時(shí),使用的指令應(yīng)該配對,即選取的mode相同堆棧操作時(shí)有4對指令:LDMFA/STMFA、LDMFD/STMFD、LDMEA/STMEA、LDMED/STMED,它們必須配對使用。存儲器操作時(shí)也有4對指令:LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB,它們最好配對使用。應(yīng)用示例:

LDMIAR0!,{R2-R9};將以R0為首地址的8個(gè)字單元內(nèi)容裝載到R2~R9中,R0內(nèi)容更新

STMIAR1!,{R2-R9};將R2~R9中的內(nèi)容存到以R1為首地址的連續(xù)8個(gè)字單元中,R1內(nèi)容更新

STMFASP!,{R0-R9,LR};保護(hù)現(xiàn)場。壓棧時(shí)SP先修改地址(+4)后壓棧數(shù)據(jù)

LDMFASP!,{R0-R9,PC};恢復(fù)現(xiàn)場,異常處理返回。彈棧時(shí)SP先彈出數(shù)據(jù),再修改指針65以下再列舉一例,功能是將以R0為首地址的256字節(jié)數(shù)據(jù),復(fù)制到以R1為首地址的存儲器單元中。…MOVR10,#256;計(jì)數(shù)器賦初值LDRR0,=ScrData

;LDR是ARM偽指令,將32bit的源數(shù)據(jù)地址值送R0LDRR1,=DstData

;LDR是ARM偽指令,將32bit的目的數(shù)據(jù)地址值送R1LOOP

LDMIAR0!,{R2-R9};裝載內(nèi)容送R2-R9。自動(dòng)修改R0

STMIAR1!,{R2-R9};存儲R2-R9數(shù)據(jù)到以R1為首地址的單元中。自動(dòng)修改R1

SUBSR10,R10,#32;每次傳送32字節(jié)數(shù)據(jù)。修改計(jì)數(shù)器值,影響標(biāo)志Z

BNELOOP;如果R10≠0,Z=0,條件碼NE為真,返回到LOOP繼續(xù)拷貝。…663.3.3ARM跳轉(zhuǎn)指令在ARM指令中要實(shí)現(xiàn)匯編程序的跳轉(zhuǎn)有兩種方法:其一是直接向PC寄存器賦值,可實(shí)現(xiàn)程序在4G范圍內(nèi)的任意跳轉(zhuǎn),前面已見到許多示例;其二是使用跳轉(zhuǎn)指令,可實(shí)現(xiàn)相對于當(dāng)前程序計(jì)數(shù)器PC指針的跳轉(zhuǎn),這是本節(jié)介紹的主要內(nèi)容。ARM的跳轉(zhuǎn)指令主要有以下4條:

B:跳轉(zhuǎn)分支指令。

BL:帶鏈接的跳轉(zhuǎn)分支指令。

BX:帶狀態(tài)切換的跳轉(zhuǎn)分支指令。

BLX:帶鏈接和狀態(tài)切換的跳轉(zhuǎn)分支指令。在通常狀態(tài)下,處理器都是按順序執(zhí)行指令,當(dāng)它執(zhí)行到跳轉(zhuǎn)分支指令時(shí),將直接跳轉(zhuǎn)到分支程序開始的地方去執(zhí)行,程序也不會回到原來跳出的程序處繼續(xù)執(zhí)行。當(dāng)指令執(zhí)行到帶鏈接的跳轉(zhuǎn)分支指令時(shí),程序?qū)⑻椒种С绦蜷_始的地方去執(zhí)行,在這種情況下該分支程序是一個(gè)子程序,執(zhí)行完后將返回到原來跳出的程序處繼續(xù)執(zhí)行。671.B指令和BL指令B指令是一條最為簡單的指令。指令在執(zhí)行過程中一旦遇到B指令,ARM處理器將立即跳轉(zhuǎn)到指令給定的目標(biāo)地址,從那里開始執(zhí)行指令。該指令也可以選擇根據(jù)其附帶的條件碼來執(zhí)行,為程序的分支執(zhí)行控制提供可能。BL指令是一條帶有鏈接的跳轉(zhuǎn)分支指令,它除具有B指令的分支跳轉(zhuǎn)功能外,還具有異常返回或返回主程序的功能。在執(zhí)行跳轉(zhuǎn)(即執(zhí)行子程序)前,處理器自動(dòng)地將當(dāng)前程序計(jì)數(shù)器PC(R15)的值存儲在鏈接寄存器RL(R14)中,作為將來子程序返回的指針。當(dāng)子程序執(zhí)行完畢后,將RL的內(nèi)容復(fù)制到PC中,就可以實(shí)現(xiàn)子程序的返回。其指令格式如下:B{L}{cond}<Lable>其中<Lable>為程序跳轉(zhuǎn)的相對于當(dāng)前PC值的偏移量,兩者結(jié)合構(gòu)成一個(gè)相對轉(zhuǎn)移地址,而不是絕對地址。它是將一個(gè)24bit有符號數(shù),左移2位形成一個(gè)26bit有符號的地址值,這樣它的偏移量就是±32MB,也就是說前偏移32MB、后偏移32MB范圍內(nèi)的程序轉(zhuǎn)移。由于PC寄存器是32bit,所以對于它的最高6bit使用符號位進(jìn)行填充,其數(shù)值的大小維持不變,使其構(gòu)成一個(gè)32bit的有效地址值。正數(shù)時(shí)填充值為全“0”,負(fù)數(shù)時(shí)為全“1”。它的值是由匯編器計(jì)算出來的,程序員只需要寫上標(biāo)號地址就可,但是它的取值范圍程序員必須心中有數(shù)。68B指令應(yīng)用示例:CMPR0,#5BEQBranch1;如果R0=5,則轉(zhuǎn)移到分支Branch1處BNEBranch2;如果R0≠5,則轉(zhuǎn)移到分支Branch2處BL指令應(yīng)用示例:BLSub_Route1…Sub_Route1

MOVR1,R2…MOVPC,RL注意:當(dāng)在Sub_Route1子程序中有調(diào)用了Sub_Route2,此時(shí)的RL又被調(diào)用Sub_Route2時(shí)的程序PC值所代替,使得子程序Sub_Route1的最后一條指令MOVPC,RL執(zhí)行有誤。BLSub_Route1

…Sub_Route1STMFASP!,{R1-R12,RL};將Sub_Route1壓棧保存,還有R1~R12MOVR1,R2

…BLSub_Route2…;調(diào)用Sub_Route2子程序

;Sub_Route2的返回處LDMFASP!,{R1-R12,PC};Sub_Route1子程序返回Sub_Route2

…MOVPC,RL;Sub_Route2子程序返回

如果在Sub_Route2子程序中還要調(diào)用子程序,處理方法雷同。692.BX和BLX指令仿照上面的指令B和BL,一個(gè)是實(shí)現(xiàn)程序的跳轉(zhuǎn)不返回主程序指令,一個(gè)是實(shí)現(xiàn)子程序調(diào)用而返回主程序指令,這里的X表示在跳轉(zhuǎn)或子程序調(diào)用時(shí)ARM微處理器的工作狀態(tài)也會發(fā)生變化,即由ARM指令工作狀態(tài)轉(zhuǎn)換到Thumb指令工作狀態(tài)。這2條指令在使用的過程中有2種形式:

形式1:B{L}X{cond}<Lable>

形式2:B{L}X{cond}<Rm>它們使用時(shí)的具體格式有BXLable指令、BLXLable指令、BXRm指令、BLXRm指令。BXLable指令是由ARM指令程序跳轉(zhuǎn)到Thumb指令程序的Lable標(biāo)號處執(zhí)行,且不能返回到跳轉(zhuǎn)時(shí)的ARM程序指令處,跳轉(zhuǎn)的范圍是±32MB;BLXLable指令是由ARM指令程序跳轉(zhuǎn)到Thumb指令程序處執(zhí)行,在跳轉(zhuǎn)時(shí)將當(dāng)前程序計(jì)數(shù)器PC的值已經(jīng)存入RL,當(dāng)執(zhí)行完Thumb子程序后,恢復(fù)PC的原值將會返回到跳轉(zhuǎn)時(shí)的ARM程序指令處繼續(xù)執(zhí)行。跳轉(zhuǎn)的范圍是±32MB;70BXRm指令它既可以跳轉(zhuǎn)到ARM指令程序處執(zhí)行,也可以跳轉(zhuǎn)到Thumb指令處執(zhí)行,跳轉(zhuǎn)后不會返回到主程序。當(dāng)寄存器Rm的b0=1時(shí),指令自動(dòng)將CPSR的T位置“1”,程序轉(zhuǎn)到Thumb指令處執(zhí)行;當(dāng)Rm的b0=0時(shí),程序轉(zhuǎn)到ARM指令處執(zhí)行。注意跳轉(zhuǎn)的地址由Rm確定。BLXRm指令它既可以跳轉(zhuǎn)到ARM指令程序處執(zhí)行,也可以跳轉(zhuǎn)到Thumb指令處執(zhí)行,在跳轉(zhuǎn)時(shí)將當(dāng)前程序計(jì)數(shù)器PC的值已經(jīng)存入RL,執(zhí)行完子程序后將鏈接寄存器RL的值拷貝給PC,將返回到主程序。當(dāng)寄存器Rm的b0=1時(shí),指令自動(dòng)將CPSR的T位置“1”,程序轉(zhuǎn)到Thumb指令子程序入口處執(zhí)行;當(dāng)Rm的b0=0時(shí),程序轉(zhuǎn)到ARM指令子程序入口處執(zhí)行。注意跳轉(zhuǎn)的地址由Rm確定。應(yīng)用示例:CODE32;ARM代碼程序

……BLXThumb_Sub1;調(diào)用Thumb子程序

……CODE16;Thumb代碼程序Thumb_Sub1;Thumb子程序入口

……BXR14;返回ARM代碼程序……713.3.4ARM雜項(xiàng)指令A(yù)RM雜項(xiàng)指令主要包括程序狀態(tài)寄存器操作和異常中斷操作2種類型的指令,它有4條指令。程序狀態(tài)寄存器操作指令有2條,分別是:

●程序狀態(tài)寄存器傳送到通用寄存器指令MRS;

●通用寄存器或立即數(shù)傳送到程序狀態(tài)寄存器指令MSR。異常中斷指令有:

●軟件中斷指令SWI;

●斷點(diǎn)中斷指令BKPT。721.程序狀態(tài)寄存器操作指令

在ARM指令系統(tǒng)中,程序狀態(tài)寄存器操作指令主要用于程序狀態(tài)寄存器與通用寄存器間的數(shù)據(jù)傳送,它們之間相互配合,通過MRS讀程序狀態(tài)寄存器→通用寄存器→修改→通過MSR再寫回到程序狀態(tài)寄存器,完成對程序狀態(tài)寄存器的內(nèi)容

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論