引用ARM MRC
文档,
MRC{2}<c><q> <coproc>, #<opc1>, <Rt>, <CRn>, <CRm>{, #<opc2>}
其中:
2
如果指定,则选择编码T2 / A2。如果省略,则选择编码T1 / A1。
<c><q>
请参阅第A8-7页的标准汇编语法字段。 ARM MRC2指令必须是无条件的。
<coproc>
协处理器的名称。标准通用协处理器名称为p0,p1,...,p15。
<opc1>
特定于协处理器的操作码,范围为0到7。
<Rt>
是目标ARM内核寄存器。该寄存器可以是R0-R14或APSR_nzcv。最后一种形式将传输值的位[31:28]写入N,Z,C和V条件标志,并通过将编码的Rt字段设置为0b1111来指定。在pre-UAL汇编语法中,编写了PC而不是APSR_nzcv来选择此表单。
<CRn>
协处理器寄存器是否包含第一个操作数。
<CRm>
是一个额外的源或目标协处理器寄存器。
<opc2>
特定于协处理器的操作码,范围为0到7.如果省略,则假定<opc2>
为0。
如果MRC
用于将单个协处理器寄存器的内容复制到单个ARM寄存器中,CRm
的原因是什么?另外,我不太确定opcode
的原因是什么,但这种相关性较低。
答案 0 :(得分:3)
我知道旧的fpu,fpa,使用了协处理器接口,如果你解码fpa浮点指令,我认为你会发现它们与通用协处理器(mrc / mcr)的操作码模式对齐。
我的观点是,我不会在该指令的每个字段上进行处理,就协处理器而言,某些字段可能并不关心。 ARM处理器和汇编器不一定知道你已经连接了什么,这是将位模式放入机器指令的通用方法。您需要专注于您正在与之交谈的特定协处理器,其TRM特别是具有该逻辑的匹配版本号的TRM(如果可能,如果来自ARM),假设协处理器来自arm,如果它是某个elses协处理器然后使用他们的文档。希望很好地定义该协处理器中每个操作所使用的字段。如果他们不谈论其中一个领域意味着我会认为它不关心。如果没有,那么在手册中剪切并粘贴他们的mrc / mcr行可能会找到一些已经很好用的代码并剪切并粘贴该模式和/或为未定义的字段尝试不同的东西,看看是否会改变操作。 / p>
虽然mrc / mcr字段定义并非一成不变,但供应商可以创建协处理器并对这些字段执行任何他们想要的操作。像FPA一样,可能会更改汇编器/反汇编程序以创建指令集的新扩展。 arm核心可能关心ARM寄存器本身,如果协处理器接口本身有一个TRM,如果协处理器读取的控制线告诉arm是否根据协处理器修改指定的arm寄存器,我不会感到惊讶驾驶那个信号。