42

ARM指令集

Embed Size (px)

Citation preview

Page 1: ARM指令集
Page 2: ARM指令集

資料類型◦ ARM處理器支援6種資料類型

8位元有號和無號位元組16位元有號和無號半字元,它們以兩位元組的邊界對齊32位元有號和無號半字元,它們以4位元組的邊界對齊

◦ 一些早期ARM處理器不支援半字元和有號位元組記憶體組織◦ 在以位元組為單位定址的記憶體中,有兩種方式來儲字元,根據最低有效位元與較高有效位元,相比是存在較低的,還是較高的位址來劃分

2

Page 3: ARM指令集

3

Page 4: ARM指令集

絕大多數程式都在使用者模式下操作,但ARM還有一種用於處理異常和管理者程式呼叫(有時稱為軟體中斷)的特權操作模式

CPSR (Current Program Status Register,當前程式狀態暫存器)

4

Page 5: ARM指令集

條件碼旗標:◦ N,Z,C,V 大多數指令可以測試這些條件碼旗標以決定程式指令如何執行

控制位元:◦ 最低8位元I,F,T和M位元用做控制位元。當例外出現時改變控制位元。當處理器在特權模式下也可以由軟體改變。

中斷禁止位元:◦ I 置1則禁止IRQ中斷。F置1則禁止FIQ中斷。T位元:◦ T=0 指示ARM執行。T=1指示Thumb執行。在這些架構系統中,可自由地使用能在ARM和Thumb狀態之間切換的指令。

模式位元:◦ M0, M1, M2, M3和M4 (M[4:0]) 是模式位元.這些位元決定處理器的工作模式。

5

Page 6: ARM指令集

6

Page 7: ARM指令集

SPSR (Saved Program Status Register,程式狀態保存暫存器)

◦ 每一種特權模式,都有一個與之相關的程式狀態保存暫存器SPSR。

◦ 這個暫存器在進入特權模式時,保存CPSR的狀態,以便重新開始用戶行程時能全部恢復用戶狀態

7

Page 8: ARM指令集

通常用異常來處理在執行程式時發生的意外事件◦ 如中斷、記憶體故障

在ARM的架構中,異常也用來指軟體中斷、未定義指令陷阱(undefined instruction traps)及系統重置功能

ARM異常可以分為3類:◦ 指令執行引起的直接異常。

未定義指令(包括所要求的協同處理器不存在時的協同處理器指令)和預取指令中止(因為取指過程中,記憶體故障導致的無效指令)指令執行引起的間接異常。資料中止(在Load和Store資料存取時記憶體故障)外部產生與指令流無關的異常。重置、IRQ和FIQ

8

Page 9: ARM指令集

異常的進入◦ 當發生異常時,ARM儘量完成當前指令(除了重置異常,立即中止當前指令),然後脫離當前的指令序列去處理異常

◦ 間接或外部事件引起的異常,將占據當前的下條指令

◦ 直接異常在產生時,就按順序處理進入與特定異常相應的操作模式將引起異常指令的下一條指令的位址保存到新模式的r14中將CPSR的原值保存到新模式的SPSR中藉由設置CPSR的第7位元來禁止IRQ。如果異常為快速中斷,則還要設置CPSR的第6位元來禁止快速中斷給PC強制值,使程式從表5-2的相應向量位址開始執行

9

Page 10: ARM指令集

每個特權模式的兩個暫存器用來保存返回位址(r14)和堆疊指標(r13)◦ 堆疊指標可以用來保存其他用戶暫存器,這樣異常處理程式就可以使用這些暫存器

10

Page 11: ARM指令集

異常的返回◦ 一旦異常處理完畢,用戶任務便恢復正常

所有修改過的用戶暫存器必須從處理程式的堆疊中恢復CPSR必須從相應的SPSR中恢復PC必須變回到,用戶指令流中相應的指令位址

11

Page 12: ARM指令集

異常的優先權◦ 多種異常可以同時產生,需要定義優先權以便確定處理異常的順序,對於ARM優先權如下:重置 (最高優先權)資料異常中止FIQIRQ預取指令異常中止SWI,未定義指令

12

Page 13: ARM指令集

條件分歧是絕大多數指令集的標準特徵,但ARM將條件執行擴展到所有的指令◦ 條件欄占據32位元指令欄的高4位元◦ 條件欄共有16個值,每個值都根據CPSR中旗標N、Z、C和V的值來確定指令是執行,還是跳過◦ 每條ARM指令都擴展兩個字母◦ 「always」條件(AL)可省略◦ 「never」條件不要使用

13

Page 14: ARM指令集

14

Page 15: ARM指令集

分歧和分歧連結(Branch with Link)指令是改變指令執行順序的標準方式◦ 位址計算方式

先對指令中定義的24位元偏移量進行符號擴展,左移兩位的偏移,然後將它加到程式計數器(r15)分歧指令的範圍為± 32MB

◦ L (第24位元)設定的連結形式0 : Branch 1 : Branch with link將分歧後下一條指令的位址傳送到當前處理器模式下的連結暫存器(r14)這一般用於實現 副程式呼叫,返回時將連結暫存器的內容拷貝回PC

15

Page 16: ARM指令集

組譯格式B {L} {<cond>} <target address>

L:指定分歧與連結屬性 <cond>: 如表5-3擴展碼

16

Page 17: ARM指令集

17

無條件跳躍B LABEL ;無條件跳躍…

LABEL … ;…到這裡

執行10次迴圈MOV r0,#10 ;初始化迴圈計數器

LOOP …BNE LOOP ;如果計數器≠0,則重複迴圈…… ;…否則中止迴圈

呼叫副程式…BL SUB ;分歧連結到副程式SUB… ;返回到這裡

SUB … ;副程式入口MOV pc, r14 ;返回

條件副程式呼叫…CMP r0, #15 ;如果r0<5BLLT SUB1 ;則呼叫SUB1BLGE SUB2 ;否則呼叫SUB2

Page 18: ARM指令集

組譯格式SWI {<cond>} <24位元立即數>

軟體中斷指令用於呼叫作業系統,常稱為「管理者程式呼叫」

◦ 將SWI後面指令的位址保存到r14_svc◦ 將CPSR保存到SPSR_svc◦ 進入管理者模式,將CPSR[4:0]設置為100112以及將CPSR[7]設置為1,以便禁止IRQ

◦ 將PC設置為0816,並且開始執行那裡的指令

18

Page 19: ARM指令集

ARM資料處理指令使用3位址格式,這就意味著分別指定兩個來源運算元和一個目的暫存器

一個來源運算元總是暫存器,第二個可能是暫存器、移位後的暫存器或立即數◦ 第二運算元如果是暫存器,則應用於它的移位可能是邏輯或算術移位,或是循環移位

◦ 移位的位數可以由立即數指定,也可以由第4暫存器指定

藉由設定S(第20位元),這些指令可以直接控制處理器的條件碼是否受指指令執行的影響◦ 當S清除除時,條件碼不改變,當S設定時(並且Rd不是r15)

結果為負,則旗標N被設定;否則被清除結果為0,則旗標Z被設定;否則被清除當操作為算術操作(ADD,ADC,SUB,SBC….)時,旗標C設置為ALU的進位輸出;否則設置為移位器的進位輸出。如果不需要移位,則C保持在非算術的操作中,旗標V保持原值。在算術操作中,第30到第31位元的溢位,則被設定;若不發生溢位,則清除

19

Page 20: ARM指令集

20

Page 21: ARM指令集

21

Page 22: ARM指令集

r1加r3,結果放在r5:ADD r5,r1,r3

r2遞減並檢查是否為0:SUBS r2,r2,#1 ;r2減1,設置條件碼BEQ LABEL ;如果r2為0則分歧….. ;否則繼續向下

r0乘以5:ADD r0,r0,r0,LSL #2

r0乘10的副程式:MOV r0,#3BL TIMES10….

TIMES10MOV r0,r0,LSL #1 ;乘以2ADD r0,r0,r0,LSL #2 ;乘以5MOV pc,r14

將r0、r1中的64位元整數加到r2、r3的64位元整數上:ADDS r2,r2,r0 ;加低位,保存進位ADC r3,r3,r1 ; 加高位和進位

22

Page 23: ARM指令集

23

Page 24: ARM指令集

同其他資料處理指令一樣,位元S控制條件碼的設置。當在指令中設定了位元S時,則◦ 對於產生32結果的指令形式,將旗標N設定為Rd的第31位元的值;對於產生長結果的指令形式,將其設定為RdHi的第31位元的值。

◦ 如果Rd或RdHi和RdLo為0,則旗標Z被設定◦ 將旗標C設置為無意義的值◦ 旗標V不變

MOV r11, #20 ;初始化迴圈計數MOV r10, #0 ;初始化總和

LOOP LDR r0,[r8],#4 ;讀取第一分量LDR r1,[r9],#4 ;…第二分量MLA r10, r0, r1, r10 ;乘積累加SUBS r11, r11, #1 ; 乘積累加BNE LOOP

24

Page 25: ARM指令集

這些指令是ARM在暫存器和記憶體傳送單個位元組和字元,最彈性的方式

通常大區塊資料的傳送最好使用多暫存器傳送指令

ARM處理器也支援傳送半字元和有號位元組的指令

25

Page 26: ARM指令集

26

Page 27: ARM指令集

基址暫存器(Rn),加上(U=1)或減去(U=0)一個無號立即數或暫存偏移量記憶體(Rd)讀取(L=1)一個無號位元組(B=1)或字元(B=0)記憶體(Rd)儲存(L=0)一個無號位元組(B=1)或字元(B=0)當一個位元組加載到暫存器時,它會以0擴展到32位元當一個位元組從暫存器儲存到記憶體時,暫存器的低8位元寫到位址指向的位置前索引(P=1)的定址模式使用計算出的位址進行傳送操作。當要求回寫時(W=1),將基址暫存器更新為計算出的值後索引(P=0)的定址模式用未修改的基址暫存器來傳送資料,然後將基址暫存器更新為計算出的位址,而不管位元W如何

27

Page 28: ARM指令集

組譯格式◦ 前索引(pre-indexed)的指令形式如下:

LDR|STR {<cond>} {B} Rd, [Rn, <offset>] {!}◦ 後索引(post-indexed)的指令形式如下:

LDR|STR {<cond>} {B} {T} Rd, [Rn], <offset>◦ 一種有用的相對PC的形式(由組譯器計算所需立即數)

LDR|STR {<cond>} {B} Rd, LABEL

LDR:從記憶體加載到暫存器STR:將暫存器儲存到記憶體B:用於選擇無號位元傳送,預設為字元<offest>可能是「# ±<12位元立即數>」或「±Rm{,shift}」「!」在前索引定址的方式下選擇是否回寫(自動索引)

28

Page 29: ARM指令集

29

將r0中的一個位元組存到週邊

LDR r1, UARTADD ; 將UART位址裝入r1中STRB r0, [r1] ;將資料存到UART中…

UARTADD …

Page 30: ARM指令集

指令與字元和無號位元組的指令形式類似,但這裡的立即數偏移限定在8位元位元S和H定義所傳送的運算元的類型

30

Page 31: ARM指令集

31

Page 32: ARM指令集

組擇格式◦ 前索引(pre-indexed)的指令形式如下:

LDR|STR {<cond>} H|SH|SB Rd, [Rn, <offset>] {!}◦ 後索引(post-indexed)的指令形式如下:

LDR|STR {<cond>} H|SH|SB Rd, [Rn], <offset>

<offset>是「 # ±<8位元立即數>」或「±Rm」H|SH|SB用於選擇資料類型

32

Page 33: ARM指令集

33

把一個有號半字元陣列擴展到字元陣列:

ADR r1,ARRAY1 ;半字元陣列開始ADR r2,ARRAY2 ;字元陣列開始ADR r3,ENDARR1 ;ARRAY1的端點+2

LOOP LDRSH r0,[r1],#2 ;取符號半字元STR r0,[r2],#4 ;保存字元CMP r1,r3 ;檢查陣列是否結束BLT LOOP ;如果沒有結束,則循環

Page 34: ARM指令集

ARM多暫存器轉送指令允許當前操作模式的16個可見暫存器的任意子集,從記憶體加載或儲存到記憶體中

一種指令形式允許作業系統Load或Store使用者模式暫存器來保存或恢復用戶處理狀態

一種形式允許從SPSR恢復CPSR作為從異常處理返回的一部份

34

Page 35: ARM指令集

35

Page 36: ARM指令集

指令的低16位元為暫存器列表,其中的每一位元對應一個可見暫存器◦ 第0位元控制是否傳送r0, 第1位元控制r1,依次類推到第15位控制傳送PC

在傳送每一個字元之前(P=1)或之後(P=0),基址將增加(U=1)或減少(U=0)W=1,則基址暫存器將增加(U=1)或減少(U=0)所傳送的位元組數指令有一種特殊形式可以用來恢復CPSR:◦ 如果PC是在多暫存器Load指令的暫存器列表中,而且S被設定,則當前模式的SPSR將被拷貝到CPSR這種形式不能在使用者模式的代中使用,因為在使用者模式下沒有SPSR

36

Page 37: ARM指令集

組譯格式◦ LDM|STM {<cond>}<add mode> Rn{!} <registers>

<add mode>:定址模式=> U:累增或累減=> P:先增或先減=> W:定義自動索引「!」

<registers>:暫存器列表暫存器的範圍括在大括弧內,例如{r0,r3-r7,pc}|

◦ LDM|STM {<cond>}<add mode> Rn{!}, <reigster+pc>^在非使用者模式下,CPSR可以由上式恢復,暫存器列表必須包含PC

◦ LDM|STM {<cond>}<add mode> Rn, <register-pc>^在非使用者模式下,用戶暫存器可以藉由下式保存和恢復,不得包含PC

37

Page 38: ARM指令集

當需要保存或修改當前模式下CPSR或SPSR的內容時,首必須將這些內容傳送到一般暫存器中,對選擇的位元進行修改,然後將資料回寫到狀態暫存器

38

Page 39: ARM指令集

將CPSR(R=0)或當前模式的SPSR(R=1)拷貝到目的暫存器(Rd),全部32位元都被拷貝組譯格式◦ MRS {<cond>} Rd, CPSR|SPSR

MRS r0,CPSR ;將CPSR傳送到r0MRS r3,SPSR ;將SPSR傳送到r3

39

Page 40: ARM指令集

當需要保存或修改當前模式下CPSR或SPSR的內容時,首先必須將這些內容傳送到通用(general)暫存器中,對選擇的位元進行修改,然後將資料回寫到狀態暫存器

40

Page 41: ARM指令集

運算元,可能是一個暫存器(Rm)或循環移位的8位元立即數欄位遮罩(field mask)控制下被傳送到CPSR(R=0)或當前模式的SPSR(R=1)欄位遮罩控制PSR暫存器內4個位元組的更新◦ 第16位元決定PSR[7:0]是否更新◦ 第17位元控制PSR[15:8]◦ 第18位元控制PSR[23:16]◦ 第19位元控制PSR[31:24]當使用立即數運算元時,只有旗標(PSR[31:24])可以選擇更新

41

Page 42: ARM指令集

組譯格式◦ MRS {<cond>} CPSR_f|SPSR_f, #<32-bit immediate>◦ MRS {<cond>} CPSR_<field>|SPSR_f<field>, Rm

這裡<field>表示下列情況之一c:控制欄位,PSR[7:0]x:擴展欄位,PSR[15:8]s:狀態欄位,PSR[23:16]f:旗標欄位,PSR[31:24]

42

設置旗標N、Z、C和VMSR CPSR_f, #&f0000000

僅設置旗標C,保存N、Z和VMSR r0,CPSR ;將CPSR傳送到r0ORR r0,r0,#&20000000 ;設置r0的第29位元MSR CPSR_f, r0 ;傳送回CPSR