引用自 ARM MRC
文档,
MRC{2}<c><q> <coproc>, #<opc1>, <Rt>, <CRn>, <CRm>{, #<opc2>}
where:
2
If specified, selects encoding T2 / A2. If omitted, selects encoding T1 / A1.
<c><q>
See Standard assembler syntax fields on page A8-7. An ARM MRC2 instruction must be unconditional.
<coproc>
The name of the coprocessor. The standard generic coprocessor names are p0, p1, …, p15.
<opc1>
Is a coprocessor-specific opcode in the range 0 to 7.
<Rt>
Is the destination ARM core register. This register can be R0-R14 or APSR_nzcv. The last form writes bits [31:28] of the transferred value to the N, Z, C and V condition flags and is specified by setting the Rt field of the encoding to 0b1111. In pre-UAL assembler syntax, PC was written instead of APSR_nzcv to select this form.
<CRn>
Is the coprocessor register that contains the first operand.
<CRm>
Is an additional source or destination coprocessor register.
<opc2>
Is a coprocessor-specific opcode in the range 0 to 7. If omitted,<opc2>
is assumed to be 0.
如果MRC
旨在将单个协处理器寄存器的内容复制到单个 ARM 寄存器中,CRm
的原因是什么? ?另外,我不太确定 opcode
的原因是什么两者皆有,但相关性较小。
最佳答案
user786653 可能用那个链接一语中的。
我知道旧的 fpu,fpa,使用协处理器接口(interface),如果你解码 fpa 浮点指令,我想你会发现它们与通用协处理器 (mrc/mcr) 的操作码模式一致。
我的观点是,我不会对该指令中的每个字段都进行处理,就协处理器而言,某些字段可能并不关心。 ARM 处理器和汇编器不一定知道你连接了什么,这是将位模式放入机器指令的通用方法。您需要关注您正在与之交谈的特定协处理器,它的 TRM 特别是具有该逻辑匹配版本号的 TRM(如果可能,如果来自 ARM),假设协处理器来自 arm,如果它是其他人的协处理器,则使用他们的文档.希望该协处理器中每个操作使用的字段定义得足够好。如果他们不谈论其中一个字段的含义,我会认为它不在乎。如果有的话,在手册中剪切并粘贴他们的 mrc/mcr 行,如果没有的话,谷歌可能会找到一些已经很好用的代码并剪切和粘贴该模式和/或对未定义的字段尝试不同的东西,看看是否会改变操作。
一般来说,虽然 mrc/mcr 字段定义不是一成不变的,但供应商可以创建一个协处理器并对这些字段做任何他们想做的事情。就像 FPA 一样,可能会改变汇编器/反汇编器以创建指令集的新扩展。 arm 内核可能关心 ARM 寄存器本身,如果协处理器接口(interface)本身有一个 TRM,如果协处理器读取有一条控制线告诉 arm 是否修改基于协处理器的指定 arm 寄存器,我不会感到惊讶驱动那个信号。
关于assembly - MRC命令的附加协处理器寄存器的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7688372/