ARMv7架构学习

本文参考至ARM的官方手册
ARM® Architecture Reference Manual
ARMv7-A and ARMv7-R edition

0.ARM概念

ARM(Advanced RISC Machines)是一种32位微处理器体系结构,当前被广泛应用于消费电子、无线通信、工业控制和手持设备等领域。
ARM公司是专门做RISC芯片设计开发的公司,作为知识产权供应商,ARM本身并不直接从事芯片生产,而是转让设计许可,由合作公司生产各具特色的芯片。

1.ARM的基本设定

ARMv7 采用的是32位架构

  • Byte: 8 bits
  • Halfword: 16bits(2 byte)
  • Word: 32 bits(4 byte)

ARM core提供:

  • ARM指令集(32 bits)
  • Thumb 指令集(16bits),thumb指令集是由于原来内存很贵,为了节省memory就用16bits方式来开发,现在已经基本不这么用了
  • Thumb2 指令集(16&32bits),M系列的可能还有用thumb2模式来开发的,还是为了节约成本

2.ARM处理器的工作模式

1.有哪些模式

在官方手册上看到,有这么一些模式,但实际上有些模式是在特定情况下才能存在的,比如Monitor、Hyp模式,我们这里只选择基本工作模式来分析:
在这里插入图片描述
同时我们能看到有一栏是权限栏(privilege level),这些PL0、PL1、PL2的定义是:
在这里插入图片描述
所以我们可以总结下ARM的工作模式
在这里插入图片描述
在这里插入图片描述

2.设置这些模式的原因

设置这些模式的原因还是为了能够适配软件操作系统,因为软件操作系统提出了 userspace和kernelspace,因此硬件的设计考虑了软件的需要。

3.ARM寄存器介绍

ARMv7一共有37个寄存器,如下图所示:
在这里插入图片描述
user模式下一共有r0~r15加上cpsr,17个寄存器,FIQ模式下灰色部分是自己的,即r8 ~ r14和spsr寄存器是自己的,其他的是usermode的,以此类推;

1.通用寄存器

在这里插入图片描述
r0 ~ r12是通用寄存器,就是计算的时候会用到,没有特殊的含义

2.SP/LR/PC特殊寄存器

SP是堆栈指针寄存器,用于保护现场,存储上下文的信息
LR是返回寄存器,存储一些返回地址的信息
PC是程序运行计数器,往pc里写值,将会导致跳转到该地址

3.CPSR/SPSR寄存器

CPSR是当前程序的状态寄存器,里面存储着很多信息,包括当前的指令模式(是thumb还是arm),以及当前的处理器模式(user/fiq/…)

在这里插入图片描述
在这里插入图片描述
SPSR全程是 saved program status reg,它的目的就是作为CPSR的一份备份,那备份这个有什么用呢,文档里说了就是为了一旦异常发生,能够用到这个备份的值
在这里插入图片描述

4.常用汇编指令

1.指令和伪指令

  • 指令:CPU机器指令的助记符,经过编译之后会得到机器码,CPU通过读取这些机器码然后执行相应的动作;
  • 伪指令:本质上并不是指令,只是指导编译的过程,最终也不会生成机器码;
    所以两者的差异在于是否是指令,以及最后编译完成是否会生成机器码

2.ARM汇编指令特点

1.LDR/STR架构

  • ARM采用RISC架构,CPU本身并不能直接读取内存,而需要将内存中的内容加载到CPU的通用寄存器中才能被CPU所处理
  • LDR(load register),指令将内存内容加载到通用寄存器中;由mem[address] -> 寄存器

LDR 目的寄存器,源
ldr r0, [r1] //将存储器地址为r1的字数据读入到寄存器r0中
ldr r0, [r1+r2] //将存储器地址为r1+r2的字数据读入到寄存器r0中

  • LDR伪指令,伪指令装载一个32bit常数或者一个地址到寄存器

LDR {cond}{.w} register, =[expr | label-expr]
cond:代表条件,w代表位宽,register表示目的寄存器,expr:32位常量,label-expr:标号
ldr r0,=0x1 //将常数0x1读取到r0寄存器中
ldr r0,=label //将label标号地址读取到r0寄存器中

  • STR(store register),指令将寄存器内容存入到内存空间中;由寄存器 -> mem[address]

STR 源寄存器,<存储器地址>
str r0, [r1] //将r0寄存器中的数据写入到以r1为地址的存储器中

2.寻址方式

mov寻址方式
mov {目的} {源},mov用于数据在寄存器之间的移动

  • 寄存器寻址, mov r1,r2 //该条指令的意思就是 将r2寄存器中的值取出来,放到r1寄存器中;
  • 立即寻址,mov r0,#0xFFFF, 0xFFFF就是一个实际的数据,将数据直接放到r0寄存器中;
  • 寄存器移位寻址, mov r0, r1, lsl #3 //lsl代表逻辑左移,#3代表3位,因此就是r1里的内容左移3位,然后再放到r0寄存器中;

ldr寻址方式
ldr {目的} {源},ldr用于将内存中的数据加载到寄存器中

  • ldr r1,=0xFF //将0xFF给到r1寄存器
  • ldr r1,0xFF000000 //将内存中地址为0xFF00 0000的内容载入到r1寄存器
  • ldr r1,[r0] //从r0中的数所指向的地址中,取出一个字的数据,传输到r1

3.条件后缀

同一指令附带不同的后缀,变成不同的指令,常用后缀包括:

  • B(byte),功能不变,操作长度变为8位;
  • H(half word),功能不变,长度变为16位;
  • S(signed),功能不变,操作数变为有符号

4.多级指令流水线

可查看写的另一篇流水线相关的文章,ARM流水线
为了增加处理器指令流的速度,ARM使用了多级流水,下图是3级流水的示意图:
在这里插入图片描述
核心:
PC指向正在被取值的指令,而非正在执行的指令;

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值