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位数据]
⚠️ 重要注意事项与原理
-
权限要求 (Privilege):
- 与
MCR/MRC一样,MCRR和MRRC是特权指令。通常只能在特权模式(如 EL1 及以上)下执行。在用户模式 (EL0) 下执行会触发未定义指令异常。
- 与
-
寄存器顺序:
- 务必注意
<Rt>和<Rt2>的顺序。<Rt>总是对应 64 位数据的低 32 位,<Rt2>总是对应 64 位数据的高 32 位。这与 ARM 的小端字节序保持一致。
- 务必注意
-
协处理器寄存器识别:
- 协处理器 64 位寄存器的识别由
opc1和CRm共同决定,而不是像MCR/MRC那样由CRn和CRm决定。MCRR/MRRC的语法中没有CRn操作数。
- 协处理器 64 位寄存器的识别由
-
指令屏障的使用:
- 在通过
MCRR修改了可能影响处理器行为的系统配置后,通常需要紧跟屏障指令(如DSB、ISB)来确保配置生效并同步执行流水线。
- 在通过
-
平台依赖性:
MCRR和MRRC指令的行为、操作数opc1和CRm的具体含义高度依赖于具体的 ARM 内核实现(例如 Cortex-R52, Cortex-R82 等)。- 绝对权威:最权威的解释必须来自你所使用的特定芯片的技术参考手册 (TRM) 和 ARM Architecture Reference Manual for ARMv8-R。切勿凭猜测使用这些指令。
-
与
MCR/MRC的区别:特性 MCR/MRCMCRR/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 位操作的寄存器,例如大物理地址寄存器、某些性能监控寄存器等。
使用切记:
- 查阅文档:操作前必须查阅芯片手册,确认
opc1和CRm的正确组合及其对应的协处理器寄存器功能。 - 权限要求:确保在正确的特权模式下执行。
- 注意顺序:
<Rt>是低32位,<Rt2>是高32位。 - 使用屏障:修改关键配置后根据需要使用
DSB或ISB。
简单来说:当你需要读取或写入协处理器中的 64 位寄存器时,就应该使用 MRRC 或 MCRR 指令。 它们是进行底层系统开发(如固件、Bootloader、内核驱动)时才会用到的强大工具。
浙公网安备 33010602011771号