MCR/MRC学习

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

指令的语法格式:

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

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

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

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

 <Rd>作为元寄存器的ARM寄存器,其值被传送到得协处理器寄存器中,但不能为PC,否则指令操作结果不可预知。

 <CRn>作为目标寄存器的协处理器寄存器,其编号可能为C0,C1....C15。

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


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

指令的语法格式:

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

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


实例:

/*程序摘录自u-boot-2010.06\arch\arm\arm920t\start.s*/
cpu_init_crit:
    /*
     * flush v4 I/D caches
     */
    mov    r0, #0
    mcr    p15, 0, r0, c7, c7, 0    /* flush v3/v4 cache */
    mcr    p15, 0, r0, c8, c7, 0    /* flush v4 TLB */

    /*
     * disable MMU stuff and caches
     */
    mrc    p15, 0, r0, c1, c0, 0
    bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)
    bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)
    orr    r0, r0, #0x00000002    @ set bit 2 (A) Align
    orr    r0, r0, #0x00001000    @ set bit 12 (I) I-Cache
    mcr    p15, 0, r0, c1, c0, 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值