ARM 寄存器

这篇具有很好参考价值的文章主要介绍了ARM 寄存器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ARM 寄存器介绍

Cortex A 系列的 ARM 处理器共有 40 个 32 位寄存器,其中 33 个为通用寄存器,7 个为状态寄存器。用户模式和系统模式共用同一组寄存器。
ARM 寄存器,# ARM,Linux,嵌入式,arm开发

一、未分组寄存器 R0~R7

有些寄存器是所有运行模式共用的,如 R0~R7,它们被称为未分组寄存器。
在所有运行模式下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊用途。
在运行模式转换时,不同运行模式的处理器均使用相同的物理寄存器,可能造成寄存器中数据的覆盖。

二、分组寄存器 R8~R14

分组寄存器每一次访问的物理寄存器都与当前处理器的运行模式有关。
对 R8~R12 来说,每个寄存器对应 2 个不同的物理寄存器。当使用快速中断模式时,分组寄存器访问寄存器 R8_fiq ~ R12_fiq;当使用除快速中断模式以外的其他模式时,分组寄存器访问寄存器 R8_usr ~ R12_usr。
对 R13、R14 来说,每个寄存器对应 7 个不同的物理寄存器,其中一个为用户模式和系统模式共用,另外 6 个物理寄存器对应其它 6 种不同的运行模式,并采用以下记号来区分不同的物理寄存器。

R13_mode、R14_mode
其中 mode 可为 usr、fiq、irq、svc、abt、und、mon

① 寄存器 R13(SP)
寄存器 R13 在 ARM 指令集中常被用作堆栈指针,用户也可以使用其它寄存器作为堆栈指针,而在 Thumb 指令集中,某些指令强制要求使用寄存器 R13 作为堆栈指针。
处理器的每种运行模式均有自己独立的物理寄存器 R13,在用户应用程序初始化时,要初始化每种运行模式下的 R13 寄存器,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器中的数据保存至 R13 所指向的堆栈,而当程序从异常模式返回时,再从该堆栈中恢复数据,采用这种方式可以保证异常发生后程序也能正常执行。

② 寄存器 R14(LR)
当执行子程序调用指令(BL)时,R14 可得到 R15(程序计数器)的备份。
在每一种运行模式下,都可用 R14 保存子程序的返回地址,当用指令 BL 或 BLX 调用子程序时,将程序计数器的当前值复制给 R14,执行完子程序后,又将 R14 的值复制回程序计数器,即可完成子程序的调用返回。

三、程序计数寄存器 R15(PC)

寄存器 R15 用作程序计数器,在 ARM 状态下,bit[1:0] 为 0,bit[31:2] 用于保存 PC 值,在 Thumb 状态下,bit[0] 为 0,bit[31:1] 用于保存 PC 值。
例如,在 ARM 状态下,如果 PC 的值是 0x40008001,那么在寻址时,查找的地址为 0x40008000,低 2 位会自动被忽略掉。

四、当前程序状态寄存器 R16(CPSR)

ARM 包含一个当前程序状态寄存器 CPSR(R16)(Current Program Status Register)和 6 个备份的程序状态寄存器(SPSRs)。CPSR 在任何工作模式都可被访问,用来保存 ALU 中的当前操作信息、控制允许和禁止中断、设置处理器的工作模式等。
ARM 寄存器,# ARM,Linux,嵌入式,arm开发

其中工作模式位(M[4:0])用来标识或设置处理器的工作模式。
ARM 寄存器,# ARM,Linux,嵌入式,arm开发

下面,我们通过调试,看下管理模式和用户模式下 CPSR 的值,实际感受下

管理模式(SVC)

ARM 寄存器,# ARM,Linux,嵌入式,arm开发
在内核代码中打上断点,断点命中后,CPU 停止运行,此时 cpsr 寄存器的值为 0x60000193,我们只看最低 5 bits,值为 10011b,对应上表中的 SVC 管理模式。
PS:Linux 内核代码大多数时候都是以 SVC 管理模式运行的,其中,软中断相关的调用是使用 SYS 系统模式运行的。而且,内核在特定的情况下可以主动从 SVC 模式切换到 SYS 模式去运行。

用户模式(USR)

ARM 寄存器,# ARM,Linux,嵌入式,arm开发
在用户进程的 main 函数打上断点,断点命中后,CPU 停止运行,此时 cpsr 寄存器的值为 0x60080010,最低 5 bits 为 10000b,对应上表中的用户模式。

汇编里的寄存器名称

我们在看反汇编代码时,常常会看到 fp、lr 等寄存器名称,这些是指什么呢?

liyongjun@Box:~/project/board/buildroot/override/Vexpress_2/test$ /home/liyongjun/project/board/buildroot/Vexpress_2/host/bin/arm-linux-objdump -d test.out 
...
000005b8 <main>:
 5b8:	e92d4800 	push	{fp, lr}
 5bc:	e28db004 	add	fp, sp, #4
 5c0:	e24dd008 	sub	sp, sp, #8
 5c4:	e3a03000 	mov	r3, #0
 5c8:	e50b3008 	str	r3, [fp, #-8]
 5cc:	ea000008 	b	5f4 <main+0x3c>
 5d0:	e59f3038 	ldr	r3, [pc, #56]	@ 610 <main+0x58>
 5d4:	e08f3003 	add	r3, pc, r3
 5d8:	e1a00003 	mov	r0, r3
 5dc:	ebffff92 	bl	42c <puts@plt>
 5e0:	e3a00001 	mov	r0, #1
 5e4:	ebffff8d 	bl	420 <sleep@plt>
 5e8:	e51b3008 	ldr	r3, [fp, #-8]
 5ec:	e2833001 	add	r3, r3, #1
 5f0:	e50b3008 	str	r3, [fp, #-8]
 5f4:	e51b3008 	ldr	r3, [fp, #-8]
 5f8:	e3530009 	cmp	r3, #9
 5fc:	dafffff3 	ble	5d0 <main+0x18>
 600:	e3a03000 	mov	r3, #0
 604:	e1a00003 	mov	r0, r3
 608:	e24bd004 	sub	sp, fp, #4
 60c:	e8bd8800 	pop	{fp, pc}
 610:	000000d4 	.word	0x000000d4
...

在解答疑问之前,我们先介绍一个概念:ATPCS

ATPCS

ATPCS(ARM-Thumb Produce Call Standard)是 ARM 程序和 Thumb 程序中调用的基本规则。这些基本规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。

寄存器的使用规则

下表总结了在 ATPCS 中各寄存器的使用规则及其名称。这些名称在编译器和汇编器中都是预定义的。
ARM 寄存器,# ARM,Linux,嵌入式,arm开发
寄存器的使用必须满足下面的规则。

  • 子程序间通过寄存器 R0~R3 来传递参数。这时,寄存器 R0~R3 可以记作 A0~A3。
  • 在子程序中使用寄存器 R4~R11 来保存局部变量。这时,寄存器 R4~R11 可以记作 V1~V8。如果在子程序中也使用到了寄存器 V1~V8,那么子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。
  • 寄存器 R12 用作子程序间 scratch 寄存器,记作 IP,在子程序间的连接代码段中常有这种使用规则。
  • 寄存器 R13 用作堆栈指针,记作 SP,在子程序中寄存器 R13 不能用作其它用途。寄存器 SP 在进入子程序时的值和退出子程序时的值必须相等。
  • 寄存器 R14 称为连接寄存器,记作 LR。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器 R14 则可以用作其它用途。
  • 寄存器 R15 是程序计数器,记作 PC。他不能用作其他用途。

通过以上介绍,我们就知道了 fp、lr 分别是寄存器 R11、R14 的别名。类似的寄存器别名还有 pc、sp、ip、sl 等。文章来源地址https://www.toymoban.com/news/detail-783578.html

到了这里,关于ARM 寄存器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能深入参与嵌入式控制器调试---ChatGPT回答TC377 PSRi寄存器ACT位置位失效问题

    做嵌入式开发的小伙伴们,有福利了! 当遇到调试过程中遇到难题,我们往往会找手册,上网搜索,找FAE来解决, 现在有了ChatGPT,尝试问了下调试的问题,如下  首先 我的问题描述 : 当设置 MCMCAN 控制器模式时,当 CCCRi.INT 被设置为 NORMAL 时,什么会导致 TC377 cpu PSRi 寄存

    2023年04月27日
    浏览(44)
  • 痞子衡嵌入式:不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常 。 痞子衡曾经写过一篇文章 《改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常》,这篇文章提出了一个观点,即对于 MCU 外设寄存器应

    2024年03月09日
    浏览(54)
  • 痞子衡嵌入式:如果i.MXRT1xxx离线无法启动,请先查看SRC_SBMRx寄存器

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义 。 最近有一位开源社区大佬在使能 RT1050 BEE 加密过程中遇到无法启动问题,折腾到一度崩溃,甚至想要弃坑。痞子衡哪能让这位“老乡”跑掉,连

    2024年02月19日
    浏览(39)
  • Arm汇编---寄存器

    寄存器:r0~r15, sp, lr, sb, sl, fp, ip, pc 条件码:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al ------------------------------------------ 一、数据寄存器 --------------------------------------------- ------------------------------------------ 二、指针寄存器 --------------------------------------------- --------------------

    2024年02月02日
    浏览(47)
  • ARM 寄存器

    Cortex A 系列的 ARM 处理器共有 40 个 32 位寄存器,其中 33 个为通用寄存器,7 个为状态寄存器。用户模式和系统模式共用同一组寄存器。 一、未分组寄存器 R0~R7 有些寄存器是所有运行模式共用的,如 R0~R7,它们被称为未分组寄存器。 在所有运行模式下,未分组寄存器都指向同

    2024年02月02日
    浏览(47)
  • ARM寄存器组织

     ARM有37个32位长的寄存器: 1个用做PC(Program Counter); 1个用做CPSR(Current Program Status Register); 5个用做SPSR(Saved Program Status Registers); 30个通用寄存器。 ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器均为32位的寄存器。6个状态寄存器,用以标识CPU的工作状

    2024年02月01日
    浏览(78)
  • ARM寄存器组

    CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0-R7也被称为低组寄存器,所有指令可以访问它们,它们的字长为32位,复位后的初始值是不可预料的。 R8-R12也被称为高组寄存器,所有指令可以访问它们,它们的字长为32位,复位后的初始值是不可预料的。 R13寄存器中

    2024年02月10日
    浏览(50)
  • ARM处理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM异常中断处理流程?

    快速学习嵌入式开发其他基础知识? 返回专栏总目录 《嵌入式工程师自我修养/C语言》 Tip📌:鼠标悬停双虚线/句,可获得更详细的描述   ARM处理器有多种工作模式,如下表所示。应用程序正常运行时,ARM处理器工作在 用户模式(User mode) ,当程序运行出错或有中

    2024年02月21日
    浏览(133)
  • ARM架构(寄存器点灯)

    本篇文章我们来讲解一下如何使用寄存器点亮一个LED灯,一般对于新人来说都是使用HAL库或者标准库来操作的,但是学习寄存器有助于我们了解更加深入的知识,这加会提高我们对ARM架构的理解。 首先第一步我们需要先找到LED的原理图,确定对应的引脚,然后知道是高电平点

    2024年02月15日
    浏览(61)
  • ARM中的寄存器

    ARM工作模式 ARM有8个基本的工作模式 User 非特权模式,一般在执行上层的应用程序时ARM处于该模式 FIQ 当一个高优先级中断产生后ARM将进入这种模式 IRQ 当一个低优先级中断产生后ARM将进入这种模式 SVC 当复位或执行软中断指令后ARM将进入这种模式 Abort 当产生存取异常时ARM将进

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包