or1200中载入存储类指令说明

下面内容摘自《步步惊芯——软核处理器内部设计分析》一书


      OR1200中实现的载入存储类指令有8条,每条指令的作用与说明如表9.1所看到的。



      说明一点:在第2章建立的最小系统没有配置使用MMU,所以有效地址等于物理地址。

      载入存储类指令的助记符也非常好理解记忆。第一位是’s’表示存储指令,’l’表示载入指令。第二位是’b’表示对字节操作,’h’表示对半字操作,’w’表示对字操作;第三位是’z’表示零扩展,’s’表示符号扩展。据此能够对指令进行简称,如:l.sb指令能够简称为存储字节指令、l.lwz指令能够简称为载入字指令、l.lbs与l.lbz能够简称为载入字节指令。

      OR1200处理器中存储器是依照字节寻址的,而且默认是大端模式。在这样的模式下,数据的高位保存在存储器的低地址中。而数据的低位保存在存储器的高地址中。

读者能够回顾本书在1.3.2节中对大端模式的介绍。比方:使用指令l.sb在0x50处存储0x81,存储器中实际存储效果如图9.1所看到的。


      使用指令l.sh在0x54处存储0x8281。存储器中实际存储效果如图9.2所看到的。



      使用指令l.sw在0x58处存储0x84838281,存储器中实际存储效果如图9.3所看到的。



      此时使用载入指令会有例如以下效果:

      (1)使用指令l.lbz从0x58处载入一个字节。读出的字节就是0x84,经零扩展至32位还是0x84

      (2)使用指令l.lbs从0x58处载入一个字节,经符号扩展至32位就是0xffffff84

      (3)使用指令l.lhz从0x58处载入一个半字。读出的半字就是0x8483,经零扩展至32位还是0x8483

      (4)使用指令l.lhs从0x58处载入一个半字,经符号扩展至32位就是0xffff8483

      (5)使用指令l.lwz从0x58处载入一个字。读出的字就是0x84838281

      载入存储类指令运行过程中可能会发生DTLB失靶异常、数据页失效异常、总线(数据)异常、对齐异常。前三种异常与MMU模块关系比較紧密,在分析MMU的时候会有所涉及,本章将仅仅对对齐异常进行介绍。产生对齐异常的情况有例如以下四种:

  •   使用存储半字指令l.sh,但提供的地址不是2字节对齐
  •   使用载入半字指令l.lhz、l.lhs,但提供的地址不是2字节对齐
  •   使用存储字指令l.sw,但提供的地址不是4字节对齐
  •   使用载入字指令l.lw,但提供的地址不是4字节对齐

      实际上就是要求:载入存储半字的时候,地址要2字节对齐。即地址最低位等于0;载入存储字的时候,地址要4字节对齐,即地址最低两位等于00。假设不满足上述条件,就会引发对齐异常,处理器将转移到对齐异常的处理例程。比方:当使用指令l.lhz从地址0x59处载入半字的时候就会引发对齐异常。

在下一节的演示样例程序中就会有对齐异常的情况发生。



原文地址:https://www.cnblogs.com/yjbjingcha/p/6755443.html