• 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处载入半字的时候就会引发对齐异常。

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



  • 相关阅读:
    十四、自定义构建购物计算组件&表单组件
    从微信小程序到鸿蒙js开发【04】——list组件
    HarmonyOS应用开发-Component体系介绍(一)
    HarmonyOS单模块编译与源码导读
    烧录失败导致boot无法加载的解决措施,再也不怕烧成砖了
    从微信小程序到鸿蒙js开发【03】——fetch获取数据&简单天气预报
    抛弃床的温暖,只为了它丨云库一款跑在鸿蒙系统上的应用丨篇二
    swift 弹窗
    Swift字符串常用操作总结
    swift 随机数
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6755443.html
Copyright © 2020-2023  润新知