[嵌入式]Cortex-A8處理器程式設計(中)

丫就是熊個貓貓發表於2016-12-18

Cortex-A8處理器程式設計

3.5  定址方式

定址方式是根據指令中給出的地址碼欄位來尋找真實運算元地址的方式。ARM處理器支援的基本定址方式有以下幾種:

(1)暫存器定址

    所需要的值在暫存器中,指令中地址碼給出的是寄器編號,即暫存器的內容為運算元。例如指令:

ADD  R0,R1,R2       ;R0=R1+R2

2) 立即定址

   立即定址是一種特殊的定址方式,指令中在操作碼欄位後面的地址碼部分不是運算元地址,而是運算元本身。例如指令:

SUBS  R0,R0,#1       ;R0ßR0 - 1

MOV  R0,#0xff00       ;R0ß0xff00

(3) 暫存器移位定址

   暫存器移位定址方式是ARM指令集中所特有的,第二個暫存器運算元在與第一個運算元結合之前,選擇進行移位操作。可以採取的移位操作如下:

  L S L 。邏輯左移,暫存器中字的低端空出的位補0。

  L S R 。邏輯右移,暫存器中字的高階空出的位補0。

  A S R 。算術右移。 算術移位的物件是帶符號數。

  R O R 。迴圈右移,從低端移出的位填入高階空出的位。

  R R X 。帶擴充套件的迴圈右移,運算元右移一位,空位用原C 標誌值填充。

ADD R3,R2,R1,LSL #3        ;R3=R2+8×R1

(4) 暫存器間接定址

    指令中的地址碼給出某一通用暫存器的編號,在被指定的暫存器中存放運算元的有效地址,而運算元則存放在該地址對應的儲存單元中,即暫存器為地址指標。例如指令:

LDR R0,[R1]             ;R0=[R1]

SWP R1,R1, [R2]        ;R0與[R1]數值進行交換

(5) 變址定址

   變址定址就是將基址暫存器的內容與指令中給出的偏移量相加,形成運算元有效地址。變址定址用於訪問基址附近的單元,包括基址加偏移和基址加索引定址。暫存器間接定址是偏移量為0的基址加偏移定址。

   基址加偏移定址中的基址暫存器包含的不是確切的地址。基址需加(或減)最大4KB的偏移來計算訪問的地址。例如指令:

LDR R0,[R1,#4]        ;R0=[R1+4]

STR R1,[R0,#-2]        ;[R0-2]ßR1

LDR R0,[R3,R2]        ;R0ß[R3, R2]

(6) 多暫存器定址

   一次可以傳送幾個暫存器的值,允許一條指令傳送16個暫存器的任何子集。例如指令:

LDMIA R1,{R0,R2,R5} ;R0=[R1],R2=[R1+4],R5=[R1+8]

;由於傳送的資料項總是32位的字,基址R1應該字對準。

STMIA R0!,{R3-R6,R10}   ;[R0]=R3,[R0+4]=R4,

 ;[R0+8]=R5,[R0+12]=R6,[R0+16]=R10

(7)堆疊定址

   堆疊是一種按特定順序進行存取的儲存區,這種特定順序既是“先進後出”或“後進先出”。堆疊定址是隱含的,它使用一個專門的暫存器(堆疊指標)指向一塊儲存器區域。棧指標所指定的儲存單元就是堆疊的棧頂。堆疊可分為兩種:

向上生長,又稱遞增堆疊,即地址向高地址方向生長。

向下生長,又稱遞減堆疊,即地址向低地址方向生長。

滿堆疊,堆疊指標指向最後壓入堆疊的有效資料項。
空堆疊,堆疊指標指向下一個資料項放入的空位置。

STMFD  SP!,{R1-R7,LR}   ;將R1-R7,LR入棧,滿遞減堆疊

LDMFD SP!,{R1-R7,LR}  ;資料出棧,放入R1-R7,LR暫存器

(8)塊拷貝定址

    塊拷貝定址指令是一種多暫存器傳送指令,多暫存器傳送指令用於把一塊資料從儲存器的某一位置拷貝到另一位置。塊拷貝指令的定址操作取決於資料是儲存在基址暫存器所指的地址之上還是之下、地址是遞增還是遞減,並與資料的存取操作有關。

 

STMIA R0!,{R1-R7} 

STMIB R0!,{R1-R7} 

LDMFB R0!,{R1-R7} 

LDMFA R0!,{R1-R7} 

(9)相對定址

    相對定址是變址定址的一種變通,由程式計數器PC提供基地址,指令中的地址碼欄位作為偏移量,兩者相加後得到運算元的有效地址。偏移量指出的是運算元與當前指令之間的相對位置。子程式呼叫指令即是相對定址指令。

目標地址 = pc 當前值 + 指令給出的標號偏移地址

 BL SUB1

           BEQ LOOP

             。。。

            LOOP   MOV R6,#1

SUB1    。。。

3.6  指令系統

Cortex-A8採用ARMv7架構,包含:

·32位的ARM指令集

·16位和32位混合的Thumb-2指令集

·ThumbEE指令集

主要內容包括:

1.指令格式

2.條件碼

3.儲存器訪問指令

4.資料處理指令

5.乘法指令

6.ARM分支指令

7.協處理器指令

8.雜項指令

9.偽指令

一、ARM指令集——指令格式

·ARM指令的基本格式如下:

<opcode> {<cond>} {S}    <Rd> ,<Rn>{,<operand2>}

其中<>號內的項是必須的,{}號內的項是可選的。各項的說明如下:

opcode:指令助記符;cond:執行條件;

S:是否影響CPSR暫存器的值;

Rd:目標暫存器; Rn:第1個運算元的暫存器;

operand2:第2個運算元;

ARM指令格式——第2個運算元

ARM指令的基本格式如下:

<opcode> {<cond>} {S}    <Rd> ,<Rn>{,<operand2>}

靈活的使用第2個運算元“operand2”能夠提高程式碼效率。它有如下的形式:

#immed_8r——常數表示式;

Rm——暫存器方式;

Rm,shift——暫存器移位方式;

ARM指令集——第2個運算元

#immed_8r——常數表示式

   該常數必須對應8位點陣圖,即一個8位的常數通過迴圈右移偶數位得到。

 

#immed_8r——常數表示式

  該常數必須對應8位點陣圖,即一個8位的常數通過迴圈右移偶數位得到。

例如:

MOVR0,#1

ANDR1,R2,#0x0F

Rm——暫存器方式

        在暫存器方式下,運算元即為暫存器的數值。

例如:

SUBR1, R1, R2

MOVPC, R0

Rm,shift——暫存器移位方式

   將暫存器的移位結果作為運算元,但Rm值保持不變,移位方法如下:

 

 

Rm,shift——暫存器移位方式

例如:

ADDR1,R1,R1,LSL #3  ;R1=R1+R1*8=9R1

SUBR1,R1,R2,LSR R3  ;R1=R1-(R2/2R3)

二、ARM指令集——條件碼

  ARM指令的基本格式如下:

<opcode> {<cond>} {S}    <Rd> ,<Rn>{,<operand2>}

使用條件碼“cond”可以實現高效的邏輯操作,提高程式碼效率。

    所有的ARM指令都可以條件執行,而Thumb指令只有B(跳轉)指令具有條件執行 功能。如果指令不標明條件程式碼,將預設為無條件(AL)執行。

指令條件碼錶

 

示例:

C程式碼:

If(a > b)

a++;

Else

b++;

對應的彙編程式碼:

CMPR0,R1    ;R0與R1比較

ADDHIR0,R0,#1  ;若R0>R1,則R0=R0+1

ADDLSR1,R1,#1  ;若R0≤1,則R1=R1+1

三、ARM指令集——儲存器訪問指令

   ARM處理器是典型的RISC處理器,對儲存器的訪問只能使用載入和儲存指令實現。ARM處理器儲存結構是程式空間、RAM空間及I/O對映空間統一編址,除對RAM操作以外,對外圍IO、程式資料的訪問均要通過載入/儲存指令進行。

  儲存器訪問指令分為單暫存器操作指令和多暫存器操作指令。

ARM儲存器訪問指令——單暫存器載入

 

ARM儲存器訪問指令——單暫存器儲存

 

   LDR/STR指令用於對記憶體變數的訪問、記憶體緩衝區資料的訪問、查表、外圍部件的控制操作等。若使用LDR指令載入資料到PC暫存器,則實現程式跳轉功能,就實現了程式散轉。

   所有單暫存器載入/儲存指令可分為“字和無符號位元組載入儲存指令”和“半字和有符號位元組載入儲存指令。

LDR和STR指令應用示例:

1.載入/儲存字和無符號位元組指令

LDRR2,[R5]    ;將R5指向地址的字資料存入R2

STRR1,[R0,#0x04]   ;將R1的資料儲存到R0+0x04地址

LDRBR3,[R2],#1  ;將R2指向地址的位元組資料存入R3,R2=R2+1

STRBR6,[R7]     ;將R7指向地址的位元組資料存入R6

2.載入/儲存半字和有符號位元組指令

LDRSB R1,[R0,R3];將R0+R3地址上的位元組資料存入R1,

;高24位用符號擴充套件

LDRH R6,[R2],#2  ;將R2指向地址的半字資料存入R6,高16位用0擴充套件

;讀出後,R2=R2+2

STRH  R1,[R0,#2]! ;將R1的半字資料儲存到R0+2地址,

;只修改低2位元組資料,R0=R0+2

ARM儲存器訪問指令——多暫存器存取

 

    多暫存器載入/儲存指令可以實現在一組暫存器和一塊連續的記憶體單元之間傳輸資料。LDM為載入多個暫存器;STM為儲存多個暫存器。允許一條指令傳送16個暫存器的任何子集或所有暫存器。它們主要用於現場保護、資料複製、常數傳遞等。

多暫存器載入/儲存指令格式如下:

LDM{cond}<模式>  Rn{!},reglist{^}

STM{cond}<模式>  Rn{!},reglist{^}

cond:指令執行的條件;

模式:控制地址的增長方式,一共有8種模式;

!:表示在操作結束後,將最後的地址寫回Rn中;

reglist :表示暫存器列表,可以包含多個暫存器,它們使用“,”隔開,如{R1,R2,R6-R9},暫存器由小到大排列;

^:加入該字尾後,進行資料傳送且暫存器列表不包含PC時,載入/儲存的暫存器是使用者模式下的,而不是當前模式的暫存器。若在LDM指令且暫存器列表中包含有PC時使用,那麼除了正常的多暫存器傳送外,還將SPSR也拷貝到CPSR中,這可用於異常處理返回。注意:該字尾不允許在使用者模式或系統模式下使用。

多暫存器載入/儲存指令的8種模式如下表所示,右邊四種為堆疊操作、左邊四種為資料傳送操作。

 

進行資料複製時,先設定好源資料指標和目標指標,然後使用塊拷貝定址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和儲存 。

進行堆疊操作操作時,要先設定堆疊指標(SP),然後使用堆疊定址指令STMFD/LDMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現堆疊操作。

資料塊傳送指令操作過程如右圖所示,其中R1為指令執行前的基址暫存器,R1’則為指令執行後的基址暫存器。

指令手冊原話:

The registers are transferred in the order lowest to highest, so R15 (if in the list) will always be transferred last.

 

堆疊操作(詳見“4.1  定址方式堆疊定址”)和資料塊傳送指令類似,也有4種模式,它們之間的關係如下表所示:

 

兩段程式碼的執行結果是一樣的,但是使用堆疊指令的壓棧和出棧操作程式設計很簡單(只要前後一致即可),而使用資料塊指令進行壓棧和出棧操作則需要考慮空與滿、加與減對應的問題。

 

ARM儲存器訪問指令——暫存器和儲存器交換指令

 

 SWP指令用於將一個記憶體單元(該單元地址放在暫存器Rn中)的內容讀取到一個暫存器Rd中,同時將另一個暫存器Rm的內容寫入到該記憶體單元中。使用SWP可實現訊號量操作。

指令格式如下:

    SWP{cond}{B}    Rd,Rm,[Rn]

其中,B為可選字尾,若有B,則交換位元組,否則交換32位字;Rd用於儲存從儲存器中讀入的資料;Rm的資料用於儲存到儲存器中,若Rm與Rd相同,則為暫存器與儲存器內容進行交換;Rn為要進行資料交換的儲存器地址,Rn不能與Rd和Rm相同。  

 

ARM指令集——ARM資料處理指令

 資料處理指令大致可分為3類:

  ·資料傳送指令;

  ·算術邏輯運算指令;

  ·比較指令。

    資料處理指令只能對暫存器的內容進行操作,而不能對記憶體中的資料進行操作。所有ARM資料處理指令均可選擇使用S字尾,並影響狀態標誌。

ARM資料處理指令——指令編碼

 

ARM資料處理指令——資料傳送

 

 MOV指令將8點陣圖立即數或暫存器傳送到目標暫存器(Rd),可用於移位運算等操作。指令格式如下:

    MOV{cond}{S}    Rd,operand2

MOV指令舉例如下:

 MOVR1,#0x10;R1=0x10

 MOVR0,R1;R0=R1

 MOVSR3,R1,LSL #2;R3=R1<<2,並影響標誌位

 MOVPC,LR;PC=LR,子程式返回

ARM資料處理指令——資料傳送

 

MVN指令將8點陣圖立即數#immed_8r或暫存器(operand2)按位取反後傳送到目標暫存器(Rd),因為其具有取反功能,所以可以裝載範圍更廣的立即數。指令格式如下:

    MVN{cond}{S}    Rd,operand2

 MVN指令舉例如下:

 MVNR1,#0xFF;R1=0xFFFFFF00

 MVNR1,R2;將R2取反,結果存到R1

ARM資料處理指令——算術運算

 

加法運算指令——ADD指令將operand2的值與Rn的值相加,結果儲存到Rd暫存器。指令格式如下:

    ADD{cond}{S}    Rd,Rn,operand2

應用示例:

ADDS    R1,R1,#1;R1=R1+1,並影響標誌位

ADD     R1,R1,R2;R1=R1+R2     

減法運算指令——SUB指令用暫存器Rn減去operand2,結果儲存到Rd中。指令格式如下:

    SUB{cond}{S}    Rd,Rn,operand2

應用示例:

    SUBSR0,R0,#1;R0=R0-1 ,並影響標誌位

    SUBSR2,R1,R2;R2=R1-R2 ,並影響標誌位

逆向減法運算指令——RSB指令將operand2的值減去Rn,結果儲存到Rd中。指令格式如下:

    RSB{cond}{S}    Rd,Rn,operand2

 應用示例:

     RSB    R3,R1,#0xFF00;R3=0xFF00-R1

     RSBS   R1,R2,R2,LSL #2;R1=(R2<<2)-R2=R2×3

帶進位加法指令——ADC將operand2的值與Rn的值相加,再加上CPSR中的C條件標誌位,結果儲存到Rd暫存器。指令格式如下:

   ADC{cond}{S}    Rd,Rn,operand2

應用示例(使用ADC實現64位加法,結果存於R1、R0中):

ADDS    R0,R0,R2 ;R0等於低32位相加,並影響標誌位

ADC     R1,R1,R3;R1等於高32位相加,並加上低位進位

帶進位減法指令——SBC用暫存器Rn減去operand2,再減去CPSR中的C條件標誌位的非(即若C標誌清零,則結果減去1),結果儲存到Rd中。指令格式如下:

   SBC{cond}{S}    Rd,Rn,operand2

應用示例(使用SBC實現64位減法,結果存於R1、R0中):

SUBS    R0,R0,R2 ; 低32位相減,並影響標誌位(有借為0,無借為1)

SBC     R1,R1,R3;高32位相減,並減去低位借位

帶進位逆向減法指令——RSC指令用暫存器operand2減去Rn,再減去CPSR中的C條件標誌位,結果儲存到Rd中。指令格式如下:

    RSC{cond}{S}    Rd,Rn,operand2

應用示例(使用RSC指令實現求64位數值的負數 ):

    RSBS    R2,R0,#0

    RSC     R3,R1,#0

 

ARM資料處理指令——邏輯運算指令

 

邏輯與操作指令——AND指令將operand2的值與暫存器Rn的值按位作邏輯“與”操作,結果儲存到Rd中。指令格式如下:

    AND{cond}{S}    Rd,Rn,operand2

應用示例:

ANDS  R0,R0,#0x01 ;R0=R0&0x01,取出最低位資料

AND   R2,R1,R3  ;R2=R1&R3

邏輯或操作指令——ORR指令將operand2的值與暫存器Rn的值按位作邏輯“或”操作,結果儲存到Rd中。指令格式如下:

   ORR{cond}{S}    Rd,Rn, operand2

應用示例:    

MOVR1,R2,LSR #24 ;使用ORR指令將R2的高8位

ORRR3,R1,R3,LSL #8;資料移入到R3低8位中

ORR     R0,R0,#0x0F;將R0的低4位置1

邏輯異或操作指令——EOR指令將operand2的值與暫存器Rn的值按位作邏輯“異或”操作,結果儲存到Rd中。指令格式如下:

    EOR{cond}{S}    Rd,Rn, operand2

應用示例:

 EORR1,R1,#0x0F;將R1的低4位取反

 EOR     R2,R1,R0;R2=R1^R0

 EORSR0,R5,#0x01; 將R5和0x01進行邏輯異或,

;結果儲存到R0,並影響標誌位

位清除指令——BIC指令將暫存器Rn的值與operand2的值的反碼按位作邏輯“與”操作,結果儲存到Rd中。指令格式如下:

    BIC{cond}{S}    Rd,Rn, operand2

應用示例:

BIC R1,R1,#0x0F  ;將R1的低4位清零,其它位不變

BIC R1,R2,R3  ;將R3的反碼和R2相邏輯“與”,

  ;結果儲存到R1中

ARM資料處理指令——比較指令

 

比較指令——CMP指令將暫存器Rn的值減去operand2的值,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。指令格式如下:

    CMP{cond} Rn, operand2

應用示例:

CMPR1,#10     ; R1與10比較,設定相關標誌位

CMPR1,R2; R1與R2比較,設定相關標誌位  

比較指令——CMP指令將暫存器Rn的值減去operand2的值,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。指令格式如下:

    CMP{cond} Rn, operand2

注意:CMP指令與SUBS指令的區別在於CMP指令不儲存運算結果。在進行兩個資料的大小判斷時,常用CMP指令及相應的條件碼來操作。 

負數比較指令——CMN指令使用暫存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。用來實現與負數的比較。指令格式如下:

    CMN{cond} Rn, operand2

應用示例:

 CMNR0,#1   ; R0+1,判斷R0是否為1的補碼

    ; R0是否-1如果是,則設定Z標誌位

 負數比較指令——CMN指令使用暫存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。指令格式如下:

    CMP{cond} Rn, operand2

注意:CMN指令與ADDS指令的區別在於CMN指令不儲存運算結果。CMN指令可用於負數比較,比如CMN  R0,#1指令則表示R0與-1比較,若R0為-1(即1的補碼),則Z置位;否則Z復位。

位測試指令——TST指令將暫存器Rn的值與operand2的值按位作邏輯“與”操作,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。指令格式如下:

    TST{cond}    Rn, operand2

應用示例:

TSTR0,#0x01; 判斷R0的最低位是否為0

TSTR1,#0x0F; 判斷R1的低4位是否為0

位測試指令——TST指令將暫存器Rn的值與operand2的值按位作邏輯“與”操作,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。指令格式如下:

    TST{cond}    Rn, operand2

注意:TST指令與ANDS指令的區別在於TST指令不儲存運算結果。TST指令通常與EQ、NE條件碼配合使用,當所有測試位均為0時,EQ有效,而只要有一個測試位不為0,則NE有效。

相等測試指令——TEQ指令將暫存器Rn的值與operand2的值按位作邏輯“異或”操作,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。指令格式如下:

    TEQ{cond}    Rn, operand2

應用示例:

TEQ R0,R1; 比較R0與R1是否相等 (不影響V位和C位)

相等測試指令——TEQ指令將暫存器Rn的值與operand2的值按位作邏輯“異或”操作,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。指令格式如下:

   TEQ{cond}    Rn, operand2

注意:TEQ指令與EORS指令的區別在於TEQ指令不儲存運算結果。使用TEQ進行相等測試時,常與EQ、NE條件碼配合使用。當兩個資料相等時,EQ有效;否則NE有效。

ARM資料處理指令——乘法指令

 

 32位乘法指令——MUL指令將Rm和Rs中的值相乘,結果的低32位儲存到Rd中。指令格式如下:

    MUL{cond}{S}    Rd,Rm,Rs

應用示例:

MUL   R1,R2,R3     ;R1=R2×R3

MULS  R0,R3,R7  ;R0=R3×R7,同時影響CPSR中的N位和Z位

32位乘加指令——MLA指令將Rm和Rs中的值相乘,再將乘積加上第3個運算元,結果的低32位儲存到Rd中。指令格式如下:

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

應用示例:

MLA     R1,R2,R3,R0; R1=R2×R3+R0

64位無符號乘法指令——UMULL指令將Rm和Rs中的值作無符號數相乘,結果的低32位儲存到RdLo中,而高32位儲存到RdHi中。指令格式如下:

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

應用示例:

  UMULL    R0,R1,R5,R8; (R1、R0)=R5×R8

64位無符號乘加指令——UMLAL指令將Rm和Rs中的值作無符號數相乘,64位乘積與RdHi、RdLo相加,結果的低32位儲存到RdLo中,而高32位儲存到RdHi中。指令格式如下:

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

應用示例:

UMLAL  R0,R1,R5,R8;(R1、R0)=R5×R8+(R1、R0)

64位有符號乘法指令——SMULL指令將Rm和Rs中的值作有符號數相乘,結果的低32位儲存到RdLo中,而高32位儲存到RdHi中。指令格式如下:

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

應用示例:

SMULLR2,R3,R7,R6; (R3、R2)=R7×R6

 64位有符號乘加指令——SMLAL指令將Rm和Rs中的值作有符號數相乘,64位乘積與RdHi、RdLo相加,結果的低32位儲存到RdLo中,而高32位儲存到RdHi中。指令格式如下:

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

應用示例:

SMLAL R2,R3,R7,R6  ; (R3、R2)=R7×R6+(R3、R2)

ARM指令集——分支指令

 

分支指令——B指令,該指令跳轉範圍限制在當前指令的±32M位元組地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:

B{cond}    Label

應用示例:

B   WAITA; 跳轉到WAITA標號處

B0x1234    ; 跳轉到絕對地址0x1234處

帶連結的分支指令——BL指令適用於子程式呼叫,使用該指令後,下一條指令的地址被拷貝到R14(即LR) 連線暫存器中,然後跳轉到指定地址執行程式。跳轉範圍限制在當前指令的±32M位元組地址內。指令格式如下:

   BL{cond}    Label

 

帶連結的分支指令——BL指令適用於子程式呼叫,使用該指令後,下一條指令的地址被拷貝到R14(即LR) 連線暫存器中,然後跳轉到指定地址執行程式。跳轉範圍限制在當前指令的±32M位元組地址內。指令格式如下:

    BL{cond}    Label

應用示例:

    BL   DELAY; 呼叫子程式DELAY

帶狀態切換的分支指令——BX指令,該指令可以根據跳轉地址(Rm)的最低位來切換處理器狀態。其跳轉範圍限制在當前指令的±32M位元組地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:

     BX{cond}    Rm

 

帶狀態切換的分支指令——BX指令,該指令可以根據跳轉地址(Rm)的最低位來切換處理器狀態。其跳轉範圍限制在當前指令的±32M位元組地址內(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:

    BX{cond}    Rm

 

 應用示例:

    ADRL  R0,ThumbFun+1  ;將Thumb程式入口地址加1

                                                             ;存入R0

    BX    R0     ; 跳轉到R0指定的地址,

     ;並根據R0的最低位來切換處理器狀態

ARM指令集——軟中斷指令

根據SWI指令傳遞的引數SWI異常處理程式可以作出相應的處理。SWI指令傳遞引數有以下兩種方法,

指令中的24位立即數指定了使用者請求的服務型別,引數通過通用暫存器傳遞。

MOV    R0,#34        ;設定子功能號為34

SWI    12            ;呼叫12號軟中斷

指令中的24位立即數被忽略,使用者請求的服務型別由暫存器R0的值決定,引數通過其它的通用暫存器傳遞。

MOV    R0,#12;呼叫12號軟中斷

MOV    R1,#34;設定子功能號為34

SWI    0

ARM指令——狀態暫存器讀指令

在ARM處理器中,只有MRS指令可以對狀態暫存器CPSR和SPSR進行讀操作。通過讀CPSR可以瞭解當前處理器的工作狀態。讀SPSR暫存器可以瞭解到進入異常前的處理器狀態。

 

應用示例:

   MRS  R1,CPSR  ; 將CPSR狀態暫存器讀取,儲存到R1中

   MRS  R2,SPSR  ; 將SPSR狀態暫存器讀取,儲存到R2中

ARM指令集——狀態暫存器寫指令

在ARM處理器中,只有MSR指令可以對狀態暫存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對CPSR或SPSR暫存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。

 

在ARM處理器中,只有MSR指令可以對狀態暫存器CPSR和SPSR進行寫操作。與MRS配合使用,可以實現對CPSR或SPSR暫存器的讀-修改-寫操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。

 

 

相關文章