本章将实现MIPS32指令集架构中定义的加载存储指令,分两步:首先实现除ll、sc指令外的一般加载存储指令,其次实现比较特殊的加载存储指令ll、sc。
9.1 加载存储指令说明
MIPS指令集架构中定义的加载存储指令共有14条,如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/5282f02a2af041999f7470bb3b75f6e9.png)
9.1.1 加载指令lb,lbu,lh,lhu,lw说明
加载指令lb,lbu,lh,lhu,lw说明 从图中可知,这5条加载指令可以根据指令中26-31bit的指令码加以区分,另外,加载指令的第0-15bit是offset,第21-15bit是base,加载地址的计算方法如下,先将16位的offset符号扩展为32位,然后与地址为base的通用寄存器的值相加,即可得到加载地址。
![在这里插入图片描述](https://img-blog.csdnimg.cn/f2ae3e7e36e742c1bdef089bbcb32e04.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/731179f739bc44d9b51e51d2024c98e7.png)
9.1.2 存储指令sb,sh,sw说明
存储指令sb,sh,sw事物格式如图所示 从图中可知,这3条存储指令可以依据指令中26-31bit的指令码加以区分,另外,存储指令的第0-15bit是offset,第21-15bit是base,存储地址的计算方法如下,先将16位的offset符号扩展至32位,然后与地址为base的通用寄存器的值相加,即可得到存储地址。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8115b781d3ce43ebb82e6a74d8664faa.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16)
9.1.3 加载存储指令用法示例
OpenMIPS处理器是按照字节寻址,并且是大端模式,在这种模式下,数据的高位保存在存储器的低地址中,而数据的低位保存在存储器的高地址中。比如:使用指令sb在ox50处存储0x81,存储器中实际存储效果如图9-3所示。 使用指令sh在0x54处存储0x8281,存储器中实际存储效果如图9-4所示:
使用指令sw在0x58处存储0x84838281,存储器中实际存储效果如图9-5所示 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4b120eb21f874eeb91d5f411ddac3988.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/4df96fe042af465895709496cf4aa972.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16)
9.1.4 加载指令lwl、lwr说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/da746ff367064898b479b7448bf56c16.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/e5b32eca6f57490fa89f31c749c75002.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/c5d8e6426df74b15b354032d2aadbec0.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/54012e1b12d24fc9b99cedf33cd0b592.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/4c5190b1857347f5b9f69547d1f81cf1.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/9e1c387e257548eea46b6004d338747b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc2555983cdb4fbc8b2d985d30bea78a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16)
9.1.5 存储指令swl,swr说明
存储指令swl,swr的格式如图所示 ![在这里插入图片描述](https://img-blog.csdnimg.cn/35e0ba23cd05458cbd6b4f1eb36fdd45.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/6f894a039ef747248282a7cf973a0b2b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/5566c17fb16f46b6b3e74e8daea0e58c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_17,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/cc7c15a25178441fbdda1a39211e1b00.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/1d4f8ed62e0748a1bed5c9be408f063a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/f3ad0dfb67a446848783a284de814141.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/8efdf776ee1949cba4deae9e287df3a2.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/c5a08d07f60c43799f202d222b4552d1.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/26eeacecf48e41a19f12cfede062039f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/bea4e1b3674f412ab5e1eace253a5d45.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_17,color_FFFFFF,t_70,g_se,x_16)
9.2 加载存储指令实现思路
加载指令实现思路 加载指令在译码阶段进行译码,得到运算类型alusel_o、aluop_o,以及要写入的目的寄存器信息。这些信息传递到执行阶段,然后又传递到访存阶段,访存阶段依据这些信息,设置对数据存储器RAM的访问信号,从RAM读取回来的数据需要按照加载指令的类型,加载地址进行对齐跳调整,调整后的结果作为最终要写入目的寄存器的数据。存储指令实现思路 存储指令在译码阶段进行译码,得到运算类型alusel_o,sluop_o以及要存储的数据,这些信息传递到执行阶段,然后又传递到访存阶段,访存阶段依据这些信息,设置对数据存储器RAM的访问信号,将数据写入RAM。 需要特别注意的是:本章假设可以在一个时钟周期内完成对外部数据存储器RAM的读、写操作,在后续章节实现实践版OpenMIPS处理器的时候会考虑复杂情况
9.2.1 数据流图的修改
![在这里插入图片描述](https://img-blog.csdnimg.cn/cb075596497240819cdec756cb96f8c6.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/81495fa1796c480097669b9e7e91374a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16)
9.2.2 系统结构的修改
为了实现除ll,sc之外的加载存储指令,需要对系统结构进行修改,增加部分模块的接口,修改后系统结构如图所示 ![在这里插入图片描述](https://img-blog.csdnimg.cn/01e8505fbe334f2b8d7beadba72899a2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/eb5583bcc8f840b69f80089a70551a88.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5YiY55yf55qE5b6I5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16)
PS:由于后面我也是刚刚学习,再加上寒假变懒了,有点偷懒,后续可能精修文章
|