目录
[☆nor flash](#☆nor flash)
[☆nand flash](#☆nand flash)
[☆b & bl & bx](#☆b & bl & bx)
[5.用b指令1-100求和 和 do while](#5.用b指令1-100求和 和 do while)
[6.用b指令1-100求和 while](#6.用b指令1-100求和 while)
ARM
ARM体系结构
精简指令集架构cpu
cpu内核:CISC、RISC
CISC&RISC
CISC:复杂指令集合计算机
- 芯片面积大,加工成本高,复杂,体积大,功耗大,28效益(80%情况下用到20%功能)
RISC:精简指令集合计算机
- 芯片面积小,加工成本低,体积小,功耗小(便携式设备)
ARM设计内核,半导体厂商生产芯片
☆ARM寄存器
通用寄存器
R0-R12
存放数据,没有地址
PC寄存器(R15)
程序计数器,本质是一个指针,指向当前代码正在执行的指令的下一条指令
lr寄存器(R14)
链接寄存器,保存函数的1个返回地址
SP寄存器(R13)
栈指针寄存器,用来管理栈区,指向栈顶
ALU寄存器
算术逻辑单元
CPSR寄存器
当前程序寄存器,保存程序运行到某一步的状态
SPSR寄存器
备份、保存程序状态,保存当异常发生时,CPSR程序中的一些状态
MMU(不是寄存器)
内存管理单元,虚拟内存,用于管理虚拟内存到物理内存的映射,从而提高物理内存的利用率
注:裸机必须关闭MMU;衡量一款芯片是否适合跑Linux(驱动)系统就是看这个芯片是否有MMU
Cache高速数据缓存(哈佛架构)
icache
指令缓存,存放指令
dcache
数据缓存,存放数据
冯诺依曼架构&哈佛架构
冯诺依曼架构:数据和指令存放到同一块内存空间
哈佛架构:数据和指令要单独存储
注意:裸机需要打开icache,关闭dcache
单总线
通过一根线/一组线与外设通信,和某个外设通信时,其他外设无法连接
双总线
AHB总线
先进高速总线(RAM,USB,网卡),接通信速率快的外设
APB总线
先进外设总线(GPIO,UART),接通信速率慢的外设
交叉编译
在一个平台上编写编译程序,能够在另一个平台运行程序
flash(ROM闪存)
☆nor flash
可以被寻址,每一个字节都可以被寻址
地址总线可以寻址
☆nand flash
无法被寻址,以固定块大小(512字节)写入或读取数据
memory(RAM内存)
三级存储结构

存储器的层次结构

计算机的组成
控制器、运算器、输入、输出、存储器
arm指令集:32bit
thumb指令集:16bit
处理器的工作模式(很重要)


程序状态寄存器

☆异常处理流程

汇编语言
mov指令

add指令

sub指令

ldr指令
1.向寄存器中加载一个非立即数
2.将RAM中的数据加载到寄存器中

str指令
将寄存器的数据写入指定的RAM中

bic指令
用于清0,将寄存器中的值某几位清0

orr指令
用于置1,将寄存器中的值某几位置1

b跳转指令

下面,这个指令相当于c语言中的while(1){}

☆b & bl & bx
- b指令在函数调用时,不会把返回地址保存到 lr 寄存器中
- bl指令在函数调用时,会把返回地址保存到 lr 寄存器中
- bx指令在函数调用时,相当于mov pc,lr,bx跳转到lr寄存器对应返回地址
mvn指令
按位取反
mvn r0,#0 和mov r0,#0xFFFFFFFF 得到的结果是相同的
mrs指令
读取某个特殊寄存器的值到通用寄存器
msr指令
将某个通用寄存器的值写入某个特殊寄存器
☆立即数的判断
1、这个数在0-0xFF之间
2、把这个数字转换为二进制,这个数的最高位1到最低位1之间的二进制序列位数不能超过8位
3、这个数的二进制序列凑够8位之后的右边必须为偶数个0
练习
1.两数相加

2.三个数找出最大值

3.用b指令进行两数找出最大值

4.用b指令三个数找出最大值

5.用b指令1-100求和 和 do while

6.用b指令1-100求和 while

7.函数调用

☆栈的分类
- 空增栈
- 空减栈
- 满增栈
- 满减栈
增栈:入栈时,sp指针向上移动
减栈:入栈时,ap指针向下移动
空栈:先写数据,再挪动指针
满栈:先挪动指针,再写数据
满减栈: *--sp,先让sp--,再写数据
调用之前要进行入栈保护
ARM内核中使用的是满减栈
☆汇编调用c语言传参时:
- 如果传的参数<=4个,可以通过通用寄存器r0-r3来进行传参
- 如果传的参数>4个,必须通过栈来进行传参,保护现场(入栈保护)、恢复现场(出栈恢复)
- c语言函数返回的结果保存到R0寄存器中
模式的切换(从SVC转换到user模式)
-
将cpsr寄存器中的值读到通用寄存器中R0
-
将R0寄存器中低5位的值先清0 (bic)
-
将R0寄存器中的低5位置设置为:10000 (orr)
-
将R0寄存器中的值回写到CPSR寄存器