赞
踩
ARM 处理器简介
ARM(Advanced RISC Machines)是一个32位RISC(精简指令集)处理器架构,ARM处理器则是ARM架构下的微处理器。ARM处理器广泛的使用在许多嵌入式系统。ARM处理器的特点有指令长度固定,执行效率高,低成本等。
RISC 设计主要特点
ARM体系结构将存储器看作是从0地址开始的字节的线性组合。作为32位的微处理器,ARM体系结构所支持的
最大寻址空间为4GB。ARM体系结构可以用两种方法存储字数据,分别为大端模式和小端模式。
流水线的执行顺序:取指令->译码->执行->缓冲/数据->回写
影响流水线性能的因素:
LDR r1, [r2, #4]
ADD r0, r0, r1 // r1 的值要等待 LDR 的结果
寄存器组
ARM Cortex-A8 处理器有 40 个 32 位的寄存器;
每一种处理器模式有一组与之对应的寄存器组,如下对应方式:
通用寄存器 R0 - R7:
程序状态寄存器 CPSR(Current Program Status Register,当前程序状态寄存器),CPSR 可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位以及其他一些相关的控制和状态位。包含以下内容:
数据操作指令:
MOV AX,2000H;// 将 16 位数据 2000H 传送到 AX 寄存器
MOV AL,20H;// 将 8 位数据 20H 传送到 AL 寄存器
MOV AX,BX;// 将 BX 寄存器的 16 位数据传送到 AX 寄存器
MOV AL,[2000H];// 将 2000H 单元的内容传送到 AL 寄存器
MOVW // 把 16 位立即数放到寄存器的低16位,高16位清0
MOVT // 把 16 位立即数放到寄存器的高16位,低 16位不影响
movw r8, #19028 ; 0x4a54 // 把 0x4a5a 放到寄存器 r8 的低 16 位,r8 高 16位清零;
movt r8, #49456 ; 0xc130 // 把 0xc130 放到寄存器 r8 的高 16 位;
r8 = 0xc1304a54
AND R2,R1,R3 // R2 = R1 & R3
ANDS R0,R0,#0x01 // R0 = R0 & 0x01
SUB R0,R1,R2 // R0 = R1 – R2
SUB R0,R1,#256 // R0 = R1 -256
ADD R0,R1,R2 // R0 = R1 + R2
ADD R0,R1,#256 // R0 = R1 + 256
ADD R0,R2,LSL#1 // R0 = R2 + (R3 << 1)
BIC R0, R0, #0X1011 // 清除位 0/1/3
乘法指令
MUL R1,R2,R3 //R1 = R2 * R3
MOV R0,#0x0A
MLA R1,R2,R3,R0 // R1 = R2 * R3 + 10
Load/Store指令
LDR R1,[R0,#0x12] // 将 R0 +12 地址处的数据读出,保存到 R1 中;
LDR R1,[R0,R2] // 将 R0 + R2 地址的数据读出,保存到 R1 中;
LDR RD,[Rn],#0x04 // Rn 的值用作传输数据的基地址,在数据传送后,将偏移量0x04与Rn相加写回到RD中
LDR R0,[R1,LSL #3] // 将存储器地址为R1*8的字数据读入寄存器R0。
LDR R0,[R1,R2,LSL #2] // 将存储器地址为R1+R2*4的字数据读入寄存器R0。
LDR R0,[R1,R2,LSL #2]! // 将存储器地址为R1+R2*4的字数据读入寄存器R0,并将R1+R2*4的值存入R1。
STR R0,[R1],#8 // 将 R0 中的字数据写入以 R1 为地址的存储器中,并将新地址 R1+8 写入 R1。
STR R0,[R1,#8] // 将 R0 中的字数据写入以 R1+8 为地址的存储器中
STR R1, [R0] // 将 R1 寄存器的值,传送到地址值为 R0 的(存储器)内存中
跳转指令
状态操作指令
ARM 指令提供了两条如下指令,可直接控制程序状态寄存器(只有在特权模式下才能修改状态寄存器):
MRS R1, CPSR // 将 CPSR 状态寄存器读出,保存到R1中
MRS R2, SPSR
MSR CPSR_c,#0xD3 // CPSR[7:0] = 0xD3切换到管理模式
MSR CPSR_c,R3 // CPSR = R3
异常产生指令:
SWI 0 // 产生软中断,中断立即数为0
SWI 0x123456 // 产生软中断,中断立即数为0x123456
MOV R0,#0 // 送0到R0中
ADD R3,R3,#1 // R3的值加1
CMP R7,#1000 // R7的值和1000比较
BIC R9,R8,#0xff00 // 将R8中8~15位清0,结果保存在R9中
MOV R2,R0 // R0的值送R2
ADD R4,R3,R2 // R4 = R2 + R3
CMP R7,R8 // 比较R7和R8的值
ADD R2,R0,R1,LSR #5
MOV R1,R0,LSL #2
RSB R9,R5,R5,LSL #1
SUB R1,R2,R0,LSR #4
LDR R1,[R2] // 将R2的数值作为地址,取出地址中的数据保存到R1中
STR R1,[R2] // 将R2数值作为地址,取出R1中的值存入R2所指向的地址
LDR R1,[ R0,#0xf ] // 将 R0 的数值加 0x0f 作为地址,取出此地址的数值保存到 R1
STR R1,[R0,#-2] // 将 R0 的数值减 2 作为地址,将 R1 中的内容保存到此地址中
STR R1,[R0,+R2] // 将 R0 的值加上 R2 的值作为地址,把 R1 的内容保存到该地址
BL FUN1 //调用到FUN1的子程序
B LOOP //条件跳转到LOOP标号处
STMDA
STMDB
硬件中断&软件中断:
ARM处理器有七种类型的异常::
异常处理流程:
异常向量表
每一个异常发生时,总是从异常向量表开始跳转,所谓的异常向量表,是指由7个异常向量及其处理函数跳转
关系组成的表:
0x00000000: b reset
0x00000004: ldr pc, _undefined_instruction
0x00000008: ldr pc, _software_interrupt
0x00000008: ldr pc, _software_interrupt
0x0000000c: ldr pc, _prefetch_abort
0x00000010: ldr pc, _data_abort
0x00000014: ldr pc, _not_used //保留
0x00000018: ldr pc, _irq
0x0000001c: ldr pc, _fiq
当一个ARM异常返回时,需要完成如下任务:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。