Presentation is loading. Please wait.

Presentation is loading. Please wait.

第3章 ARM微處理器的指令集.

Similar presentations


Presentation on theme: "第3章 ARM微處理器的指令集."— Presentation transcript:

1 第3章 ARM微處理器的指令集

2 大綱 3.1 ARM微處理器的指令集概述 3.2 ARM指令的定址方式 3.3 ARM指令集 3.4 Thumb指令及應用 3.5 討論

3 大綱 3.1 ARM微處理器的指令集概述 3.2 ARM指令的定址方式 3.3 ARM指令集 3.4 Thumb指令及應用 3.5 討論
3.5 討論 P-3/67

4 3.1 ARM微處理器的指令集概述 本章將介紹ARM指令集以及各類指令對應的定址方式。而對於Thumb指令集我們稍微地加以介紹。通過對本章的閱讀,希望讀者能瞭解ARM微處理器所支援的指令集及具體的使用方法。 以下,在本章節中,我們將敘述下列的主要內容: ARM指令集與Thumb指令集概述。 ARM指令集的分類與具體應用。 Thumb指令集簡介及應用場合。

5 ARM微處理器的指令的分類與格式 ARM微處理器的指令集是以載入/存回(Load/Store)為基礎的,也即指令集僅能處理暫存器中的資料,而且處理結果都要放回暫存器中。因此,對系統記憶體的存取則需要通過專用的載入/存回指令來完成。因此,讀者需對載入與存回的觀念相當清楚。 ARM微處理器的指令集可以分為跳躍指令、資料處理指令、程式狀態暫存器(PSR)處理指令、載入/存回指令、協同處理器指令和例外事件產生指令六大類,具體的指令及功能(下表中指令為基本ARM指令,不包括衍生的ARM指令)。 P-5/67

6 指令的條件區域 當處理器工作在ARM狀態時,幾乎所有的指令均根據CPSR中條件欄位的各位元狀態和指令的條件區域有條件的執行。當指令的執行條件滿足時,指令被執行,否則指令就被忽略。 指令的幾個重點: 所有的ARM指令均包含一個可選擇的條件碼,以{cond}來表示 只有滿足CPSR的條件欄位所指定的條件時,帶條件的程式碼才可執行

7 3.1.2 指令的條件區域 條件碼{cond} 組合語言附加字尾 旗標欄位 意 義 0000 EQ Z設定 相等 0001 NE Z清除
指令的條件區域 條件碼{cond} 組合語言附加字尾 旗標欄位 意 義 0000 EQ Z設定 相等 0001 NE Z清除 不相等 0010 CS C設定 無號數大於或等於 0011 CC C清除 無號數小於 0100 MI N設定 負數 0101 PL N清除 正數或零 0110 VS V設定 溢位 0111 VC V清除 無溢位 1000 HI C設定且Z清除 無號數大於 1001 LS C清除且Z設定 無號數小於或等於 1010 GE N等於V 有號數大於或等於 1011 LT N不等於V 有號數小於 1100 GT Z清除且N等於V 有號數大於 1101 LE Z設定或N不等於V 有號數小於或等於 1110 AL 忽略 無條件執行 1111 無意義,不存在 P-7/67

8 大綱 3.1 ARM微處理器的指令集概述 3.2 ARM指令的定址方式 3.3 ARM指令集 3.4 Thumb指令及應用 3.5 討論
3.5 討論 P-8/67

9 3.2 ARM指令的定址方式 所謂的定址方式就是微處理器根據指令中所給予的位址訊息來尋找出實體位址的方式。
立即定址 暫存器間接定址 基底定址 相對定址 多暫存器定址 堆疊定址 P-9/67

10 立即定位 立即定址,這是一種特殊的定址方式,運算元本身就在指令中直接加以設定,只要取出指令也就取到了運算元。這個運算元被稱為立即數值,因此其對應的定址方式也就叫做立即定址。例如,以下所示的指令: ADD R3,R3,#1 ;R3←R3+1 AND R8,R7,#&ff ;R8←R7[7:0] 在以上兩個指令中,第二個來源運算元即為立即數值,並要求以“#”為首碼。對於以十六進制表示的立即數值,還要求在“#”後加上“0x”或“&”。第一個指令是完成R3暫存器的內容加1,然後將結果放回R3中。而第2個指令則是將32-bit的R7取其低8-bit的數值,也即是作AND邏輯運算,然後將結果傳送至R8中。 P-10/67

11 暫存器間接定址 暫存器定址就是利用暫存器中的數值作為運算元,這種定址方式是各類微處理器經常採用的一種方式,也是一種執行效率較高的定址方式。如下,所示的指令: ADD R0,R1,R2 ;R0←R1+R2 該指令的執行效果是將暫存器R1和R2的內容相加,其結果存放在暫存器R0中。 P-11/67

12 3.2.3 基底定址 基底定址就是將基底暫存器的內容與指令中所給予的位址偏移量加以相加,並進而得到一個運算元的有效位址。
基底定址 基底定址就是將基底暫存器的內容與指令中所給予的位址偏移量加以相加,並進而得到一個運算元的有效位址。 基底定址方式常用於存取某基底位址附近的記憶體資料,這包含了基底加上偏移量,以及基底加上索引值等來定址的方式。 基底加上偏移量所定址之用的基底暫存器所包含的並非是正確的位址。這基底暫存器需加上或是減掉最大達4KB的偏移量來計算出所要存取的位址。例如,以下所列的指令: LDR R0,[R1,#4] ;R0←[R1+4] P-12/67

13 3.2.4 相對定址 相對定址是以程式計數器PC的目前數值作為基底位址,指令中的位址標號作為偏移量,而將兩者相加之後可以得到有效位址。
相對定址 相對定址是以程式計數器PC的目前數值作為基底位址,指令中的位址標號作為偏移量,而將兩者相加之後可以得到有效位址。 以下所列的程式段落完成了副程式的跳躍與返回。其中,跳躍指令BL採用了相對定址方式: BL NEXT ;跳躍到副程式NEXT處執行 …… NEXT MOV PC,LR ;從副程式返回 P-13/67

14 3.2.5多暫存器定址 多暫存器定址,一個指令可以完成多個暫存器值的傳送。這種定址方式可以用一個指令完成傳送最多16個通用暫存器的值。例如,以下指令: LDMIA R0,{R1,R2,R3,R4} ;R1←[R0] ;R2←[R0+4] ;R3←[R0+8] ;R4←[R0+12] 該指令的尾碼IA表示在每次執行完載入/存回操作後,R0按字元組長度增加。 上敘例子可將連續記憶體單元的數值傳送到R1~R4。

15 3.2.6 堆疊定址 遞增堆疊(Ascending Stack):堆疊由低位址向高位址生長
堆疊定址 遞增堆疊(Ascending Stack):堆疊由低位址向高位址生長 遞減堆疊(Decending Stack):當堆疊由高位址向低位址生長 ARM微處理器支援這四種類型的堆疊工作方式,即: 滿遞增堆疊:堆疊指標指向最後填入的資料,且由低位址向高位址生長。 滿遞減堆疊:堆疊指標指向最後填入的資料,且由高位址向低位址生長。 空遞增堆疊:堆疊指標指向下一個將要放入資料的空位置,且由低位址向高地址生長。 空遞減堆疊:堆疊指標指向下一個將要放入資料的空位置,且由高位址向低地址生長。 P-15/67

16 大綱 3.1 ARM微處理器的指令集概述 3.2 ARM指令的定址方式 3.3 ARM指令集 3.4 Thumb指令及應用 3.5 討論
3.5 討論 P-16/67

17 3.3.1 跳躍指令 跳躍指令用於實現程式流程的跳躍,在ARM程式中有兩種方法可以實現程式流程的跳躍:
跳躍指令 跳躍指令用於實現程式流程的跳躍,在ARM程式中有兩種方法可以實現程式流程的跳躍: 使用特定的跳躍指令。 直接向程式計數器PC寫入跳躍位址值。 向程式計數器PC寫入跳躍位址值,可以實現在4GB的位址空間中的任意跳躍。若是在跳躍之前結合使用,如,MOV LR,PC等類似指令,可以保存將來的返回位址值,從而實現在4GB連續的線性位址空間的副程式的呼叫使用。 P-17/67

18 3.3.1 跳躍指令 ARM指令集中的跳躍指令可以完成從目前指令向前或向後的32MB的位址空間的跳躍,包括以下4個指令:
跳躍指令 ARM指令集中的跳躍指令可以完成從目前指令向前或向後的32MB的位址空間的跳躍,包括以下4個指令: B Branch,跳躍指令。 BL Branch with Link,包含返回的跳躍指令,也即是呼叫副程式。 BLX Branch and Exchange Instruction Set,包含返回和狀態切換的跳躍指令。 BX Branch with Link and Exchange Instruction Set,包含狀態切換的跳躍指令。 P-18/67

19 3.3.2 資料處理指令 資料處理指令可分為資料傳送指令、算術邏輯運算指令和比較指令。
資料處理指令 資料處理指令可分為資料傳送指令、算術邏輯運算指令和比較指令。 資料傳送指令用於在暫存器和記憶體之間進行資料的雙向傳輸。 算術邏輯運算指令完成常用的算術與邏輯的運算,該類指令不但將運算結果保存在目的暫存器中,同時更新CPSR中的相應條件旗標位元。 比較指令不保存運算結果,只更新CPSR中相應的條件旗標位元。此外,同樣需注意的是,資料處理指令僅僅當條件碼欄位是真的情況才會執行。 P-19/67

20 3.3.2 資料處理指令 資料處理指令包括: MOV 資料傳送指令 MVN 資料取反相後傳送指令 CMP 比較指令 CMN 反相比較指令
資料處理指令 資料處理指令包括: MOV 資料傳送指令 MVN 資料取反相後傳送指令 CMP 比較指令 CMN 反相比較指令 TST 位元測試指令 TEQ 相等測試指令 ADD 加法指令 ADC 包含進位元加法指令 SUB 減法指令 SBC 包含借位減法指令 RSB 反向減法指令 RSC 包含借位的反向減法指令 AND 邏輯AND指令 ORR 邏輯OR指令 EOR 邏輯XOR指令 BIC 位元清除指令 P-20/67

21 3.3.3 乘法指令與乘加指令 ARM微處理器支援的乘法指令與乘加指令共有6條,可分為運算結果為32位元和運算結果為64位元等兩類型。
乘法指令與乘加指令 ARM微處理器支援的乘法指令與乘加指令共有6條,可分為運算結果為32位元和運算結果為64位元等兩類型。 指令中的所有運算元與目的暫存器必須為通用暫存器,且不能對運算元使用立即數值或是被移位的暫存器。同時,目的暫存器和運算元1必須是不同的暫存器。 乘法指令與乘加指令共有以下所列的6個: MUL 32位元乘法指令 MLA 32位元乘加指令 SMULL 64位元有號數乘法指令 SMLAL 64位元有號數乘加指令 UMULL 64位元無號數乘法指令 UMLAL 64位元無號數乘加指令 P-21/67

22 3.3.4 程式狀態暫存器(PSR)存取指令 ARM微處理器支援程式狀態暫存器存取指令,用於在程式狀態暫存器和通用暫存器之間傳送資料
程式狀態暫存器存取指令包括以下兩條: MRS 程式狀態暫存器到通用暫存器的資料傳送指令 MSR 通用暫存器到程式狀態暫存器的資料傳送指令 P-22/67

23 3.3.4 程式狀態暫存器(PSR)存取指令 MRS指令 MRS指令範例: MRS指令的格式為:
MRS{條件} 通用暫存器,程式狀態暫存器(CPSR或SPSR) MRS指令用於將程式狀態暫存器的內容傳送到通用暫存器中。該指令一般用在以下幾種情況: 當需要改變程式狀態暫存器的內容時,可用MRS將程式狀態暫存器的內容讀入通用暫存器,修改後再寫回程式狀態暫存器。 當在例外事件處理或程序切換時,需要保存程式狀態暫存器的值,可先用該指令讀出程式狀態暫存器的值,然後加以保存。 MRS指令範例: MRS R0,CPSR ;傳送CPSR的內容到R0 MRS R0,SPSR ;傳送SPSR的內容到R0 P-23/67

24 載入/存回指令 ARM微處理器支援載入/存回指令用於在暫存器和記憶體之間傳送資料,載入指令用於將記憶體中的資料傳送到暫存器,存回指令則完成相反的操作。 常用的載入存回指令如下: LDR 字元組資料載入指令 STR 字元組資料存回指令 LDRB 位元組資料載入指令 STRB 位元組資料存回指令 LDRH 半字元組資料載入指令 STRH 半字元組資料存回指令

25 3.3.5 載入/存回指令 LDR指令 LDR指令的格式為: LDR{條件} 目的暫存器,<記憶體位址>
載入/存回指令 LDR指令 LDR指令的格式為: LDR{條件} 目的暫存器,<記憶體位址> LDR指令用於從記憶體中將一個32位元的字元組資料傳送到目的暫存器中。該指令通常用於從記憶體中讀取32位元的字元組資料到通用暫存器,然後對資料進行處理。當程式計數器PC作為目的暫存器時,指令從記憶體中讀取的字元組資料被當作目的地址,從而可以實現程式流程的跳躍。該指令在程式設計中比較常用,且定址方式靈活多變,讀者需加以掌握與應用。 P-25/67

26 3.3.5 載入/存回指令 LDRB指令 LDRB指令範例: LDRB指令的格式為:
載入/存回指令 LDRB指令 LDRB指令的格式為: LDR{條件}B 目的暫存器,<記憶體位址> LDRB指令用於從記憶體中將一個8位元的位元組資料傳送到目的暫存器中,同時將暫存器的高24-bit清除。該指令通常用於從記憶體中讀取8位元的位元組資料到通用暫存器,然後對資料進行處理。當程式計數器PC作為目的暫存器時,指令從記憶體中讀取的字元組資料被當作目的地址,從而可以實現程式流程的跳躍。 LDRB指令範例: LDRB R0,[R1] ;將記憶體位址為R1的位元組資料讀入暫存器R0,並將R0的高24位清除。 LDRB R0,[R1,#8] ;將記憶體位址為R1+8的位元組資料讀入暫存器R0,並將R0的高24位清除。 P-26/67

27 3.3.5 載入/存回指令 STR指令 STR指令範例: STR指令的格式為: STR{條件} 來源暫存器,<記憶體位址>
載入/存回指令 STR指令 STR指令的格式為: STR{條件} 來源暫存器,<記憶體位址> STR指令用於從來源暫存器中將一個32位元的字元組資料傳送到記憶體中。該指令在程式設計中比較常用,且定址方式靈活多樣,使用方式可參考指令LDR。 STR指令範例: STR R0,[R1],#8 ;將R0中的字元組資料寫入以R1為位址的記憶體中,並將新位址R1+8寫入R1。 STR R0,[R1,#8] ;將R0中的字元組資料寫入以R1+8為位址的記憶體中。 P-27/67

28 3.3.5 載入/存回指令 STRB指令 STRB指令範例: STRB指令的格式為:
載入/存回指令 STRB指令 STRB指令的格式為: STR{條件}B 來源暫存器,<記憶體位址> STRB指令用於從來源暫存器中將一個8位元的位元組資料傳送到記憶體中。該位元組資料為來源暫存器中的較低8-bit。 STRB指令範例: STRB R0,[R1] ;將暫存器R0中的位元組資料寫入以R1為位址的記憶體中。 STRB R0,[R1,#8] ;將暫存器R0中的位元組資料寫入以R1+8為位址的記憶體中。 P-28/67

29 多重資料載入/存回指令 定址模式 這些指令的傳輸位址是由基底暫存器(Rn),之前/之後位元(bBit-24,P)與向上/向下生長位元(Bit-23,U)的內容所決定的。 暫存器傳輸的順序是從最低到最高,所以R15(如果有列在欄位中的話)將總會是最後傳輸的。如此,最低的暫存器也會傳輸至最低的記憶體位址,或是從最低的記憶體位址傳輸回來。 例:考慮R1,R5與R7的傳輸,且Rn = 0x1000,以及寫回並修改基底位址是被設定的 (W = 1)。顯示了暫存器傳輸的步驟,其所使用的位址,以及指令結束後的Rn值。在所有的情形下,所修改的基底值無需寫回(W = 0),Rn應會維持其啟始值,0x1000。而除非它也是在載入多重暫存器指令的傳輸列表中,那麼它將會以所載入的數值被覆寫過去。 P-29/67

30 3.3.7 資料交換指令 SWP指令 SWP指令範例: SWP指令的格式為: SWP{條件} 目的暫存器,來源暫存器1,[來源暫存器2]
資料交換指令 SWP指令 SWP指令的格式為: SWP{條件} 目的暫存器,來源暫存器1,[來源暫存器2] SWP指令用於將來源暫存器2所指向的記憶體中的字元組資料傳送到目的暫存器中,同時將來源暫存器1中的字元組資料傳送到來源暫存器2所指向的記憶體中。顯然,當來源暫存器1和目的暫存器為同一個暫存器時,指令交換該暫存器和記憶體的內容。 SWP指令範例: SWP R0,R1,[R2] ;將R2所指向的記憶體中的字元組資料傳送到R0,同時將R1中的字元組資料傳送到R2所指向的存儲單元。 SWP R0,R0,[R1] ;該指令完成將R1所指向的記憶體中的字元組資料與R0中的字元組資料交換。 SWPEQ R0,R0,[R1] ; 有條件地交換由R1所指向的記憶體中的字元組資料與R0中的字元組資料交換。 P-30/67

31 3.3.8 移位指令 LSL(或ASL)操作 LSL指令範例: LSL(或ASL)操作的格式為: 通用暫存器Rm,LSL(或ASL) 運算元
移位指令 LSL(或ASL)操作 LSL(或ASL)操作的格式為: 通用暫存器Rm,LSL(或ASL) 運算元 LSL(或ASL)可完成對通用暫存器中的內容進行邏輯(或算術)的左移操作,且按運算元所指定的數量向左移位,而低位元則用0值來加以填入。其中,運算元可以是通用暫存器,也可以是立即數值(0~31)。 LSL指令範例: MOV R0, R1, LSL#2 ;將R1中的內容左移兩位元後傳送到R0中。 P-31/67

32 3.3.8 移位指令 LSR操作 LSR指令範例: LSR操作的格式為: 通用暫存器Rm,LSR 運算元
移位指令 LSR操作 LSR操作的格式為: 通用暫存器Rm,LSR 運算元 LSR可完成對通用暫存器中的內容進行右移的操作,按運算元所指定的數量向右移位,左端用零來填充。其中,運算元可以是通用暫存器,也可以是立即數(0~31)。 LSR指令範例: MOV R0, R1, LSR#2 ;將R1中的內容右移兩位元後傳送到R0中,左端用0值來填充。 P-32/67

33 3.3.9 協同處理器指令 ARM協同處理器指令包括以下5條: CDP 協同處理器操作指令 LDC 協同處理器資料載入指令
協同處理器指令 ARM協同處理器指令包括以下5條: CDP 協同處理器操作指令 LDC 協同處理器資料載入指令 STC 協同處理器資料存回指令 MCR ARM處理器暫存器到協同處理器暫存器的 資料傳送指令 MRC 協同處理器暫存器到ARM處理器暫存器的資 料傳送指令 P-33/67

34 3.3.10 例外事件產生指令 SWI指令 程式範例: SWI指令的格式為:SWI{條件} 24位元的立即數值
例外事件產生指令 SWI指令 SWI指令的格式為:SWI{條件} 24位元的立即數值 SWI指令用於產生軟體中斷,以便使用者程式能呼叫作業系統的系統常式。作業系統在SWI的例外事件處理程式中提供相應的系統服務,指令中24位元的立即數值指定使用者程式呼叫系統常式的類型,相關參數通過通用暫存器傳遞。當指令中24位元的立即數值被忽略時,使用者程式呼叫系統常式的類型由通用暫存器R0的內容決定,同時,參數通過其他通用暫存器來加以傳遞。 程式範例: SWI 0x ;該指令呼叫作業系統編號位元02的系統常式。 P-34/67

35 3.3.10 例外事件產生指令 BKPT指令 BKPT指令的格式為: BKPT 16位的立即數
例外事件產生指令 BKPT指令 BKPT指令的格式為: BKPT 16位的立即數 BKPT指令產生軟體中斷點中斷,可用於程式的調試。 P-35/67

36 大綱 3.1 ARM微處理器的指令集概述 3.2 ARM指令的定址方式 3.3 ARM指令集 3.4 Thumb指令及應用 3.5 討論
3.5 討論 P-36/67

37 3.4 Thumb指令及應用 為相容資料匯流排寬度為16位元的應用系統,ARM系列架構除了支援執行效率很高的32位元ARM指令集以外,同時支援16位元的Thumb指令集。 Thumb指令集是ARM指令集的一個子集,允許指令編碼為16位元的長度。與等價的32位元代碼相比較,Thumb指令集在保留32代碼優勢的同時,大大的節省了系統的記憶體空間。 所有的Thumb指令都有對應的ARM指令,而且Thumb的程式設計模型也對應於ARM的程式設計模型。 在應用程式的編寫過程中,只要遵循一定呼叫的規則,Thumb副程式和ARM副程式就可以互相呼叫。當處理器在執行ARM程式段時,稱ARM處理器處於ARM工作狀態,當處理器在執行Thumb程式段時,稱ARM處理器處於Thumb工作狀態。 P-37/67

38 大綱 3.1 ARM微處理器的指令集概述 3.2 ARM指令的定址方式 3.3 ARM指令集 3.4 Thumb指令及應用 3.5 討論
3.5 討論 P-38/67

39 3.5 討論 本章系統的介紹了ARM指令集中的基本指令,以及各指令的應用場合及方法,由基本指令還可以派生出一些新的指令,但使用方法與基本指令類似。與常見的如X86體系結構的彙編指令相比較,ARM指令系統無論是從指令集本身,還是從定址方式上,都相對複雜一些。 Thumb指令集作為ARM指令集的一個子集,其使用方法與ARM指令集類似,在此未作詳細的描述,但這並不意味著Thumb指令集不如ARM指令集重要,事實上,他們各自有其自己的應用場合。 P-39/67


Download ppt "第3章 ARM微處理器的指令集."

Similar presentations


Ads by Google