由于水平有限,在完成体系结构实验过程中对部分问题进行了整理,参考文章链接已经附在问题下。若有解释不当之处,还望各位朋友不吝赐教。
实验环境:
实验工具:WinMIPS64;
操作系统:Windows10 64位;
所用指令集:MIPS64(注意与MIPS32的区别)
1,MIPS指令集中add,addi,addu,dadd,add.d,add.s有什么区别?
参考@ Follow_My_Heart 【MIPS 指令集(共31条)】、@frozenshore 【mips指令与寄存器详解】、@Wo_der 【MIPS64寄存器与指令集】
指令 | 功能 | 示例 | 描述 |
add | 普通加法 | add $1, $2, $3 | $1 = $2 + $3 |
addi | 第二个操作数是立即数 | addi $1, $2, 100 | $1 = $2 + 100 |
addu | 无符号数相加 | addu $1, $2, $3 | $1 = $2 + $3 |
dadd | MIPS64指令集中add变为dadd | dadd $1, $2, $3 | $1 = $2 + $3 |
add.d | 把一个双精度浮点数加上一个单精度浮点数,结果是双精度浮点数 | add.d f0, f1, f2 | $f0 = $f1 + $f2 |
add.s | 把一个单精度浮点数加上一个双精度浮点数,结果是单精度浮点数 | add.s f0, f1, f2 | $f0 = $f1 + $f2 |
总结一下就是:add后的i/u表示是立即数/无符号数;add前的d表示用的是MIPS64指令集;add.后的d/s表示浮点数相加结果是双精度/单精度;
2,Rs、Rt、Rd分别指什么?
$Rd表示目的寄存器Destination Register , $Rs表示源寄存器Source Register ,$Rt表示作为中间缓存的目标寄存器Target Register ;
3,MIPS中的结构冲突具体怎么表现?
主要包括访存冲突:即同时访问存储器,比如一条指令准备从存储器中取出数据时,另一条指令准备从存储器中取出指令,或者是两条指令同时使用存储器【如张晨曦老师教材《计算机体系结构》第2版中,P69介绍】
在WinMIPS64中,相邻两条除法指令也会导致Structural Hazard(可以在Configure/Architecture中修改Division Latency,来改变结构冲突的周期数);
此外,流水线寄存器的限制也会导致Structural Hazard,比如(不需要勾选Enable Forwarding)
.data
A: .double 8
B: .double 2
C: .double 0
.text
main:
l.d f0,A(r0)
l.d f1,B(r0)
mul.d f3, f0, f1
mul.d f4, f0, f1
mul.d f5, f0, f1
mul.d f6, f0, f1
s.d f3,C(r0)
halt
注意:结构冲突不仅需要考虑MEM是否冲突,而且需要考虑涉及到的其他资源,比如流水线寄存器(为了保证存储每一步输出结果)
比如,算术类指令虽然没有用到MEM,但还是使用了寄存器来暂存一个阶段的值,这时由于流水线寄存器的资源限制(ALU/MEM.ALUo),仍会产生结构冲突。
4,Cycles窗口中“Str”什么意思?
Structural Hazard结构冲突
5,MIPS指令集中s.d rt,imm(rs)中imm(rs)是什么意思?
将rt寄存器中存放的值保存到rs寄存器中存放的值加上立即数imm进行符号扩展后得到的扩展立即数所得的内存地址的内存单元中,即
memory[rs + (SignExtend)immediate] 《-- rt;(其中rs经常取值为r0)
6,数据段.data中定义数据,什么时候用.word什么时候用.double?
整数运算的时候使用.word,并且指令格式为ld、sd、dadd、dmul...;
浮点运算的时候使用.double,并且指令格式为l.d、s.d、add.d、mul.d...;