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

相关推荐
mucheni11 小时前
迅为RK3562开发板ARM四核A53核心板多种系统适配全开源
arm开发
阿让啊11 小时前
单片机获取真实时间的实现方法
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件
手打猪大屁14 小时前
ARM裸机开发——I.MX6U_汇编LED灯驱动
汇编·arm开发
深圳信迈科技DSP+ARM+FPGA16 小时前
基于ARM+FPGA+DSP的储能协调控制器解决方案,支持国产化
arm开发·fpga开发·信号处理
承接电子控制相关项目18 小时前
STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。
arm开发·stm32·单片机·cortex-m3内核启动
技术领导力21 小时前
事关数据安全,ARM被爆不可修复漏洞
arm开发
完成大叔1 天前
嵌入式:ARM公司发展史与核心技术演进
arm开发·嵌入式硬件
木木不迷茫(˵¯͒¯͒˵)2 天前
Keil MDK‑5 中使用 GNU ARM GCC 的 -Wno-* 选项屏蔽编译警告
arm开发·gnu·keil
迷路的小灰仔2 天前
ESP32 搭建IDF+Vscode环境(详细教程)
c语言·arm开发·单片机·mcu·物联网·visual studio·iot
辣个蓝人QEX2 天前
【ZYNQ MP开发】Linux下使用bootgen命令生成BOOT.bin报错架构不对问题探究
linux·arm开发·xilinx·zynq·mpsoc·bootgen·u-boot移植