R格式指令
基本格式
| 標(biāo)記 |
op |
rs |
rt |
rd |
shamt |
funct |
| 位數(shù) |
31-26 |
25-21 |
20-16 |
15-11 |
10-6 |
5-0 |
| 功能 |
操作符 |
源操作數(shù)寄存器1 |
源操作數(shù)寄存器2 |
目的操作數(shù)寄存器 |
位移量 |
操作符附加段 |
指令
算數(shù)類指令
| 指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
| add |
000000 |
rs |
rt |
rd |
00000 |
100000 |
rd=rs+rt |
| addu |
000000 |
rs |
rt |
rd |
00000 |
100001 |
rd=rs+rt(無符號數(shù)) |
| sub |
000000 |
rs |
rt |
rd |
00000 |
100010 |
rd=rs-rt |
| subu |
000000 |
rs |
rt |
rd |
00000 |
100011 |
rd=rs+rt(無符號數(shù)) |
| slt |
000000 |
rs |
rt |
rd |
00000 |
101010 |
rd=(rs<rt)?1:0 |
| sltu |
000000 |
rs |
rt |
rd |
00000 |
101011 |
rd=(rs<rt)?1:0(無符號數(shù)) |
邏輯類指令
| 指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
| and |
000000 |
rs |
rt |
rd |
00000 |
100100 |
rd=rs&rt |
| or |
000000 |
rs |
rt |
rd |
00000 |
100101 |
rd=rs|rt |
| xor |
000000 |
rs |
rt |
rd |
00000 |
100110 |
rd=rs xor rd |
| nor |
000000 |
rs |
rt |
rd |
00000 |
100111 |
rd=!(rs|rt) |
位移類指令
| 指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
| sll |
000000 |
00000 |
rt |
rd |
shamt |
000000 |
rd=rt<<shamt |
| srl |
000000 |
00000 |
rt |
rd |
shamt |
000010 |
rd=rt>>shamt |
| sra |
000000 |
00000 |
rt |
rd |
shamt |
000011 |
rd=rt>>shamt(符號位保留) |
| sllv |
000000 |
rs |
rt |
rd |
00000 |
000100 |
rd=rt<<rs |
| srlv |
000000 |
rs |
rt |
rd |
00000 |
000110 |
rd=rt>>rs |
| srav |
000000 |
rs |
rt |
rd |
00000 |
000111 |
rd=rt>>rs(符號位保留) |
跳轉(zhuǎn)指令
| 指令 |
op |
rs |
rt |
rd |
shamt |
funct |
功能 |
| jr |
000000 |
rs |
00000 |
00000 |
00000 |
001000 |
PC=rs |
I格式指令
基本格式
| 標(biāo)記 |
op |
rs |
rd |
im |
| 位數(shù) |
31-26 |
25-21 |
20-16 |
15-0 |
| 功能 |
操作符 |
源操作數(shù)寄存器 |
目的操作數(shù)寄存器 |
立即數(shù) |
指令
算數(shù)指令
| 指令 |
op |
rs |
rd |
im |
功能 |
| addi |
001000 |
rs |
rd |
im |
rd=rs+im |
| addiu |
001001 |
rs |
rd |
im |
rd=rs+im(無符號數(shù)) |
| slti |
001010 |
rs |
rd |
im |
rd=(rs<im)?1:0 |
| sltiu |
001011 |
rs |
rd |
im |
rd=(rs<im)?1:0(無符號數(shù)) |
邏輯類指令
| 指令 |
op |
rs |
rd |
im |
功能 |
| andi |
001100 |
rs |
rd |
im |
rd=rs&im |
| ori |
001101 |
rs |
rd |
im |
rd=rs|im |
| xori |
001110 |
rs |
rd |
im |
rd=rs xor im |
載入類指令
| 指令 |
op |
rs |
rd |
im |
功能 |
| lui |
001111 |
00000 |
rd |
im |
rt=im*65536 |
| lw |
100011 |
rs |
rd |
im |
rt=memory[rs+im] |
| sw |
101011 |
rs |
rd |
im |
memory[rs+im]=rt |
跳轉(zhuǎn)類指令
| 指令 |
op |
rs |
rd |
im |
功能 |
| beq |
000100 |
rs |
rd |
im |
PC=(rs==rt)?PC+4+im<<2:PC |
| bne |
000101 |
rs |
rd |
im |
PC=(rs!=rt)?PC+4+im<<2:PC |
J格式指令
基本格式
| 標(biāo)記 |
op |
address |
| 位數(shù) |
31-26 |
25-0 |
| 功能 |
操作符 |
地址 |
指令
| 指令 |
op |
address |
功能 |
| j |
000010 |
addr |
PC={(PC+4)[31,28],addr,00} |
| jal |
000011 |
addr |
$31=PC;PC={(PC+4)[31,28],addr,00} |
指令分析
指令格式
不同格式的指令具有不同的功能,其中:
- R格式指令為純寄存器指令,所有的操作數(shù)(除移位外)均保存在寄存器中。Op字段均為0,使用funct字段區(qū)分指令
- I格式指令為帶立即數(shù)的指令,最多使用兩個寄存器,同時包括了load/store指令。使用Op字段區(qū)分指令
- J格式指令為長跳轉(zhuǎn)指令,僅有一個立即數(shù)操作數(shù)。使用Op字段區(qū)分指令
數(shù)據(jù)通路
以上的指令包括以下幾種與指令有關(guān)的數(shù)據(jù)通路:
- 指令——寄存器組:R格式指令均為寄存器指令,需要指令提供寄存器地址
- 指令——運算單元(ALU):運算指令由指令提供運算類型,同時提供參與運算的立即數(shù)和位移量
- 指令——存儲器:load/store指令的尋址方式僅為寄存器偏移量尋址,需要指令提供立即數(shù)偏移量
- 指令——PC:J格式指令需要將指令中的立即數(shù)載入PC中
同時還有幾種必備的與指令無關(guān)的數(shù)據(jù)通路:
- 寄存器組——運算單元(ALU):寄存器組為運算單元提供操作數(shù),運算結(jié)果存在寄存器組中
- 寄存器組——存儲器:load/store指令的兩端
- 寄存器組——PC:跳轉(zhuǎn)指令與寄存器組有關(guān)
當(dāng)使用哈弗結(jié)構(gòu)時,數(shù)據(jù)通路框圖如下所示:
流水線劃分
若使用流水線實現(xiàn),可以將流水線劃分為:取指->譯碼->準(zhǔn)備操作數(shù)->執(zhí)行->回寫四個階段:
- 取指階段:按PC從指令寄存器中取出完整的32位指令,之后PC自增
- 譯碼階段:按指令的高6位(Op字段)將指令解釋為相應(yīng)的格式
- 準(zhǔn)備操作數(shù)階段:按指令中的對應(yīng)字段準(zhǔn)備操作數(shù),包括:計算地址(load/store指令),取出寄存器中的操作數(shù)置于數(shù)據(jù)總線(寄存器指令),計算PC值(跳轉(zhuǎn)指令)等
- 執(zhí)行階段:執(zhí)行指令,包括:訪問存儲器(load/store指令),ALU運算(計算類指令),刷新PC值(跳轉(zhuǎn)指令)等
- 回寫階段:將結(jié)果存入寄存器中,包括:ALU的運算結(jié)果(計算類指令),訪存結(jié)果(load指令),原PC值(帶返回跳轉(zhuǎn)指令)等
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。