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

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. 使用yum高速部署Oracle安装环境(11g)

    基于Linux安装过Oracle的童鞋们都应该清楚,安装Oracle的确是一件比較费时费力的差事,由于不过前期的rpm包,内核參数,创建用户等等这些个步骤都让那些新手不免眼花缭乱,一不留神.就导致终于 ...

  2. 3D数学读书笔记——四元数

    本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/25400659 什么是四元数 ...

  3. JAVA设计模式之门面模式(外观模式)

    医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统.如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号.门诊. ...

  4. WaitForSingleObject和CEvent用法

    WaitForSingleObject函数用来检测hHandle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将 ...

  5. iOS开发中的 ARC

    1. weak属性(弱引用) 被weak修饰的对象叫弱引用,不算对象持有者,一个方法执行完后会导致这个对象自动释放掉,并将对象的指针设置成nil,我使用GCD延时1000ms来验证,1000ms之后, ...

  6. [翻译] 学习iOS开发的建议:如何从菜鸟到专家

    [文章原地址] http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-from-novice-to-expert/ 翻译有误之处请勿见笑, ...

  7. Linux 提权常用命令集

    转载:http://www.myhack58.com/Article/html/3/8/2017/83236.htm 0x00 操作系统相关 操作系统类型版本 cat /etc/issue cat / ...

  8. Objective-C:浅复制(拷贝)

    浅复制:复制对象时,如果对象中包含对象类型的实例变量,只是复制指针.新对象中的对象类型实例变量和旧对象中的对象类型实例变量指的是同一个对象.任何一方实例变量对对象做修改,另一方实例变量指向的该对象也就 ...

  9. Informatica 常用组件Lookup之五 转换属性

    查找转换的属性标识数据库源.PowerCenter 如何处理转换,以及它如何处理高速缓存和多项匹配. 创建映射时,为每个查找转换指定属性.创建会话时,您可在会话属性中覆盖某些属性,如每个转换的索引和数 ...

  10. Java 连接MS Access数据库

    java连接MS Access的两种方式: 1.JDBC-ODBC Java连接Access可以使用MS自带的管理工具-->数据源(ODBC)设置建立连接,这样就不需要导入jar.但是,如此一来 ...