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

相关推荐
zlinear数据采集卡20 小时前
从协议解析到波形实时显示:硬核拆解ZLinear采集卡上位机软件的开发架构
arm开发·单片机·嵌入式硬件·fpga开发·架构·开源
奔跑的架构师21 小时前
[A-48]ARMv9/v8-电源状态管理机制(PSCI协调机制)
android·linux·arm开发·arm
想你依然心痛1 天前
RT-Thread组件生态:SAL网络框架与AT组件实战——网络抽象、AT指令
网络·arm开发·at·sal
secondyoung2 天前
Cortex-R52学习:存储系统
arm开发·单片机·学习·arm
c++之路2 天前
C++跨平台(九):跨平台字节序统一处理
开发语言·arm开发·c++
AndyHeee19 天前
【SVC、PendSV(系统异常) 与 外设 IRQ 、NVIC笔记】
arm开发
暮云星影19 天前
瑞芯微rk3588利用Rockchip NPU运行大语言模型(LLM)
arm开发·人工智能·语言模型·自然语言处理
techdashen19 天前
绕过系统 ICMP:用 rawsock、Npcap 和 WMI 找到默认网卡
开发语言·arm开发·rust
振南的单片机世界19 天前
ARM中断比51快在哪?硬件压栈+NVIC集中管理
arm开发·stm32·单片机·嵌入式硬件
墨绿色的摆渡人19 天前
论文笔记(一百三十七)Learning Dual-Arm Push and Grasp Synergy in Dense Clutter
arm开发·论文阅读