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

将陆续上传新书《自己动手写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" >

时间: 2024-09-30 15:55:04

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

自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)

将陆续上传新书<自己动手写CPU>,今天是第42篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 9.3.2 修改执行阶段 1.修改EX模块 在执行阶段的EX模块会计算加载存储的目的地址,参考图9-19可知,EX模块会增加部

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

将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到访问链接状态位LLbit,可以将LLbit当做寄存器处理,ll指令需要写该寄存器,sc指令需要读该寄存器,同时,与对通用寄存器的访问一样,对LLbit寄存器的写操作也放在回写阶段进行. ll指令在访存阶段要读取数据存储器中指定地址的数据,还要设置对LLbit寄存器的写操作,写入的值为1,这个写操作会通过MEM/WB模块传递到回写阶段,最终实现对LLbit寄存器的写. s

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

将陆续上传新书<自己动手写CPU>,今天是第40篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 9.2 加载存储指令实现思路 9.2.1 实现思路 本节介绍除ll.sc之外的加载存储指令的实现思路,ll.sc指令的实现思路

自己动手写CPU之第九阶段(9)——修改OpenMIPS以实现ll、sc指令

将陆续上传新书<自己动手写CPU>,今天是第48篇. 9.8 修改OpenMIPS以实现ll.sc指令 9.8.1 LLbit寄存器的实现 LLbit寄存器在LLbit模块中实现,模块接口如图9-30所示,各接口描述如表9-8所示. LLbit寄存器的代码如下,源文件是本书光盘Code\Chapter9_2目录下的LLbit_reg.v文件. module LLbit_reg( input wire clk, input wire rst, // 异常是否发生,为1表示异常发生,为0表示没有异

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

将陆续上传新书<自己动手写CPU>,今天是第38篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-20 今天继续对MIPS32中加载存储指令进行说明(主要是lwl.lwr),上次已经介绍一些其他的加载存储指令,大家可以回顾. 9.

自己动手写CPU之第九阶段(6)——修改最小SOPC

将陆续上传新书<自己动手写CPU>,今天是第45篇. 这几天事情多,好久没更新了 前几篇实现了加载存储指令,今天将修改最小SOPC,用以测试加载存储指令是否实现正确.闲话少说,进入正题. 9.4 修改最小SOPC 为了验证上一节添加的加载存储指令是否实现正确,需要修改在第4章中设计的最小SOPC,为其添加数据存储器RAM. 9.4.1 添加数据存储器RAM 数据存储器RAM的接口如图9-24所示,还是采用左边是输入接口,右边是输出接口的方式绘制,这样便于理解.接口含义如表9-7所示. 数据存储

自己动手写CPU之第九阶段(3)——加载存储指令说明2(swl、swr)

将陆续上传新书<自己动手写CPU>,今天是第39篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 今天继续对MIPS32中加载存储指令进行说明(主要是swl.swr),上次已经介绍一些其他的加载存储指令,大家可以回顾. 9.

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

将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储加载指令:链接加载指令LL.条件存储指令SC,本次将介绍这两条指令,在后续将实现这两条指令. 9.6 链接加载指令ll.条件存储指令sc说明 在本章前面的部分,笔者花费很多笔墨介绍了OpenMIPS中除ll.sc之外的加载.存储指令的实现过程,本节至9.9节将专门介绍链接加载指令ll.条件存储指令sc的实现过程.ll.sc指令是MIPS32指令集架构中比较特殊的加载存储指令,用来实现信号量机制. 在多线

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

将陆续上传本人写的新书<自己动手写CPU>,今天是第25篇,我尽量每周四篇 亚马逊的预售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 China-pub的预售地址如下: http://product.china-pub.com/3804025 7.2 简单算术操作指令实现思路 虽然简单算术操作指令的数目比较多,有15条,但实现方式都是相似的,与前几章逻辑.移位操作指令的实现方式也