大学的时候学习过一段时间汇编,现在出来工作发现还需要捡起这些东西重新去学习,接下这一段时间先集中整理ARM的基础知识,然后扩展到ARMv8学习64位框架,然后学习MMU,学习它的中断处理方式;这篇文章以基础为主学习ARM寄存器;
寄存器分类
ARM也可以理解成一个芯片,它也有自己的寄存器,实现与memory之间的数据传递; ARM处理器共有37个寄存器,其中包括:
i. 31个通用寄存器,包括程序计数器(PC)在内。都是32位寄存器
ii. 6个状态寄存器,都是32位寄存器;
下面位arm 的6中模式所对应的寄存器:
ARM处理器有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。在所有的寄存器中,有些是各模式共用的同一个物理寄存器,有些是各模式自己拥有的独立的物理寄存器。
简单介绍下ARM处理器模式:
用户模式(User): ARM处理器正常的程序执行状态;
快速中断模式(FIQ): 用于高速数据传输或通道处理;
外部中断模式(IRQ): 用于通用的中断处理;
管理模式(Supervisor): 操作系统使用的保护模式;
数据访问终止模式(Abort): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护;
系统模式(System): 运行具有特权的操作系统任务;
未定义指令中止模式(Undifined):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真;
通用寄存器可以分为3类:未备份寄存器(R0~R7)、备份寄存器(R8~R14)和程序计数器PC(R15)。对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。应备份寄存器R8~R12来说,每个寄存器对应两个不同的物理寄存器(中断模式和非中断模式);
特殊寄存器
下面依次介绍几个特殊寄存器:
- PC(程序计数器) R15 = windows 中 EIP
处理器要执行的程序(指令序列)都是以二进制代码序列方式预存储在计算机的存储器中,处理器将这些代码逐条地取到处理器中再译码、执行,以完成整个程序的执行。为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条取指指令的地址.程序计数器(PC)正是起到这种作用,所以通常又称之为‘指令计数器’;
因为ARM采用流水线机制,当正确读取PC值得时候,该值为当前指令地址加八个字节,也就是指向当前指令下两个条指令的地址;PC的第0位和第1为始终为0;
backtrace:
#00 pc 00000988 /system/vendor/lib/libcancer.so (_ZN7android6Cancer15destroyInstanceEv+39)
//#00 pc表示异常发生时的PC值在库函数里的偏移;
#01 pc 0001db9d /system/vendor/lib/libcam.client.so (_ZN7android15NSDisplayClient13DisplayClient4initEv+60)
//#01 pc表示在DisplayClient4initEv函数调用下一个函数接口在库函数里里的偏移;
#02 pc 0000d145 /system/vendor/lib/libcam.device1.so (_ZN7android14Cam1DeviceBase17initDisplayClientEP18preview_stream_ops+684)
2.栈指针寄存器 SP (寄存器 R13)
ARM处理器中通常将寄存器R13作为栈指针(SP)。ARM处理器针对不同的模式,共有 6 个栈指针(SP),其中用户模式和系统模式共用一个SP,每种异常模式都有各自专用的R13寄存器(SP)。它们通常指向各模式所对应的专用栈,也就是ARM处理器允许用户程序有六个不同的栈空间,ARM处理器中的R13被用作SP。当不使用堆栈时,R13 也可以用做通用数据寄存器.
3.R14称为子程序链接寄存器LR(Link Register)
当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份.在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值复制给R14,执行完子程序后,又将R14的值复制回PC,即可完成子程序的调用返回。以上的描述可用指令完成。
i. 每一种处理器模式自己的物理R14中存放当前子程序的返回地址。当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。
ii. 当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与子程序返回方式基本相同。
00000764 <func1>:
764: b082 sub sp, #8
766: 2002 movs r0, #2
768: 9001 str r0, [sp, #4]
76a: b002 add sp, #8
76c: 4770 bx lr //返回地址
4.PSR 寄存器(状态寄存器)
CPSR(当前程序状态寄存器)它包含了条件标志位,中断禁止位,当前处理器模式标志以及一些控制和状态位,SPSR 备份程序状态寄存器,当特定的异常中断模式发生时。这个寄存器存放当前程序状态寄存器的内容,异常中断程序退出时候,可以用SPSR来恢复CPSR,由于用户模式和系统模式不是异常中断模式,所以没有SPSR;
高4位(28-31):条件标志位(Condition code flags): N,Z,C,V. 这些位可以通过逻辑或者算术操作, 或者 MSR 和 LDM 指令来操作. 处理器会测试这些标志位,以确定是否操作一些指令.
- N: 负数 ? 1 : 0
- Z: 运算结果为0 ? 1 : 0
- C: 进位标志.(4中情况)
1. 加法指令(包括CMN): 当结果产生了进位,则为1,表示无符号数运算发生溢出;
2. 减法指令(包括CMP): 当运算中发生了错位,为1, 表示运算发生下溢出;
3. 对已在操作数中包含移位操作的运算指令,C被置为被移位寄存器最后移出去的位;
4. 对于其他非加/减的运算指令,c一般不收影响;
- V: 溢出标志位: 对于加减法,当操作数和运算结果都是以二进制的补码表示的带符号的数,切运算结果超出了有符号运算的范围溢出,V=1.
低8位(0-7):当发生异常时, 这些为的值将发生相应的变化.在特权模式下,也可以通过软件来修改这些位.用的比较多.
1. *中断禁止位* (I=1, IRQ禁止; F=1, FIQ禁止).
2. *状态控制位* (T=0, 处于ARM状态,即可执行32的ARM指令, 否则处于Thumb状态).
3. *模式控制位* ( M[4:0],这5位组合控制处理器处于什么工作模式)
参考书籍
ARM体系结构编程 - 杜春雷