ARM嵌入式学习--第一天(ARM核)

-ARM核介绍

    -CPU核

        CPU又叫中央处理器,其主要功能是进行算数运算逻辑运算,内部结构大概可以分为控制单元,算术逻辑单元和储存单元等几个部分

-ARM核

    工作模式:

user mode:用户模式是用户程序的工作模式,他运行在操作系统的用户态,没有权限去操作其他硬件资源,只能执行自己的数据,也不能切换到其他模式下,想要访问硬件只能通过软中断产生异常 

system mode:系统模式是特权模式,不受用户模式的限制,用户模式与系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源

IRQ mode:IRQ模式是采用IRQ中断的默认模式一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统资源

FIQ mode:FIQ模式是采用FIQ中断的默认模式快速中断模式是相对与一般中断模式而言的,它是用来处理时间相对比较紧急的中断请求,主要用于高速数据传输及通道处理

-ARM核的寄存器资源

    寄存器是中央处理器内的组成部分,寄存器是有限存贮容量的高速存贮部件,它们可以用来暂存指令、数据和地址,在中央处理器的控制部件中,包含的寄存器有指令寄存器IR)和程序计数器(PC)

寄存器用途分析

    R0 -R10用来存放用户的数据

    R11(fp用来记录一个栈空间的开始地址

    R12(ip用来临时存储sp

    R13(sp栈指针寄存器

    R14(lr在发生跳转的时候,用来保存PC寄存器的值

    R15(pc):用来存放CPU需要执行的指令所在内存的地址

CPSR    

 mode[0:4]记录当前ARM核所在的模式

 TARM状态执行32bit指令),thumb状态执行16bit指令

 FFIQ禁止(1)使能(0)

 IIRQ禁止(1)使能(0)

 N计算的结果为负数,则置1

 Z计算的结果为,则置1

 C产生进位则置1产生借位则置0

 V超过一个范围溢出

SPSR异常产生的时候,用来保存CPSR的值

-ARM指令格式

立即数

    立即数为一个常数,该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到该数,该数为合法立即数 ;在指令中表示方法:#数字,例如#100

快速判定是否为合法立即数:

    1.首先将这个数转换为32bit的16进制形式

    2.除零外,仅有一位数为合法立即数

    3.除零外,仅有二位数,并且相邻(包括首尾,例如0x1000000A)的为合法立即数

    4.除零外,仅有三位数,并且相邻(包括中间有0相间,例如0x10800000;包括首尾相邻,例如0x14000003),这三位数中,最高位取值仅能为1,2,3最低位取值仅能为4,8,C,中间位任意,这种组合为合法立即数 

寄存器移位

    将寄存器值读取之后,进行移位运算后,作为操作2参与运算,支持的移位方式如下:

        1.LSL逻辑左移

        2.LSR逻辑右移

-常用ARM核指令

数据传送指令
MOV指令

    格式:mov  目标寄存器,操作数2

    功能:将操作2的值赋值给目标寄存器

MVN指令

    格式:mvn  目标寄存器,操作数2

    功能:将操作2取反的值给目标寄存器

LDR指令

    格式:ldr  目标寄存器,=数据

    功能:完成任意的数据传送到目标寄存器

    注意:数据前面不能加#因为此时数据不按立即数来处理

数据计算指令
ADD指令

    格式:add  目标寄存器,操作数1,操作数2

    功能:将操作数1加上操作数2的结果给目标寄存器

SUB指令

    格式:sub  目标寄存器,操作数1,操作数2

    功能:将操作数1减去操作数2的结果给目标寄存器

    注意:如果值为负数会影响到CPSR寄存器的N

MUL指令

    格式:mul  目标寄存器,操作1,操作2

    功能:将操作数1乘以操作数2的结果存放在目标寄存器

    注意:操作数1和操作数2必须都是寄存器,并且操作数1的寄存器编号不能和目标寄存器一样

位运算
AND指令

    格式:and  目标寄存器,操作数1,操作数2

    功能:将操作数1按位与操作数2的结果存放在目标寄存器

ORR指令

    格式:orr  目标寄存器,操作数1,操作数2

    功能:将操作数1按位或操作数2的结果存放在目标寄存器

EOR指令

    格式:eor  目标寄存器,操作数1,操作数2

    功能:将操作数1按位异或操作数2的结果存放在目标寄存器

BIC指令(位清零操作)

    格式:bic  目标寄存器,操作数1,操作数2

    功能:将操作数1按位与操作数2取反的结果存放在目标寄存器

    注意:目标寄存器=操作数1&~操作数2

比较指令--CMP指令

    格式:cmp  寄存器,操作数2

    功能:将寄存器的值与操作数2比较比较的结果会自动影响CPSR的NZCV

跳转指令--B/BL指令

    格式:B/BL  标签

    功能:跳转到一个指定的标签,BL跳转之前,将跳转前的PC的值保存在LR,跳转范围+/-32M

给PC赋值

    格式:ldr  pc,=标签名

    功能:将pc指针指向标签表示的地址

 内存访问指令

单个数据访问(LDR,STR)

    格式:ldr  r0,[r1]    //r0=*r1

    功能:将内存中的值加载到寄存器读内存

    格式:str  r0,[r1]    //*r1=r0

    功能:将寄存器的内容写入内存写内存

 基址变址寻址

        将基地址寄存器加上指令中给出的偏移量,得到数据存放的地址

前索引

    格式:str  r0,[r1,#4]    //*(r1+4)=r0

后索引

    格式:str  r0,[r1],#4    //*r1=r0 && r1=r1+4 

自动索引

    格式:str  r0,[r1,#4]!    //*(r1+4)=r0 && r1=r1+4

多个数据访问(LDM,STM)

    格式:stm/ldm{条件}  r1!,{r5-r7}

    功能:ldm将一块内存的数据,加载到多个寄存器中

               stm将多个寄存器的值,存储到一块内存中

栈操作指令

    进栈:stmfd  sp!,{寄存器列表}

    出栈:ldmfd  sp!,{寄存器列表}

    注意:在对栈操作之前,必须设置sp的值,进栈和出栈的方式一样,ATPCS标准规定向下增长长满减栈

CPSR/SPSR操作指令

    读操作:mrs  寄存器,cpsr/spsr

    写操作:msr  cpsr/spsr,寄存器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值