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

时间:2022-12-30 09:22:28

我们会继续上传新书《

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所看到的。

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

  • 当指令中的指令码为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所看到的。

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

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

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

  • 当指令中的指令码为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所看到的。

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

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

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

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)

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

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

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

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

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

  2. ARM学习笔记4——加载存储指令

    一.字数据传送指令 作用:用于把单一的数据传入或者传出一个寄存器. 1.LDR指令 1.1.作用 根据<addr_mode>所确定的地址模式从内存中将一个32位的字段读取到目标寄存器&lt ...

  3. pytorch在CPU和GPU上加载模型

    pytorch允许把在GPU上训练的模型加载到CPU上,也允许把在CPU上训练的模型加载到GPU上.CPU->CPU,GPU->GPU torch.load('gen_500000.pkl ...

  4. 自己写的保证js顺序加载的方法

    var arr =["test1.js","test2.js","test3.js"] loadScripts:function(arr){ ...

  5. 利用python进行数据分析之数据加载存储与文件格式

    在开始学习之前,我们需要安装pandas模块.由于我安装的python的版本是2.7,故我们在https://pypi.python.org/pypi/pandas/0.16.2/#downloads ...

  6. Vue滚动加载自定义指令

    用Vue在移动端做滚动加载,使用mint-ui框架, InfiniteScroll指令loadmore组件,在uc浏览器和qq浏览器都无法触发.无奈我只能自己写了. 决定用vue 的自定义指令 写滚动 ...

  7. Java基础之写文件——使用Formatter对象加载缓冲区(UsingAFormatter&rpar;

    控制台程序,使用Formatter对象将写入文件的数据准备好. 使用Formatter对象的format()方法,将数据值格式化到视图缓冲区charBuf中. import static java.n ...

  8. 在Wmware虚拟机上如何检查是否CPU支持虚拟化 和 加载kvm模块

    在vm虚拟机中 修改 虚拟机==>设置==> 处理器==>虚拟化引擎(选第二项:虚拟化Intel VT-x/EPT 或 AMD-V/RVI(V) )     # vmx或svm :表 ...

  9. sudo&colon; 在加载插件&OpenCurlyDoubleQuote;sudoers&lowbar;policy”时在 &sol;etc&sol;sudo&period;conf 第 0 行出错 sudo&colon; &sol;usr&sol;lib&sol;sudo&sol;sudoers&period;so 必须只对其所有者可写 sudo&colon; 致命错误,无法加载插件

    解决办法:  su root chmod 644 /usr/lib/sudo/sudoers.so chown -R root /usr/lib/sudo 千万不要给 /usr 赋全部权限!!!   ...

随机推荐

  1. OpenCASCADE Coordinate Transforms

    OpenCASCADE Coordinate Transforms eryar@163.com Abstract. The purpose of the OpenGL graphics process ...

  2. 防刷新jq左侧滚动条导航展示

    html代码: <div class="fangchan_navcont">        <div class="fangchan_nav" ...

  3. Light oj 1197 - Help Hanzo &lpar;素数筛技巧&rpar;

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 给你a和b求a到b之间的素数个数. 先在小区间素数筛,大区间就用类似素数筛的想法 ...

  4. linux的fork函数

       fork函数  头文件:#include<unistd.h> 函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include&lt ...

  5. 使用div&plus;iframe实现弹窗及弹出内容无法显示的解决

    使用div+iframe实现弹窗 除了使用实际的弹出窗口,还可以使用控制一个div的display属性来模拟一个弹出窗口的操作,这里使用在Div里放一个iFrame的方式,主要考虑到可以在需要的时候加 ...

  6. easyui page添加文本,js验证码

    onLoadSuccess: function (db) { //db是后台数据的返回结果集 $.ajax({ url: "AjaxSource/Buex.ashx", data: ...

  7. 使MYSQL能被外部访问&lowbar;xeyuu&lowbar;新浪博客

    使MYSQL能被外部访问_xeyuu_新浪博客 使MYSQL能被外部访问 (

  8. gradle多模块开发&lpar;转&rpar;

    参考文档:gradle的官方userguide.pdf文档的chapter 55和chapter 56.gradle的多模块或项目开发一定不会比maven差,在我看来!大的项目分成多个模块来开发是常事 ...

  9. 读Zepto源码之代码结构

    虽然最近工作中没有怎么用 zepto ,但是据说 zepto 的源码比较简单,而且网上的资料也比较多,所以我就挑了 zepto 下手,希望能为以后阅读其他框架的源码打下基础吧. 源码版本 本文阅读的源 ...

  10. JavaScript(ES6)学习笔记-Set和Map数据结构(一)

    一.Set 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. , , , , ']); s; // ...