ARM基础知识

写在前面:
由于日常学习中会经常遇到这些比较典型的问题,在此做一个总结和记录,方便以后查阅。

1 存储结构

图片来源:https://www.cnblogs.com/douzi2/p/4876551.html

  • 哈弗结构
    程序指令存储和数据存储分开的存储器结构。其特点是,CPU在访问程序存储器的同时,可通过独立的总线对数据存储器进行读写操作,与冯诺依曼结构相比,哈弗结构具有更宽的数据带宽,大大提高了CPU的工作速度。
    在这里插入图片描述

  • 冯·诺依曼结构
    程序指令存储和数据存储合并的存储器结构。其特点是,在执行指令时,必须从存储器中取出指令解码,在取出操作数执行运算,在高速运算时,容易出现瓶颈效应。
    在这里插入图片描述
    首先,通过BIOS(Uboot)将硬盘(Flash)中的程序(数据和代码),全部拷贝到RAM。所以此时RAM内部会分为多个段——代码段,date段,bss段等等。这样相比哈佛结构,就节省了一套外部的数据总线和地址总线。但是这样也会带来的坏处——速度变慢了。

  • 混合结构
    在这里插入图片描述
    这种结构就是目前ARM的结构,引入了cache将两种存储结构结合起来。其中,芯片内部的cache,表示高速缓存,icache用来缓存指令, dcache用来缓存数据。在芯片内部CPU与cache之间采用哈弗结构连接,在芯片外部SOC与RAM之间采用冯诺依曼结构连接。

2 指令系统

  • CISC (complex instruction set computer,复杂指令集计算机)
  • RISC (reduced instruction set computer精简指令集计算机) (多数嵌入式处理器采用)

3 工作模式(7种)

  • 用户模式(usr):ARM处理器正常的执行状态,大部分任务执行在这种模式
  • FIQ 快速中断模式:当一个高优先级中断产生时进入这种模式
  • IRQ 外部中断模式:当一个低优先级中断产生时进入这种模式
  • 管理模式(svc):复位和软件中断时进入,供操作系统使用的一种保护模式
  • 中止模式(abt):当存取异常时进入这种模式
  • 未定义模式(und):当执行未定义指令时进入这种模式
  • 系统模式(sys):供需要访问系统资源的操作系统任务使用

4 工作状态(2种)

  • ARM状态:执行32位的、字对齐的ARM指令
  • Thumb状态:执行16位的、半字对齐的Thumb指令

5 寄存器组织(ARM状态下)

在这里插入图片描述

6 异常

  • 支持的异常类型
    复位、未定义指令、软件中断、指令预取中断、数据中止、IRQ、FIQ
  • 对异常的响应
    (1)将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。
    (2)将CPSR复制到SPSR中
    (3)根据异常的类型,强制设置CPSR的运行模式位
    (4)强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处
  • 从异常返回
    (1)将链接寄存器LR的值减去相应的偏移量后送入到PC中
    (2)将SPSR复制回CPSR
    (3)如果在中断时设置了中断禁止位,清除

7 ARM处理器的寻址方式

  • 寄存器寻址
    SUB R0,R1,R2 ; R1 - R2 --> R0

  • 立即数寻址
    MOV R0, #0XFF00
    SUBS R0, R0, #1

  • 寄存器偏移寻址
    MOV R0, R2, LSL #3
    ANDS R1, R1, R2, LSL R3
    ADD R0, R1, R2, LSR #2
    NOTE:
    LSL:逻辑左移 低位补0
    LSR:逻辑右移 高位补0
    ASL:算术左移 低位补0 (等价于LSL)
    ASR:算术右移 移位过程中符号位保持不变 如果源操作数为正数则高位补0 否则补1
    ROR:循环右移 移出补空出
    RRX:带扩展的循环右移 操作数右移一位 高端空出用原标志位填充

  • 寄存器间接寻址
    LDR R0, [R1] 将以 R1 的值为地址的存储单元中的内容加载到 R0 中
    STR R0, [R1] 将 R0 的内容存入以 R1 的值为地址的存储单元
    R1 — 基址寄存器,R1中的内容 — 基地址

  • 基址寻址
    将基址寄存器的内容与偏移量进行操作,形成操作数的有效地址
    LDR R0, [R1, #0x01]; 将 R1 中的数值加0x01作为地址,将此地址中的值保存在R0中
    STR R0, [R1, #-1]; 将 R0 的内容存入以 R1 的值减1为地址的存储单元中
    LDR R0, [R1, #0x01] !; R0 <-- mem32[ R1+1 ], R1<--R1+1 !表示更新基址寄存器

  • 多寄存器寻址
    多寄存器寻址就是一次性传送多个寄存器的值
    LDMIA R1!, {R2-R7,R12} 将R1单元中的数据读出到R2-R7,R12并且R1自动加1
    STMIA R0!, {R3-R5,R10} 将R3-R5, R10中的值保存到R0所指向的地址,R0自动加1
    NOTE:寄存器子集的顺序由小到大的顺序排列,连续的用 - ,不连续用逗号隔开

  • 堆栈寻址

  • 块复制寻址

  • 相对寻址
    相对寻址是基址寻址的一种变通,由程序寄存器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。

	BL	ROUTE1
	BEQ	LOOP
	...
LOOP 
	MOV R2, #2
	ROUTE1
	...
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值