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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpc2hhbmd3ZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

说明一点:在第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处载入半字的时候就会引发对齐异常。

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

or1200中载入存储类指令说明的更多相关文章

  1. or1200处理器的异常处理类指令介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...

  2. Kubernetes (1.6) 中的存储类及其动态供给

    原文地址:http://blog.fleeto.us/translation/dynamic-provisioning-and-storage-classes-kubernetes-0?utm_sou ...

  3. 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

    将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...

  4. C Primer Plus之存储类、链接和内存管理

    存储时期即生存周期——变量在内存中保留的时间 变量的作用域和链接一起表明程序的哪些部分可以通过变量名来使用该变量. 注意:生存期和作用域是两个不同的概念. 作用域    作用域描述了程序中可以访问一个 ...

  5. 新手小白入门C语言第五章:C存储类

    一 .存储类 在理解C的存储类之前,首先要搞懂的概念有:作用域.生存周期.连接属性 C中的存储类说明符实际上是上述属性的不同组合 作用域:一个C变量的作用域可以是 代码块作用域(在函数内部代码块中定义 ...

  6. C中存储类、链接和内存管理

    在C语言中,有5种不同的存储类型,即存储类.在介绍存储类之前,需要首先简单介绍几个术语.如下: 作用域:描述程序中可以访问一个标识符的一个或多个区域.一个C变量的作用域可以是代码块作用域.函数原型作用 ...

  7. union 中可以存储的是不带构造函数的类对象

    union 中可以存储的是不带构造函数的类对象 否则不符合逻辑 为什么不符合逻辑?

  8. OR1200中指令Cache的结构

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 12.3 ICache结构 OR1200中实现ICache的文件有or1200_ic_top.v.or1200_ic_fsm.v.o ...

  9. 自己动手写CPU之第九阶段(4)——载入存储指令实现思路

    将陆续上传新书<自己动手写CPU>,今天是第40篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...

随机推荐

  1. Unity3D中的UnitySendMessage方法的使用

    UnitySendMessage(“string”,“string”, ***),这是方法,我们至少需要传入两个参数,第一个参数为unity中的一个gameobject名称,第二个参数为这个gameo ...

  2. jquery实现回车键触发事件

    键盘事件有3: keydown,keypress,keyup,分别是按下,按着没上抬,上抬键盘 . 正确代码为: $(document).keyup(function(event){ if(event ...

  3. Bootstrap 3之美01-下载并引入页面

    本篇主要包括: ■ 下载Bootstrap 3■  Bootstrap 3引入页面 下载Bootstrap 3 →打开网站:http://getbootstrap.com/→点击屏幕中央位置的Down ...

  4. struts2怎么实现页面到页面之间的传值?

    我要实现一个产品订购的功能,在浏览产品的时候通过点击一个订购的链接,跳转到提交订单的页面,在跳转的同时要把浏览的产品的名称和型号传到提交订单的页面,并且把这里的订单类的产品名称和型号的表单域里赋上传递 ...

  5. JAVA复制文件最快的算法

    /** * 复制文件 * * @param srcFile * 源文件File * @param destDir * 目标目录File * @param newFileName * 新文件名 * @r ...

  6. mysql错误日志/var/log/mariadb/mariadb.log,二进制日志

    mariadb-日志 IT_luo关注0人评论65人阅读2018-10-15 08:59:03   mariadb日志 mariadb日志: 1.查询日志:query log: 2.慢查询日志:slo ...

  7. Ubuntu双系统安装

    原文链接: http://www.jianshu.com/p/2eebd6ad284d   作者 Volcanoo 2016.01.31 00:07 字数 1737 阅读 141859评论 161喜欢 ...

  8. Installing Apache Spark on Ubuntu 16.04

    Santosh Srinivas on 07 Nov 2016, tagged onApache Spark, Analytics, Data Minin I've finally got to a ...

  9. Mac下在Intellij Idea里设置VM运行参数的正确方法

    打开应用程序,右键选择显示包内容 可以看到idea的初始jvm配置的位置: 但是真正生效的配置是个人目录下的此文件,注意每个版本都会重新生成一次 设置idea使其在右下角的位置显示内存使用情况:483 ...

  10. java.lang.ClassNotFoundException: Didn&#39;t find class &quot;stu.love.neihan.MainActivity&quot; on path: DexPathL

    java.lang.ClassNotFoundException: Didn't find class "stu.love.neihan.MainActivity" on path ...