ARM體系結構與組成原理應用

標籤(空格分隔): ARM

Authur:atao
Start Data:2015.7.14

ARM體系體系結構概論

一、概述

1.ARM全稱:高級精簡指令集機器
2.ARM既是一個公司名,又是一種體系結構
3.RISC體系特點

1)指令集:RISC處理器減少了指令種類
2)流水線:取址、譯碼、執行
3)寄存器:RISC處理器擁有更多的通用寄存器
4)Load-store結構:處理器只處理寄存器中的數據

4.MIPS:百萬條指令/每秒
5.ARM的版本解析

1)ARMV //表示體系版本
2)ARM1 //表示核心版本
3)CPU名稱
4)開發板的名稱

6.MMU:內存保護單元
7.DSP指令集:數字信號處理
8.AHB:高速總線 APB:低速總線
9.ALU:算術邏輯單元
10.LDM:從內存加載 FA:遞增 ED:遞減
11.stmfa:入棧 ldmfa:出棧

ARM體系架構

一、馮.諾依曼結構

1.輸入設備
2.運算器
3.輸出設備
4.控制器
5.存儲器

二、哈佛結構(地址總線和數據總線是分時複用的)

1.CPU
2.程序存儲器
3.操作數存儲器

三、ARM處理器的七種模式(由CPSR的低五位控制)

1.模式	        描述
2.管理(SVC)	    復位或執行(SWI)	
3.快速中斷(FIQ)	高優先級的中斷產生的情況
4.中斷(IRQ)   	低優先級的中斷產生的情況
5.中止(Abort)	處理內存異常情況
6.未定義(Undef)	處理未定義異常情況
7.系統(System)	除了是特權模式外,其他與用戶模式一樣.
8.用戶(User)  	應用程序和系統任務

注意:當發生異常會切換到前五種模式,又稱異常模式.

四、數據類型

1.字節(8位)
2.半字(16位)
3.字(32位)
4.雙字(64位)

五、程序狀態寄存器

1.CPRS的四種域(32位)
f:標誌域
s:狀態域
x:擴展域
c:控制域
2.標誌域(f)的4個狀態位
N = 負數,從ALU來的數據
Z = 零,從ALU來的數據
C = ALU操作需借位或有進位
V = ALU操作出現了溢出

ARM指令集與尋址方式

一、處理器尋址方式

1.地址:數據和指令存放的位置
2.尋址方式:尋找指令地址和操作數地址的方式
3.尋址過程:形成指令地址和操作數地址的過程
注意:數據存放的位置可以是寄存器、存儲器或I/O端口,指令存放的位置只能是存儲器中的代碼段

二、尋址方式分類

1. ARM處理器具有9種基本尋址方式:

1)寄存器尋址 mov r1, r0
2)立即尋址 mov r0, #0x12
3)寄存器移位尋址 mov r1, r0, lsl #4
4)寄存器間接尋址 ldr r1, [r0]
5)基址尋址 ldr r1, [r0, #5]
6)多寄存器尋址 ldmia r12, {r0 - r4}
7)堆棧尋址(一般用的是滿遞減棧)
操作順序爲:先進後出
向上生長:向高地址方向生長,稱爲遞增堆棧
向下生長:向低地址方向生長,稱爲慈善堆棧

四種類型的堆棧方式:

滿遞增:堆棧向上增長,堆棧指針指向內含有效數據項的最高地址。指令如LDMFA、STMFA等;
空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;
滿遞減:堆棧向下增長,堆棧指針指向內含有效數據項的最低地址。指令如LDMFD、STMFD等;
空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。
注意:
8)塊拷貝尋址
9)相對尋址

三、ARM指令集

1.指令:CPU能直接識別並且能執行相關操作的命令.
2.大多數 ARMs 實現兩套指令集:
1)32-bit ARM 指令集
2)16-bit Thumb 指令集
3.ARM指令的基本格式如下:
<opcode> {<cond>} {S}       <Rd> ,    <Rn>    {,<operand2>} 

解析:

<指令助記符>{<執行條件>}{是否影響CPSR的值} <地址1><地址2>, <3>
4.ARM指令集–指令條件碼錶
條件碼	條件助記符	標誌	含義
0000	    EQ  	Z=1	    相等
0001    	NE	    Z=0	    不相等
0010	    CS/HS	C=1	    無符號數大於或等於
0011    	CC/LO	C=0	    無符號數小於
0100	    MI	    N=1	    負數
0101	    PL	    N=0	    正數或零
0110	    VS	    V=1	    溢出
0111	    VC	    V=0	    沒有溢出
1000	    HI	    C=1,Z=0	無符號數大於
1001    	LS	    C=0,Z=1	無符號數小於或等於
1010	    GE	    N=V	    有符號數大於或等於 
1011	    LT	    N!=V	有符號數小於 
1100    	GT	    Z=0,N=V	有符號數大於 
1101	    LE	Z=1,N!=V	有符號數小於或等於 
1110	    AL  	任何	無條件執行 (指令默認條件) 
1111    	NV	    任何	從不執行(不要使用) 
5.數據處理指令的組成:
1)數據傳輸: MOV	MVN
2)算術邏輯運算:ADD	ADC	SUB	SBC	RSB	RSC
               AND  ORR   EOR	BIC  LSL  LSR ASR  ROR
               RRX
3)比較運算:	CMP	CMN	TST	TEQ
6.數據處理命令解析

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

	    MOV{cond}{S}    Rd,operand2
參數:operand2:立即數或寄存器,立即數必須是 "8 位圖" 數

2)數據傳輸–MVN
MVN指令將8位圖立即數或寄存器(operand2)按位取反後傳送到目標寄存器(Rd),因爲其具有取反功能,所以可以裝載範圍更廣的立即數。
指令格式如下

		MVN{cond}{S}    Rd,operand2

3)算術邏輯運算–ADD
加法運算指令–ADD指令將operand2的值與Rn的值相加,結果保存到Rd寄存器。
指令格式如下

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

4)算術邏輯運算–ADC
帶進位加法指令–ADC將operand2的值與Rn的值相加,再加上CPSR中的C條件標誌位,結果保存到Rd寄存器。
指令格式如下

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

5)算術邏輯運算–SUB
減法運算指令–SUB指令用寄存器Rn減去operand2,結果保存到Rd中。
指令格式如下

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

6)算術邏輯運算–RSB
逆向減法運算指令–RSB指令將operand2的值減去Rn,結果保存到Rd中。
指令格式如下

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

7)算術邏輯運算–SBC
帶進位減法指令–SBC用寄存器Rn減去operand2,再減去CPSR中的C條件標誌位的非 (即若C標誌清零,則結果減去1),結果保存到Rd中。
指令格式如下

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

8)算術邏輯運算–RSC
帶借位逆向減法指令–RSC指令用寄存器operand2減去Rn,再減去CPSR中的C條件標誌位的非,結果保存到Rd中。
指令格式如下

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

9)與操作指令–AND指令
將operand2的值與寄存器Rn的值按位作"與"操作,結果保存到Rd中。
指令格式如下

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

10)算術邏輯運算–ORR
或操作指令–ORR指令將operand2的值與寄存器Rn的值按位作"或"操作,結果保存到Rd中。
指令格式如下

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

11)算術邏輯運算–EOR(可用於交換兩個數)
異或操作指令–EOR指令將operand2的值與寄存器Rn的值按位作"異或"操作,結果保存到Rd中。
指令格式如下

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

12)算術邏輯運算–BIC
位清除指令–BIC指令將寄存器Rn的值與operand2的值的反碼按位作"與"操作, 結果保存到Rd中。
指令格式如下

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

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

		CMP{cond}	Rn, operand2 

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

		CMN{cond}	Rn, operand2

15)位測試–TST(按位與)
位測試指令–TST指令將寄存器Rn的值與operand2的值按位作"與"操作,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。
指令格式如下

		TST{cond}    Rn, operand2

16)相等測試–TEQ(按位異或)
相等測試指令–TEQ指令將寄存器Rn的值與operand2的值按位作"異或"操作,根據操作的結果更新CPSR中的相應條件標誌位,以便後面的指令根據相應的條件標誌來判斷是否執行。
指令格式如下

		TEQ{cond}    Rn, operand2
6.其它命令解析:

1)移位指令在 ARM指令中不能單獨使用,只能屬於某個指令的操作數部分
2)而在 THUMB 指令中只能單獨使用
3)移位的位數可以是立即數或寄存器

LSL : 邏輯左移, 高位丟棄, 低位補 0, 如果使用立即數, 則取數範圍爲 0 - 31
LSR : 邏輯右移, 低位丟棄, 高位補 0, 如果使用立即數, 則取數範圍爲 1 - 32
ASR : 算術右移, 低位丟棄, 高位補符號, 如果使用立即數, 則取數範圍爲 1 - 32
ROR : 循環右移, 低位補到高位, 如果使用立即數, 則取數範圍爲 1 - 31
RRX : 帶標誌位的循環右移, 每次只移一位, 先將C位移入最高位, 再將最後一位移入C位, 
	注意, 主指令必須帶 s, 否則不會將最後一位移入C位

四、分支指令

1、分支指令 ---- B指令

該指令跳轉範圍限制在當前指令的±32M字節地址內(ARM指令爲字對齊,最低2位地址固定爲0)。
指令格式如下

		B{cond}    Label    	
		; 條數範圍: -2^23 ---- +2^23-1; 地址範圍: -2^25 ---- +2^25-4 byte
	應用示例:
		B    L1
		B    %f1    ;向前跳(即跳至接下來未執行的指令)
		B    %b2    ;向後跳(默認向後跳,即已經執行過的指令)
2、分支指令 ---- BL指令, 帶鏈接的跳轉指令
將bl指令的下一條指令地址保存到了lr中.該指令跳轉範圍限制在當前指令的±32M字節地址內(ARM指令爲字對齊,最低2位地址固定爲0)。
指令格式如下:
		BL{cond}    Label    	
		; 條數範圍: -2^23 ---- +2^23-1; 地址範圍: -2^25 ---- +2^25-4 byte

應用示例:

		BL    L1
3、分支指令 ---- BX指令, 帶狀態切換的跳轉指令
    pc = Rm & 0xfffffffe, T = Rm & 1. 

該指令跳轉範圍限制在當前指令的±32M字節地址內(ARM指令爲字對齊,最低2位地址固定爲0)。
指令格式如下

		BX{cond}    Rm    	
		; 條數範圍: -2^23 ---- +2^23-1; 地址範圍: -2^25 ---- +2^25-4 byte
	應用示例:
		BX    R0
4、分支指令 ---- BLX指令, 帶狀態切換帶鏈接的跳轉指令,
pc = Rm & 0xfffffffe, T = Rm & 1. 
pc = Label, T = 1, lr = 下一條指令地址(PC - 4)
該指令跳轉範圍限制在當前指令的±32M字節地址內(ARM指令爲字對齊,最低2位地址固定爲0)。
指令格式如下:
	BLX{cond}    Rm
	BLX{cond}    Label    	
	; 條數範圍: -2^23 ---- +2^23-1 條
	; 地址範圍: -2^25 ---- +2^25-4 byte
	應用示例:
	BLX    R0
	BLX    Label
注意, 配置 Language Settings 時要在 PCS 選項卡中選擇 ARM/Thumb interwroking 選項。

五、狀態存儲指令

  1. MRS
    ARM處理器中,只有MRS指令可以對狀態寄存器CPSR和SPSR進行讀操作。
    通過讀CPSR可以瞭解當前處理器的工作狀態。
    讀SPSR寄存器可以瞭解到進入異常前的處理器狀態。
    指令格式如下:
		MRS{cond}    Rd, psr
		psr: CPSR或SPSR
  1. MSR
    ARM處理器中,只有MSR指令可以對狀態寄存器CPSR和SPSR進行寫操作。
    與MRS配合使用,可以實現對CPSR或SPSR寄存器的讀-修改-寫操作,
    可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。
	MSR指令格式1 	MSR{cond}    psr_fields,#immed_8r
	MSR指令格式2	MSR{cond}    psr_fields,Rm
psr: 		CPSR或SPSR
fields: 	指定傳送的區域,可以爲以下字母(必須小寫)的一個或者組合:
			c  控制域屏蔽字節(psr[7..0])
			x  擴展域屏蔽字節(psr[15..8])
			s  狀態域屏蔽字節(psr[23..16])
			f  標誌域屏蔽字節(psr[31..24])	
immed_8r: 	要傳送到狀態寄存器指定域的 8 位圖立即數
Rm:			保存要傳送到狀態寄存器指定域數據的源寄存器

實例:

    mrs			r0, cpsr
	bic			r0, r0, #(1 << 7)
	msr			cpsr_c, r0

六、LOAD/STORE指令

    指令名	作用				示例
	LDR		加載字數據			ldr    	r6, data
	STR		存儲字數據			str		r8, [r5]
	LDRB	加載字節數據		ldrb    r3, [r1, r3]
	STRB	存儲字節數據		strb    r0, [r1,#0x20]
	LDRH	加載半字數據		ldrh   	r10,  [r0],	r6
	STRH	存儲半字數據		strh   	r10,  [r0],	r6
	LDRSB	加載有符號字節數據	ldrsb   r1, [lr,#0x40]
	LDRSH	加載有符號半字數據	ldrsb   r1, [lr,#0x40]

七、批量寄存器加載/存儲指令

多寄存器加載/存儲指令可以實現在一組寄存器和一塊連續的內存單元之間傳輸數據。
LDM爲加載多個寄存器;STM爲存儲多個寄存器。允許一條指令傳送16個寄存器的任何 子集或所有寄存器。它們主要用於現場保護、數據複製、常數傳遞等。
指令格式如下:

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

cond:指令執行的條件;
模式:控制地址的增長方式,一共有8種模式;
!:表示在操作結束後,將最後的地址寫回Rn中;
reglist :表示寄存器列表,可以包含多個寄存器,它們使用","隔開,如{R1,R2,R6-R9},寄存器由小到大排列;
模式:
多寄存器加載/存儲指令的8種模式如下表所示,右邊四種爲堆棧操作、左邊四種爲數據傳送操作。
數據塊傳送操作 | 堆棧操作
模式 說明 | 模式 說明
IA 每次傳送後地址加4 | FD 滿遞減堆棧
IB 每次傳送前地址加4 | ED 空遞減堆棧
DA 每次傳送後地址減4 | FA 滿遞增堆棧
DB 每次傳送前地址減4 | EA 空遞增堆棧

八、交換指令–SWP

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

指令格式如下:

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

其中,B爲可選後綴,若有B,則交換字節,否則交換32位字;
Rd用於保存從存儲器中讀入的數據;
Rm的數據用於存儲到存儲器中,若Rd與Rm相同,則爲寄存器與存儲器內容進行交換;
Rn爲要進行數據交換的存儲器地址,Rn不能與Rd和Rm相同。

九、協處理器指令

1.指令名 作用
CDP 協處理器數據操作指令

	示例:CDP p7,0,c0,c2,c3,0
LDC		協處理器數據讀取指令	
	示例:LDC  	p5,c2,[R1]
STC		協處理器數據寫入指令	
	示例:STC  	p5,c1,[R0]
MCR		ARM寄存器到協處理器的數據傳送指令
	示例:mcr   	p15, 0, r1, c1, c0, 0
MRC		協處理器到ARM寄存器的數據傳送指令
	示例:mrc   	p15, 0, r5, c0, c0, 0

2,實例:

    mov			r1, #0x12
	MCR 		p15, 0, r1, c1, c0, 0		; 寫入到協處理器	
	MRC 		p15, 0, r0, c1, c0, 0		; 讀出到寄存器
解析:
	Mrc p15,0,r1,c1,c0,0 
	從協處理器p15的c1和c0傳輸數據到ARM處理器的r1,其中操作碼10,操作碼20.

十、異常處理命令

SWI 軟件中斷
SWI		num

參數解析:
num: 是一個 24 位二制數, 稱爲中斷號, 處理器不解析這個號碼,
它由程序員來解析
SWI 指令是主動從用戶模式進入特權模式(管理模式)的唯一方法
實例:

if 0=1
	; 切換到用戶模式
	msr			cpsr_c, #0xd0
	swi			0x1234
endif
if 0=0
	; 解析軟件中斷號
	ldr			r0, [lr, #-4] 			; 取出中斷指令的機器碼
	bic			r0, r0, #0xff000000		; 去掉高 8, 得到中斷號
	; movs 的目的寄存器是 pc 時, 會自動將 spsr 的值存入 cpsr
	movs		pc, lr 					
	; 返回到中斷的地方並恢復中斷時的程序狀態	
	nop
endif

十一、僞指令

1.常用僞指令
    指令名	作用
    DCD	    分配一段字內存單元
    MACRO	宏定義的開始
    MEND	宏定義的結束
    ALIGN	添加補丁字節使當前位置滿足一定的對齊方式
    AREA	定義一個代碼段或數據段.
    END	    彙編源文件已結束
    ENTRY	程序的入口點
    NOP	    空操作
    EXPORT	定義一個代碼段或數據段.
    IMPORT	彙編源文件已結束
    INCLUDE	程序的入口點
2.宏的三種定義方法

格式:
宏定義:
MACRO
宏名 參數1, 參數2, …
宏體
MEND

宏調用:
宏名 參數1, 參數2, ...
    ;定義無參宏
    macro
    my_m1
    mov         r0, #0x12
    mend
    
    ;定義有參宏
    macro
    my_swap     $a, $b
    eor         $a, $a, $b
    eor         $b, $a, $b
    eor         $a, $a, $b
    mend
    
    ;帶標號的宏
    ;從a加到b
    macro
$lab    my_sum      $c, $a, $b
        mov         $c, #0  ;將c初始化爲0,
$lab
        add         $c, $c, $a
        add         $a, $a, #1
        cmp         $a, $b
        ble         $lab    ;若比較後不相等,則循環加
    mend

十二、乘法指令

    助記符	            說明             操作
MUL    R1,R2,R3	        32位乘法        R1=R2×R3
MLA    R1,R2,R3,R0	    32位乘加        R1=R2×R3+R0
UMULL  R0,R1,R5,R8	    64位無符號乘法  (R1、R0)=R5×R8
UMLAL  R0,R1,R5,R8  	64位無符號乘加  (R1、R0)=R5×R8+(R1、R0)
SMULL  R2,R3,R7,R6  	64位有符號乘法  (R3、R2)=R7×R6
SMLAL  R2,R3,R7,R6  	64位有符號乘加  (R3、R2)=R7×R6+(R3、R2)

十三、ARM異常處理機制

1、進入異常過程
1)將CPSR寄存器內容存入IRQ模式的SPSR寄存器中
2)修改CPSR寄存器:
    將I位設置爲1(禁止IRQ中)
    將T位設置爲0(進入ARM狀態)
    設置MOD位,切換處理器模式至IRQ模式
3)將下一條指令的地址存入IRQ模式的lr寄存器中
4)將跳轉地址存入PC,實現跳轉
2.退出異常過程
1)將SPSR寄存器的值複製回CPSR寄存器
2)將lr寄存器的值減去一個常量後複製到PC寄存器,跳轉到被中斷的用戶程序

十四、異常處理的7個種類(按優先級高—低)

名稱                異常向量表              
復位異常            Reset                   0x00  
數據中止異常        Data Abort              0x10
快速中斷異常        FIQ                     0x1c
中斷異常            IRQ                     0x18
預取址中止異常      Prefetch Abort          0x0c
SWI軟件中斷異常     Software Interrupt      0x08
未定義指令異常      Undefined Instruction   0x04

補充:

; 寄存器列表後的^的作用可以讓 SPSR 的值恢復到 CPSR 中
	ldmfd		sp!, {r0, r1, r12, pc}^	 

十五、基本編程規則

, 寄存器的使用規則及其命名規則
	1. 子程序間通過r0-r3來傳遞參數,記作A1-A4,子程序在返回前無須恢復這些寄存器
	2. 子程序中,使用r4-r11來保存局部變量,記作V1-V8,如果子程序中使用到了這些寄存器,那麼在進入子程序時,應該對這些寄存器進行入棧保護,在退出子程序前, 應該出棧恢復這些寄存器.在Thumb中只使用r4-r7.
	3. r12 用作過程調用中間臨時寄存器, 記作 IP.
	4. r13 用作堆棧指針, 記作 SP. 在子程序中不能將其用作其它用途. SP 在進入子程序時的值和退出子程序時的值必須相等.
	5. r14 稱爲連接寄存器,記作LR.用於保存子程序的返回地 址,如果在子程序中保存了返回地址, 則 r14 可用作其它用途.
	6. r15 是程序計數器, 記作 PC, 不能用作其它用途., 堆棧的使用規則
	1. 堆棧是滿遞減棧(FD).
	2. 如果彙編程序目標文件中包含了外部調用,則必須是8字節對齊的,並且在彙編程序中用 preserve8 僞指令表明本彙編程序數據是8字節對齊的., 參數的傳遞規則
	1. 參數個數不超過 4 個時, 通過 r0 - r3 來傳遞, 超過 4 個參數的, 其餘的參數通過棧來傳遞.
	2. 返回結果爲 32 位整數, 通過 r0 來返回; 返回結果爲 64 位整數, 通過 r0和 r1 來返回; 返回結果超過 64 位的, 通過內存來返回
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章