将陆续上传新书《自己动手写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. Linux内核开发之异步通知与异步I/O(一)

    “小王,听说过锦上添花吧..”我拍拍下王的头说. “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我. “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东 ...

  2. MySQL-EXPLAIN用法详解

    今天做一个订单任务, 其中需要查有无此订单号信息, 由于订单号是个列表, 所以想检测下如下语句的性能(主要在LIMIT 1上) "订单号 IN (订单号列表)" LIMIT 1 然 ...

  3. css-input与文字的对齐

    前言 目前中文网站上面的文字,就我的个人感觉而言,绝大多数网站的主流文字大小为12px,因为在目前高分辨率显示器屏幕下,11px的汉字,其像素点开始不 规整,文字不如12px来的显示良好.12px大小 ...

  4. Zoie中文文档及简单解析

    https://linkedin.jira.com/wiki/pages/viewpage.action?pageId=4456480 一.总体架构 Zoie是一个实时的搜索引擎系统,其需要逻辑上独立 ...

  5. [Windows驱动开发](三)基础知识——驱动例程

    一.NT式驱动的基本例程 1. 驱动入口函数——DriverEntry // 驱动程序的一般性定义 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObje ...

  6. 给Editplus去掉.bak文件

    Tools-->Configure User Tools-->Files-->去掉create bacup file when saving前复选框的对号.

  7. CMD查看进程ID并查杀进程

    开始-运行,输入CMD打开命令行界面,输入命令netstat -ano 结束该进程C:\>taskkill /f /t /im Wiz.exe 根据进程ID杀 >taskkill /F / ...

  8. Node.js验证码模块captchapng

    captchapng是一个基于pnglib模块开发,数字型验证码模块.内置字体.全JavaScript无其它依赖.不像有的验证码需要依赖canvas或者是需要编译,而且captchapng使用起来简单 ...

  9. dom写xml

    1.引入包 import xml.dom.minidom 2.writexml方法 writexml(writer, indent, addindent, newl, encoding) writer ...

  10. 关于搭配junit 和JUnit报initializationError的解决方法

    关于junit是什么就不复述了,网上有 junit的source code是可以下载的,各个版本都有 地址:https://github.com/junit-team 通过junit 的source ...