3. ARM_寄存器组织

概述

什么是寄存器:

寄存器是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 指令存储"。博文链接如下:

2.ARM_ARM是什么-CSDN博客

  • 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

相关推荐
橘色的喵21 小时前
嵌入式ARM平台Linux网络实时性能优化
linux·网络·arm开发·性能优化·实时·内核优化
荣世蓥2 天前
2.ARM_ARM是什么
arm开发
憧憬一下2 天前
Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
arm开发·嵌入式硬件·嵌入式·c/c++·linux驱动开发
亿道电子2 天前
【ARM】MDK-E203 Undefined identifier
arm开发·stm32·单片机·arm
ShuQiHere2 天前
【ShuQiHere】️计算机架构:x86 与 ARM 指令集架构的对比与发展
arm开发·架构
CYRUS STUDIO2 天前
Android下的系统调用 (syscall),内联汇编syscall
android·linux·汇编·arm开发·arm·内联汇编
橘色的喵3 天前
C++编程:嵌入式Linux-ARM与外设中断交互的程序设计
linux·arm开发·select·interrupt·中断·低延迟·设备交互
TeYiToKu3 天前
笔记整理—linux驱动开发部分(7)misc类设备(杂项设备)
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件
jjjxxxhhh1234 天前
MinGW,cygw,GCC,arm-linux-gnueabihf-gcc 这几个有啥区别和联系
linux·arm开发·单片机