将陆续上传新书《自己动手写CPU》。今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了。一直都有事,不好意思哈。

开展晒书评送书活动,在

q=%E4%BA%9A%E9%A9%AC%E9%80%8A&ie=utf-8&src=se_lighten_f" style="color:rgb(51,102,153); text-decoration:none; font-family:Arial; font-size:14px; line-height:26px; display:inline; position:static">亚马逊、京东、当当三大图书站点上,发表《自己动手写CPU》书评的前十名读者。均可获赠《步步惊芯——软核处理器内部设计分析》一书。大家踊跃參与吧。活动时间:2014-9-11至2014-10-20

今天继续对MIPS32中载入存储指令进行说明(主要是lwl、lwr),上次已经介绍一些其它的载入存储指令,大家能够回想。

9.1.4 载入指令lwl、lwr说明

载入指令lwl、lwr的格式如图9-6所看到的。

  • 当指令中的指令码为6'b100010时,是lwl指令。非对齐载入指令,向左载入

指令使用方法为:lwl rt, offset(base)

指令作用为:从内存中指定的载入地址处,载入一个字的最高有效部分。lwl指令对载入地址没有要求。从而同意地址非对齐载入,这是与前面介绍的lh、lhu、lw指令的不同之处。在大端模式、小端模式下,lwl指令的效果不同,由于OpenMIPS是大端模式,所以此处仅仅介绍在大端模式下lwl指令的效果。如果计算出来的载入地址是loadaddr,loadaddr的最低两位的值为n。将loadaddr最低两位设为0后的值称为loadaddr_align,例如以下。

载入地址loadaddr = signed_extended(offset) + GPR[base]

n = loadaddr[1:0]

loadaddr_align = loadaddr – n

比如:如果计算出来的载入地址是5。lwl指令要从地址5载入数据。那么loadaddr就等于5,n等于1。loadaddr_align等于4。

lwl指令的作用是从地址为loadaddr_align处载入一个字,也就是4个字节,然后将这个字的最低4-n个字节保存到地址为rt的通用寄存器的高位。而且保持低位不变。

继续上例,此时loadaddr_align为4,所以从地址4处载入一个字,相应的是地址为4、5、6、7的字节,由于n等于1,所以将载入到的字的最低3个字节保存到地址rt的通用寄存器的高3个字节。如图9-7所看到的。

一个更加通用的描写叙述如图9-8所看到的。

  • 当指令中的指令码为6'b100110时,是lwr指令。非对齐载入指令,向右载入

指令使用方法为:lwr rt, offset(base)

指令作用为:从内存中指定的载入地址处,载入一个字的最低有效部分。还是如果计算出来的载入地址是loadaddr,loadaddr的最低两位的值为n。将loadaddr最低两位设为0后的值称为loadaddr_align,例如以下。

载入地址loadaddr = signed_extended(offset) + GPR[base]

n = loadaddr[1:0]

loadaddr_align = loadaddr – n

比如:如果计算出来的载入地址是9,lwr指令要从地址9载入数据。那么loadaddr就等于9,n等于1。loadaddr_align等于8。

lwr指令的作用是从地址为loadaddr_align处载入一个字。也就是4个字节。然后将这个字的最高n+1个字节保存到地址为rt的通用寄存器的低位,而且保持高位不变。

继续上例,此时loadaddr_align为8。所以从地址8处载入一个字,相应的是地址为8、9、10、11的字节,由于n等于1。所以将载入到的字的最高2个字节保存到地址rt的通用寄存器的低2个字节。如图9-9所看到的。一个更加通用的描写叙述如图9-10所看到的。

lwl与lwr指令配合能够实现从一个非对齐地址载入一个字,并且仅仅须要使用2条指令。提高了效率。比如:使用一般指令从地址7处载入一个字,那么能够使用下面代码实现。共5条指令。

lw  $1, 4($0)          # 取得地址0x4处的字,保存在$1中
lw $2, 8($0) # 取得地址0x8处的字,保存在$2中
sll $1, $1, 24 # $1左移24位
slr $2, $2, 8 # $2右移8位
or $1, $1, $2 # $1与$2进行逻辑“或”运算,得到终于结果

而有了lwl、lwr指令后。仅仅须要2条指令就可以。

例如以下。图9-11是对这个过程的描写叙述。

lwl $1, 7($0)
lwr $1,10($0)

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

自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)的更多相关文章

  1. 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明

    将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...

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

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

  3. 自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明

    将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储载入指令:链接载入指令LL.条件存储指令SC,本次将介绍这两条指令.在兴许将实现这两条指令. 9 ...

  4. 自己动手写CPU之第七阶段(7)——乘累加指令的实现

    将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  5. 自己动手写CPU之第五阶段(1)——流水线数据相关问题

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...

  6. 自己动手写CPU之第六阶段(2)——移动操作指令实现思路

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...

  7. 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...

  8. 自己动手写CPU之第五阶段(2)——OpenMIPS对数据相关问题的解决措施

    将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第16篇.我尽量每周四篇 5.2 OpenMIPS对数据相关问题的解决措施 OpenMIPS处理器採用数据前推的方法来解决流水 ...

  9. 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程

    将陆续上传本人写的新书<自己动手写CPU>.今天是第25篇.我尽量每周四篇 亚马逊的预售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

随机推荐

  1. How vacuum template0

    [pg@h1 ~]$ vacuumdb --freeze template0 vacuumdb: could not connect to database template0: FATAL: dat ...

  2. MySQL-锁研究

    隔离级别研究: http://www.cnblogs.com/JohnABC/p/3521061.html 表级:引擎 MyISAM, 理解为锁住整个表, 锁定期间, 其它进程无法对该表进行写操作, ...

  3. 如何处理JSON中的特殊字符 介绍几种解决方案

    http://www.nowamagic.net/librarys/veda/detail/216JSON 是适用于 Ajax 应用程序的一种有效格式,原因是它使 JavaScript 对象和字符串值 ...

  4. Zookeeper研究和应用

    http://www.searchtb.com/2011/01/zookeeper-research.html zookeeper简介 zookeeper是一个开源分布式的服务,它提供了分布式协作,分 ...

  5. Confluence - Online Team Collaboration Tool

    Confluence - 在线的团队协作沟通工具,包含 meeting 管理, wiki 等等功能 https://www.atlassian.com/software/confluence

  6. 通过CLR API实现C++调用C#代码交互

    对于某些跨平台程序,这也就意味着只能在windows下使用了 不过最近.Net开源或许以后可以跨平台 之前花了一些时间研究COM方式调用,太繁琐不推荐. COM方式调用总结 后来尝试使用CLR C++ ...

  7. vue 和ng的区别

    vue:    读音:    v-u-e    view vue到底是什么?        一个mvvm框架(库).和angular类似        比较容易上手.小巧    mvc:       ...

  8. CMWAP上网补丁描述文件!!支持ios9

    由于ios移动4G使用cmnet网络,某些情况下需要使用cmwap,因此就有了这些文字... 两个网址都可以: http://www.clore.net/iphone/cmwap.html https ...

  9. Django教程:[33]从数据库生成模型

    在使用django做网站的时候,有时候我们的数据库来自一个已有的数据库,如何整合这个数据库呢? django提供了方便的方法来整合已有数据库,下面我们看看具体的方法: 1.先来设置数据库:在网站文件夹 ...

  10. Windows Phone实用教程:利用Blend为程序添加设计时数据

    [前言] Blend自诞生那一天起就伴随这开发者如此的评价: 有VS还用Blend干啥,直接码代码就好了. Blend会生成一堆垃圾无用代码,很不爽. 对于这类我只会在心里评价,当你并不真正了解一样事 ...