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\]:模式位

各个模式的功能含义见博文:"2.ARM_ARM是什么" - "ARM概述" - "5、ARM工作模式"。博文链接如下:2.ARM_ARM是什么-CSDN博客

  • 5\]:状态位

各个状态的功能含义见博文:"2.ARM_ARM是什么" - "ARM概述" - "4、ARM存储模型" - "4.2 指令存储" 。博文链接如下:2.ARM_ARM是什么-CSDN博客

  • 7:6\]:中断使能

  • 31:28\]:条件代码标志

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

相关推荐
路溪非溪10 小时前
systemd简介和使用总结
linux·arm开发·驱动开发
想要成为计算机高手1 天前
研究 telegrip - SO100 Robot Arm Teleoperation System
arm开发·机器人·开源·具身智能·摇操·telegrip
编码如写诗1 天前
【k8s】arm架构从零开始在线/离线部署k8s1.34.5+KubeSphere3.4.1
arm开发·架构·kubernetes
EVERSPIN1 天前
BLE蓝牙水表蓝牙芯片方案
arm开发·蓝牙芯片·蓝牙芯片方案
银河麒麟操作系统1 天前
银河麒麟桌面操作系统V10SP1(全X86/ARM架构)【进程资源限制与性能优化实践】技术文章
arm开发·性能优化·架构
左手の明天1 天前
Linux内核裁剪深入浅出:从原理到实操,打造轻量化嵌入式内核
linux·arm开发·c++
路溪非溪1 天前
wpa_supplicant核心操作总结
linux·网络·arm开发·驱动开发
忆和熙2 天前
ARM处理器指令系统——ARM指令的寻址方式(上,数据处理指令的寻址方式、Load/Store 寻址方式总览)
arm开发·arm指令寻址方式
忆和熙2 天前
ARM处理器指令系统——ARM指令的寻址方式(下,Load/Store寻址方式、AArch32/64中Load/Store寻址方式的区别)
arm开发·arm指令寻址方式
Flamingˢ2 天前
基于ARM的裸机程序设计和开发(二):使用Vivado创建PS应用系统
arm开发