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

我们会继续上传新书《

q=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99CPU&ie=utf-8&src=se_lighten_quotes_f" style="color:rgb(0,0,240); text-decoration:none; position:static; display:inline">自己动手写CPU》,今天是第39篇,我尽量每周四篇。可是近期已经非常久没有实现这个目标了,一直都有事。不好意思哈。

开展晒书评送书活动,在亚马逊、京东、当当三大图书站点上,发表《

q=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99CPU&ie=utf-8&src=se_lighten_quotes_f" style="color:rgb(0,0,240); text-decoration:none; display:inline; position:static">自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书。大家踊跃參与吧!

活动时间:2014-9-11至2014-10-30

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

9.1.5 存储指令swl、swr说明

存储指令swl、swr的格式如图9-12所看到的。

  • 当指令中的指令码为6‘b101010时。是swl指令。非对齐存储指令。向左存储

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

指令作用为:将地址为rt的通用寄存器的高位部分存储到内存中指定的地址处,存储地址的最后两位确定了要存储rt通用寄存器的哪几个字节。swl指令对存储地址没有对齐要求,这是与前面介绍的sh、sw指令的不同之处。在大端模式、小端模式下,swl指令的效果不同,由于OpenMIPS是大端模式。所以此处仅仅介绍在大端模式下swl指令的效果。如果计算出来的存储地址是storeaddr,storeaddr最低两位的值为n,storeaddr最低两位设为0后的值称为storeaddr_align,例如以下。

存储地址storeaddr = signed_extended(offset) + GPR[base]

n = storeaddr[1:0]

storeaddr_align = storeaddr – n

比如:如果计算出来的存储地址是5,swl指令要向地址5存储数据,那么storeaddr就等于5,n等于1,storeaddr_align等于4。

swl指令的作用是将地址为rt的通用寄存器的最高4-n个字节存储到地址storeaddr处。

继续上例。此时storeaddr_align为4,n为1,所以将地址rt的通用寄存器的最高3个字节存储到从地址5開始处。相应的是地址为5、6、7的三个字节,如图9-13所看到的。

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

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

  • 当指令中的指令码为6‘b101110时。是swr指令,非对齐存储指令,向右存储

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

指令作用为:将地址为rt的通用寄存器的低位部分存储到内存中指定的地址处,存储地址的最后两位确定了要存储rt通用寄存器的哪几个字节。

还是如果计算出来的存储地址是storeaddr。storeaddr的最低两位的值为n,storeaddr最低两位设为0后的值称为storeaddr_align。例如以下。

存储地址storeaddr = signed_extended(offset) + GPR[base]

n = storeaddr[1:0]

storeaddr_align = storeaddr – n

比如:如果计算出来的存储地址是9,swr指令要向地址9存储数据,那么storeaddr就等于9,n等于1,storeaddr_align等于8。

swr指令的作用是将地址为rt的通用寄存器的最低n+1个字节存储到地址storeaddr_align处。

继续上例。此时storeaddr_align为8。n为1,所以将地址rt的通用寄存器的最低2个字节存储到从地址8開始处,相应的是地址为8、9的两个位置,如图9-15所看到的。一个更加通用的描写叙述如图9-16所看到的。

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

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

sll $2, $1, 24       # 要存储的数据在$1中。将$1的最高字节存储到$2
sb  $2, 7($0)        # 存储最高字节到地址为7的内存处
sll $2, $1, 8        # 将$1的第2、1字节保存到$2中
sh  $2, 8($0)        # 存储第2、1字节到地址为8、9的内存处
sb  $1, 10($0)       # 存储第0字节到地址为10的内存处

而有了swl、swr指令后,仅仅须要2条指令就可以。例如以下。图9-17是对这个过程的描写叙述。

swl $1, 7($0)
swr $1, 10($0)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-12-29 07:49:45

自己写CPU第九阶段(3)——加载存储指令说明2(swl、swr)的相关文章

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

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

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

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

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

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

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

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

自己写CPU第九阶段(5)——实现负载存储指令2(改变运行阶段)

我们会继续上传新书<自己动手写CPU>.今天是第42篇.我尽量每周四篇,可是近期已经非常久没有实现这个目标了,一直都有事.不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9%AC%E9%80%8A&ie=utf-8&src=se_lighten_f" target="_blank" style="position:static; display:inline; color:rgb(51,102,153); text-d

【汇编指令】arm指令集之但寄存器数据load/store (加载存储)

数据的传送: LDR              STR                   .WORD LDRB            STRB              .BYTE LDRH             STRH            .HALFWORD LDR 和STR 加载/存储字和无符号字节指令.使用单一数据传送指令(STR 和LDR)来装载和存储单一字节或字的数据从/到内存.LDR指令用于从内存中读取数据放入寄存器中:STR 指令用于将寄存器中的数据保存到内存.指令格式如下

or1200中加载存储类指令说明

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 OR1200中实现的加载存储类指令有8条,每条指令的作用与说明如表9.1所示. 说明一点:在第2章建立的最小系统没有配置使用MMU,所以有效地址等于物理地址. 加载存储类指令的助记符也很好理解记忆,第一位是's'表示存储指令,'l'表示加载指令:第二位是'b'表示对字节操作,'h'表示对半字操作,'w'表示对字操作:第三位是'z'表示零扩展,'s'表示符号扩展.据此可以对指令进行简称,如:l.sb指令可以简称为存储字节指令.l.lwz指令

32.自己写的一个简单的加载插件

js /* loader.js version:1.0 author:lgw */ (function($) { "use strict"; $.fn.loader = function(options) { return this.each(function(e) { var that = $(this) $.fn.loader.defaultOptions = { isLoading:false, type:"ball-beat", callBack: func

基于jquery和knockout.js 写个瀑布流异步加载分页

<div class="list-view"> <ul> <li data-bind="foreach:datalst"> <div class="item border clearfix"> <div class="face fl"> <a target="_blank" data-bind="attr:{'title':user