首页 > 代码库 > or1200中加载存储类指令说明

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处加载半字的时候就会引发对齐异常。在下一节的示例程序中就会有对齐异常的情况发生。