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