【ARM】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 位的, 通过内存来返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值