• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

ARM V8R中汇编指令MCRR和MRRC的详细用法

了解 ARM V8R 中的 MCRR 和 MRRC 指令能让你更高效地处理协处理器(如 CP15)上的 64 位数据操作。这两条指令专为双字(64 位) 数据传输设计。

🧠 核心功能与概述

MCRR 和 MRRC 是 ARM 架构中用于在 ARM 通用寄存器和协处理器寄存器之间传输 64 位数据的指令。它们是 MCR/MRC 指令的“双字”版本。

  • MCRR (Move to Coprocessor from Two Registers)
    • 功能:将两个 ARM 通用寄存器(共 64 位数据)的内容一次性写入到协处理器的某个 64 位寄存器中。
    • 数据流:ARM -> Coprocessor
  • MRRC (Move to Two Registers from Coprocessor)
    • 功能:从协处理器的某个 64 位寄存器中一次性读取 64 位数据,并将其放入两个 ARM 通用寄存器中。
    • 数据流:Coprocessor -> ARM

简单记忆:

  • MCRR:写协处理器(Move To Coprocessor from Two Registers)
  • MRRC:读协处理器(Move From Coprocessor to Two Registers)

⚙️ 语法与操作数格式

MCRR 和 MRRC 的语法结构是对称的。

MCRR 指令语法

MCRR{<cond>} <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>

MRRC 指令语法

MRRC{<cond>} <coproc>, <opc1>, <Rt>, <Rt2>, <CRm>
  • {<cond>}:可选的条件码后缀(如 EQ, NE)。
  • <coproc>:协处理器编号。对于系统控制协处理器 CP15,此处写 p15。
  • <opc1>:操作码 1。与 CRm 一起用于指定要访问的协处理器寄存器。
  • <Rt>:
    • 对于 MCRR:第一个源操作数 ARM 寄存器,存放要发送的 64 位数据的低 32 位。
    • 对于 MRRC:第一个目标操作数 ARM 寄存器,存放接收的 64 位数据的低 32 位。
  • <Rt2>:
    • 对于 MCRR:第二个源操作数 ARM 寄存器,存放要发送的 64 位数据的高 32 位。
    • 对于 MRRC:第二个目标操作数 ARM 寄存器,存放接收的 64 位数据的高 32 位。
  • <CRm>:协处理器寄存器。与 opc1 共同确定最终要访问的 64 位协处理器寄存器。

关键点:

  • 寄存器对 <Rt> 和 <Rt2> 共同构成一个 64 位操作数。
  • 在 ARM 小端模式下:
    • <Rt> 对应低 32 位(LSB)
    • <Rt2> 对应高 32 位(MSB)
  • opc1 和 CRm 的组合唯一确定了协处理器上的 64 位寄存器。

🛠️ 详细用法与示例

MCRR 和 MRRC 指令主要用于操作 CP15 协处理器中需要 64 位操作的寄存器。

1. 读取 64 位系统寄存器

使用 MRRC 可以一次性读取一个 64 位的系统寄存器。

@ 示例:读取 CP15 中某个 64 位寄存器 (例如 opc1=0, CRm=c14)
MRRC p15, 0, R0, R1, c14  @ 将协处理器寄存器 (opc1=0, CRm=c14) 的值读到 R0(低32位) 和 R1(高32位) 中

2. 写入 64 位系统寄存器

使用 MCRR 可以一次性写入一个 64 位的系统寄存器。

@ 示例:写入 CP15 中某个 64 位寄存器 (例如 opc1=0, CRm=c14)
MOV R0, #0x1234       @ 准备要写入数据的低32位
MOV R1, #0x5678       @ 准备要写入数据的高32位
MCRR p15, 0, R0, R1, c14 @ 将 R0(低32位) 和 R1(高32位) 的值写入协处理器寄存器 (opc1=0, CRm=c14)

3. 操作物理地址

在一些支持大于 32 位物理地址空间的 ARMv8-R 系统中,可能会用到 64 位的地址寄存器。

@ 假设需要配置一个64位的物理地址到协处理器寄存器 (例如用于DMA或内存测试)
LDR R0, =0x89000000       @ 地址的低32位
LDR R1, =0x00000000       @ 地址的高32位 (若地址空间<4GB,则通常为0)
MCRR p15, 0, R0, R1, c5   @ 将64位地址写入协处理器寄存器 (示例参数,具体需查手册)

为了更直观地理解 MRRC 指令的执行过程,下图展示了 MRRC p15, 0, R0, R1, c14 的操作流程:

flowchart TD A[指令: MRRC p15, 0, R0, R1, c14] --> B[从协处理器寄存器<br>opc1=0, CRm=c14 读取64位值] B --> C{拆分64位数据} C --> D[低32位 → R0] C --> E[高32位 → R1] D --> F[执行后: R0 = 低32位数据] E --> G[执行后: R1 = 高32位数据]

⚠️ 重要注意事项与原理

  1. 权限要求 (Privilege):

    • 与 MCR/MRC 一样,MCRR 和 MRRC 是特权指令。通常只能在特权模式(如 EL1 及以上)下执行。在用户模式 (EL0) 下执行会触发未定义指令异常。
  2. 寄存器顺序:

    • 务必注意 <Rt> 和 <Rt2> 的顺序。<Rt> 总是对应 64 位数据的低 32 位,<Rt2> 总是对应 64 位数据的高 32 位。这与 ARM 的小端字节序保持一致。
  3. 协处理器寄存器识别:

    • 协处理器 64 位寄存器的识别由 opc1 和 CRm 共同决定,而不是像 MCR/MRC 那样由 CRn 和 CRm 决定。MCRR/MRRC 的语法中没有 CRn 操作数。
  4. 指令屏障的使用:

    • 在通过 MCRR 修改了可能影响处理器行为的系统配置后,通常需要紧跟屏障指令(如 DSB、ISB)来确保配置生效并同步执行流水线。
  5. 平台依赖性:

    • MCRR 和 MRRC 指令的行为、操作数 opc1 和 CRm 的具体含义高度依赖于具体的 ARM 内核实现(例如 Cortex-R52, Cortex-R82 等)。
    • 绝对权威:最权威的解释必须来自你所使用的特定芯片的技术参考手册 (TRM) 和 ARM Architecture Reference Manual for ARMv8-R。切勿凭猜测使用这些指令。
  6. 与 MCR/MRC 的区别:

    特性 MCR/MRC MCRR/MRRC
    数据宽度 32 位 64 位
    ARM 寄存器数 1 个 2 个 (Rt 和 Rt2)
    协处理器寄存器指定 由 CRn 和 CRm 等指定 由 opc1 和 CRm 指定
    主要用途 操作 32 位协处理器寄存器 操作 64 位协处理器寄存器

💎 总结

MCRR 和 MRRC 指令是 ARMv8-R (AArch32) 架构中高效操作 64 位协处理器寄存器的专用指令。

它们的核心用途是:

  • 高效传输:单条指令完成 64 位数据在 ARM 寄存器组和协处理器之间的传输,效率高于两条 32 位指令。
  • 系统配置:用于配置(MCRR)或读取(MRRC)系统中需要 64 位操作的寄存器,例如大物理地址寄存器、某些性能监控寄存器等。

使用切记:

  1. 查阅文档:操作前必须查阅芯片手册,确认 opc1 和 CRm 的正确组合及其对应的协处理器寄存器功能。
  2. 权限要求:确保在正确的特权模式下执行。
  3. 注意顺序:<Rt> 是低32位,<Rt2> 是高32位。
  4. 使用屏障:修改关键配置后根据需要使用 DSB 或 ISB。

简单来说:当你需要读取或写入协处理器中的 64 位寄存器时,就应该使用 MRRC 或 MCRR 指令。 它们是进行底层系统开发(如固件、Bootloader、内核驱动)时才会用到的强大工具。

posted on 2025-09-05 21:21  SOC验证工程师  阅读(21)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3