ARM汇编指令MCR/MRC学习

来源:互联网 发布:java timestamp 格式 编辑:程序博客网 时间:2024/04/30 13:07

MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。

指令的语法格式:

MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>}

MCR2 p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>}

其中,<cond>为指令执行的条件码。当<cond>忽略时指令为无条件执行。MCR2中,<cond>为Ob1111,指令为无条件执行指令。

 <opcode_1>为协处理器将执行的操作的操作码。对于CP15协处理器来说, <opcode_1>永远为0b000,当<opcode_1>不为0b000时,该指令操作结果不可预知。

 <Rd>作为元寄存器的ARM寄存器,其值被传送到得协处理器寄存器中。

 <Rd>不能为PC,当其为PC时,指令操作结果不可预知。

 <CRn>作为目标寄存器的协处理器寄存器,其编号可能为C0,C1....C15。 <CRm>附加的目标寄存器或者原操作数寄存器,用于区分同一个编号的不同物理寄存器。当指令中不需要提供附加信息时,将C0指定为<CRm>,否则指令操作结果不可预知。  <opcode_2>提供附加信息,用于区别同一个编号的不同物理寄存器。当指令中指定附加信息时,省略<opcode_2>或者将其指定为0,否则指令操作结果不可预知。

MRC指令将协处理器的寄存器中数值传送到ARM处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。

指令的语法格式:

MRC{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>}

MRC2 p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>}


ARM协处理器cp15,有16个寄存器,详细看《ARM体系结构与编程》

这里我大概说一下MRC与MCR这两个协处理器操作,参考《s3c2440》元件手册P140页

这两个命令是用于ARM寄存器与协处理器寄存器之间操作的,一个协处理器与寄存器之前操作的例子就是,一个浮点值在协处理器中转换成32位整型,然后它的结果传送到ARM920T的寄存器中MRC。相反则为MCR。

最重要的应用就是通过命令从协处理器交换控制信息到ARM920T CPSR相应标识位

看几个例子就明白

MRC    p2,5,r3,c5,c6

协处理器p2把c5和c6经过5操作的结果赋给r3

MCR    p6,0,r4,c5,c6

协处理器p6把r4执行0操作后将结果存放进c6

MRC    p3,9,r3,c5,c6,2

协处理器p3把c5和c6经过9操作(类型2)的结果赋给r3

详细写一下格式

MCR{cond}   p15,{opcode_1},<Rd>,<CRn>,<CRm>{,opcode_2}

其中{cond} 就是可选的执行条件

p15就是指定哪个协处理器,ARM920T好像有两个一个15一个14

<opcode_1>为协处理器将要执行的操作的操作码,对于CP15来说,永远为ob00,即0,如果不是,结果不同预知

<Rd>作为源寄存器的ARM寄存器

<CRn>目标寄存器的协处理器寄存器

<CRm>为附加的目标寄存器或者源操作数寄存器,用于区分同一个编号的不同物理寄存器,如果不需要,就将它设置为C0,否则结果不可预知

<opcode_2>附加信息,用于区别同一编号的不同物理寄存器,如果省略或者为0,就表示不附加,如果不是,后果不可预知




mrc是协处理器命令。用于读取协处理器中的寄存器的数据到ARM处理器的寄存器里面。这句话的意思应该是读协处理器中的寄存器数据到ARM处理器的r0里面。应该是ARM访问MMU,一般cp15就是MMU。

<MCR|MRC>{cond} p#, <expression1>,Rd,cn,cm{, <expression2>} 
MRC 从协处理器移到ARM7寄存器(L=1) 
MCR 从ARM7寄存器移到协处理器(L=0) 
{cond} 两个字符的条件代码 
p# 被请求得协处理器的惟一标识苻 
<expression1> 计算一个常量并放到CP Opc域 
Rd 是一个表达式计算ARM7有效寄存器序号 
cn 和cm 是计算有效协处理器寄存器CRn CRm序号 
<expression2> 计算一个常量,并放到CP域 
4.13.6 举例 
MRC 2,5,R3,c5,c6 ;请求协处理器2 执行操作5 ,操作数为c5和c6, 
; 传送结果到R3 (单次32位字) 
MCR 6,0,R4,c6 ; 请求协处理器6执行操作0,操作数为R4 
;结果送到c6 
来自ARM7 数据手册

将协处理器p15的寄存器中的数据传送到ARM处理器的寄存器r0中,其中1是协处理器操作码1,0是协处理器操作码2,c1存放第一个操作数的协处理器寄存器,c0存放第二个操作数的协处理器寄存器

读取控制寄存器,这包括 MMU,cache,writebuffer 的打开与关闭. 
读出修改后再用 mcr p15,0,r0,c1,c0,0 写回去.



0 0