概述
什么是寄存器:
寄存器是CPU内部的存储器,没有地址。寄存器用于暂时存放参与运算的数据和运算结果。寄存器包括通用寄存器、专用寄存器、控制寄存器。
- 通用寄存器:可以存取的数据不受限制 ,什么都可以存。
- 专用寄存器:存放的数据有特殊含义,比如PC,IR
- 控制寄存器:存放的是CPU的控制信息,比如存储控制CPU模式的寄存器。
C语言与寄存器:
C语言中可以使用register来修饰变量,使得该变量存入到寄存器中。此时该变量不能通过&取地址进行操作,因为寄存器没有地址;该变量的类型也不能为浮点型,只能为整型,因为寄存器只能处理整型数据;该变量也不能是全局变量,只能是局部变量,这时C语言的规定,为了防止过多寄存器被占用。
CPU计算c = a+b的过程:
当CPU计算a+b时,需要经过以下步骤:
- 从内存中获取a,b的值并放入寄存器中
- 寄存器的数据通过运算器计算出结果,并放入另一个寄存器中
- CPU将运算结果写回内存
ARM寄存器
ARM寄存器与ARM模式:
ARM共有40个寄存器,不同的模式下,能够使用的寄存器也不同。下图列出了8种工作模式下可使用的寄存器,该表的查看方式如下:
- 第一行的 "System and User、FIQ...." 这些内容代表模式。
- 按列查看可使用的寄存器名称,例如System and User这两个模式下,只能使用r0~r15和CPSR这些寄存器
- 左下角棕色三角的标志代表只有在指定模式下可用,比如FIQ列的r8_fiq,这代表r8_fiq只有在FIQ模式下可用。对于r0这种没有棕色三角的,则代表各种模式下都可使用。
专用寄存器:
专用寄存器是存放特殊数据的寄存器,有PC、LR、SP等
- PC(R15):
程序计数器,用于存储当前取址指令的地址。PC值是一个动态变化的值,当执行完ARM指令后,PC会自动+4;也可以使用汇编指令直接修改PC的值。
对于ARM指令,使用汇编指令设置PC,该值的低2位被强制置零,具体原因参考博文 "2.ARM_ARM是什么" - "ARM概述" - "4、ARM存储模型" - "4.2 指令存储"。博文链接如下:
- LR(R14)
链接寄存器,该寄存器主要用于 "程序的跳转和返回" 与 "产生异常" 这两种情况。
当LR用于 "程序的跳转和返回" 的功能时,LR会自动保存跳转指令的下一条指令的地址,当程序需要返回时,会将LR的值复制到PC,从而实现程序的返回。
当LR用于 "产生异常" 时的功能时,LR会自动保存被异常打断的指令的下一条指令的地址,当异常处理结束后,会将LR的值复制到PC,从而实现程序的返回。
具体的跳转过程如下图:
在上图中,左边为该代码的内存分配。当main函数执行到print_hello函数时,在CPU中PC指向了内存存放print_hello的空间;之后LR保存函数下一个指令的位置,同时PC跳转到函数实体进行执行;当执行结束后,LR的值被赋值给了PC,之后PC跳回到粉色LR的位置,从而实现了函数的跳转和返回。
- SP(R13)
栈指针,用于存储当前模式下的栈顶地址,就是告诉CPU向栈中放数据时放在哪里。栈指针是动态变化的,当产生入栈或者出栈数据时,栈指针都在移动。
控制寄存器CPSR:
- [4:0]:模式位
该四位对应ARM的8种模式,具体的值与对应的模式如下图。当想要修改模式时,只需将CPSR的模式位修改为指定的数值即可。
各个模式的功能含义见博文:"2.ARM_ARM是什么" - "ARM概述" - "5、ARM工作模式"。博文链接如下:2.ARM_ARM是什么-CSDN博客
- [5]:状态位
状态位控制的是ARM的状态,具体的值与对应的状态如下图。一般情况下,默认设置为0,即:状态为ARM状态。
各个状态的功能含义见博文:"2.ARM_ARM是什么" - "ARM概述" - "4、ARM存储模型" - "4.2 指令存储" 。博文链接如下:2.ARM_ARM是什么-CSDN博客
- [7:6]:中断使能
[6]是快中断使能,[7]是外部中断使能。当该位为0时代表中断使能,为1时代表中断失能。
- [31:28]:条件代码标志
N:
negative,代表负数。当运算器种产生了负数的结果时,该位自动置1,否则为0
Z:
zero,代表零。当运算器种产生了0的结果时,该位自动置1,否则为0
C:
针对于无符号数的溢出和借位。
当加法进位时,该位自动置1,否则为0。当减法借位时,该位自动置0,否则为1
比如0xFFFFFFFE + 0x18 这时溢出,则C置1。
V:
针对于有符号数的溢出和借位。
当加法进位时,该位自动置1,否则为0。当减法借位时,该位自动置0,否则为1
比如0x7FFFFFFF + 5 这时最高位7(0111)会进位变为(1xxx)这时最高位的符号位被进位,代表溢出,此时V置1