ARM基础学习-寄存器

大学的时候学习过一段时间汇编,现在出来工作发现还需要捡起这些东西重新去学习,接下这一段时间先集中整理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来说,每个寄存器对应两个不同的物理寄存器(中断模式和非中断模式);

特殊寄存器

下面依次介绍几个特殊寄存器:

  1. 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体系结构编程 - 杜春雷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章