📄 arm.txt
字号:
Chapter 1 ARM概述
处理器模式
用户模式(User,usr) 正常程序执行的模式
快速中断模式(FIQ,fiq) 高速数据传输和通道处理
外部中断模式(IRQ,irq) 用户通常的中断处理
特权模式(SUPERVISOR,sve) OS使用的一种保护模式
数据访问中止模式(ABORT,abt) 用户虚拟存储和存储保护
未定义指令模式(Undefined,und) 用于通过软件支持硬件协处理器
系统模式(System,sys) 运行特权级的操作系统任务
寄存器介绍
ARM处理器一共有37个寄存器
31个通用寄存器 32bit
6个状态寄存器 32bit
每一种处理器模式都包含一组相应的寄存器,任意时刻有15个寄存器(R0-R14),1 or 2个状态寄存器,1 个PC 可见.
通用寄存器
未备份寄存器(unbanked register):
R0-R7 所有的处理器模式都使用同一个处理器,模式切换时有可能造成数据破坏
没有任何特殊用途,随意使用
备份寄存器(banked register)
R8-R12 每一个寄存器对应2个物理寄存器(还一个专用于快速中断模式)
R13R14 每一个寄存器对应6个物理寄存器(usr and sys 共用一个,其他每个模式都有专用)
R13通常用来保存栈指针
R14 = 链接寄存器 = LR
每一种处理器模式的R14一般用来存放当前子程序的返回地址
当通过BL或BLX调用子程序时,R14被置成该子程序的返回地址,在子程序中,当把R14复制到PC中时,程序即返回.
当异常中断发生时,该模式的R14被置为该模式将要返回的地址,对于有些模式,R14的值可能与将返回的地址有一
个常数偏移值.
R14也可以作为通用寄存器使用.
程序计数器PC=R15
PC值 = 当前指令地址 + 8BYTE = 当前指令的下两条指令的地址(字对齐,bit0 and bit1总是为0);
有关R15注意事项的讨论:
<-待补->
程序状态寄存器
CPSR 当前程序状态寄存器,任何模式下都可以访问.
CPSR格式 _____________________________________________
31|30|29|28|27| 26 |7|6|5|4 |3 |2 |1 |0 |
N |Z |C |V |Q |DNM(RAZ)|I|F|T|M4|M3|M2|M1|M0|
条件标志位 N(negative) Z(zero) C(carry) V(overflow)
N 补码表示的有符号数晕眩时,N=1表示结果为负,N=0表示结果为正或者0;
Z =1表示运算结果为0,=1表示结果为负
C =1 加法指令中上溢出,减法指令中下溢出,移位指令中最后一次溢出位的数值
V 符号位溢出
Q标志位 DSP指令是否发生溢出(ARMv5以上)
控制位 低8位I,F,T,M[4:0],异常中断时这些位才发生变化,特权级模式下,软件可以修改
这些位.
中断禁止位 I=1时,禁止IRQ中断,F=1时,禁止FIQ中断.
T控制位 =0表示执行ARM指令,=1表示执行Thumb指令.(ARM版本相关)
M控制位 控制处理器模式
0b10000 = User
0b10001 = FIQ
0b10010 = IRQ
0b10011 = Supervisor
0b10111 = Abort
0b11011 = Undifined
0b11111 = System
CPSR其他位 未定义,用于扩展.
ARM中异常中断的种类
复位 处理器复位引脚有效时产生复位中断,程序跳转到复位中断处理程序执行.
未定义指令 处理器或者协处理器认为当前指令未定义时产生该中断,可用来仿真浮点向量运算.
软件中断 用户自定义的中断,usr下调用特权级指令,RTOS中可实现系统功能调用.
指令预取中止 处理器预取指令地址不存在或者该地址不允许访问.
数据访问中止 数据地址不存在或者不允许访问
外部请求中断 处理器外部中断引脚有效,CPSR的I位置0时产生该中断,系统外设使用该中断请求
处理器服务.
快速请求中断 处理器外部快速请求中断引脚有效,CPSR的F位置0时产生该中断.
异常中断的相应过程
保存处理器当前的状态 copy CPSR -> SPSR_<MODE>
设置CPSR中相应的位
将LR_<MODE>设置成返回地址
PC设置成该异常中断的中断向量地址.
从中断中返回
copy SPSR_<MODE> -> CPSR
copy LR_<MODE> -> PC
复位中断部需要返回.
ARM体系的存储空间
使用单一平板地址空间,大小为2^32BYTE.
地址空间可以看作2^30个32bit的单元,这些单元的地址可以被4整除,低2位为0b00.地址address的数据包括
address+0 address+1 address+2 address+3四个BYTE的数据.
地址空间也可以看作2^31个16bit的单元...(ARMv4以上)
Notice:字 = 32bit,半字 = 16bit,字节 = 8bit.
存储器格式
略
非对齐的存储访问操作
<-待补->
指令预取和自修改代码
<-待补->
Chapter 2 ARM指令分类及其寻址方式
ARM指令的分类 跳转,数据处理,PSR传输,Load/Store,协处理器指令和异常中断产生指令
编码格式 ______________________________________________________
|31 28|27 25|24 21|20|19 16|15 12|11 8|7 0 |
|cond |0 0 1 |opcode|S | Rn | Rd |shifter_operand|
语法格式 <opcode>{<cond>}{S} <Rd>,<Rn>,<shifter_operand>
opcode 指令助记符
cond 指令执行的条件
S 是否影响CPSR值
Rd 目标寄存器
Rn 第一个操作数的寄存器
shifter_operand 第二个操作数
ARM指令的条件码域
<-待补->
数据处理指令的操作数寻址方式
立即数方式 每个立即数由一个8bit的常数循环右移偶数位得到,循环右移的位数由一个四位的
二进制数的两倍表示.
<immediate> = imm_8 >> (2 * rotate_imm)
if <immediate> between 0,0xFF,imm_8 = <immediate>,rotate_imm = 0
or 汇编编译器选择使rotate_imm最小的编码方式.
寄存器方式 略
寄存器移位方式 略
字及无符号字节的Load/Store指令寻址方式
Chapter 3 ARM指令集介绍
<-待补->
Chapter 4 ARM汇编语言程序设计
符号定义伪操作
GBLA GBLL GBLS 声明全局变量并将其初始化
LCLA LCLL LCLS 声明局部变量并将其初始化
SETA SETL SETS 给变量赋值
RLIST 为通用寄存器列表定义名称
CN 为协处理器的寄存器定义名称
CP 为协处理器定义名称
DN SN 为VFP的寄存器定义名称
FN 为FPA的浮点寄存器定义名称
数据定义伪操作
LTORG 声明一个数据缓冲池(literal pool)的开始
MAP 定义一个结构化的内存表的首地址
FIELD 结构化内存表中的一个数据域
SPACE 分配一块内存单元并用0初始化
DCB 分配一段字节内存单元,并用指定的值初始化
DCD,DCDU 分配一段字的内存单元并用指定的值初始化
DCDO 分配一段字的内存单,并将单个单元的内容初始化成该单元相对于静态基址寄存器的偏移量
DCFD,DCFDU 分配一段双字的内存单,用双精度浮点数据初始化
DCFS,DCFSU 分配一段字的内存单,用单精度浮点数据初始化
DCI 分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存储的是代码而不是数据
DCQ,DCQU 分配一段双字的内存单元并用64bit的数据初始化
DCW,DCWU 分配一段半字的内存单元并用指定的数据初始化
DATA 在代码段中使用数据.(不推荐使用)
汇编控制伪操作
<-待补->
其他伪操作
<-待补->
ARM汇编语言伪指令
ADR 将基于PC的地址值或基于寄存器的地址值读取到寄存器中.
ADRL 同上,读取的地址范围更大.
LDR 将一个32位的常数或者地址值读入寄存器
NOP 空操作
ARM汇编语言格式
<-待补->
ARM汇编语言程序格式
<-待补->
Chapter 5 ARM存储体系
ARM中用于存储管理的协处理器CP15
访问CP15寄存器的指令
MCR ARM Registers -> CP15 Registers Data Transport
MRC CP15 Registers -> ARM Registers Data Transport
MCR and MRC only for System mode.if you want to access CP15's Register in User
mode,you'd better use SWI call which defined by OS.
CP15's Registers
No. Basic in MMU in PU
0 ID(Read) ID&Cache Type
1 控制位 各种控制位
2 存储保护和控制 地址转换表基地址 Cachability控制位
....
存储管理单元MMU
<-待补->
MMU中的地址变换过程
<-待补->
快表的操作
<-待补->
高速缓冲以及写缓冲区
<-待补->
快速上下文切换
<-待补->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -