由於水平有限,在完成體系結構實驗過程中對部分問題進行了整理,參考文章鏈接已經附在問題下。若有解釋不當之處,還望各位朋友不吝賜教。
實驗環境:
實驗工具: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...;