MIPS匯編指令集
MIPS有三種指令格式:
R型
6 | 5 | 5 | 5 | 5 | 6 |
op | rs | rt | rd | shamt | funct |
功能:寄存器-寄存器ALU操作 (算術運算,邏輯運算)
I型
6 | 5 | 5 | 16 |
op | rs | rt | 立即數操作 |
功能:條件分支,跳轉
J型
6 | 26 |
op | 跳轉地址 |
功能:跳轉
MIPS常用指令集
lb / lh / lw : 從存儲器中讀取一個byte/half word/word的數據到寄存器中.
sb/sh/sw: 把一個byte/half word/word的數據從寄存器存儲到存儲器中
mov/movz/movn
trap: 根據地址向量轉入管態。
eret: 從異常中返回到用戶態。
算術類:
add/addu: 把兩個定點寄存器的內容相加;u為不帶符號加,如 rd = rs + rt
addi/addiu: 把一個寄存器的內容加上一個立即數;u為不帶符號加。 rd = rs + im
sub/subu: 把兩個定點寄存器的內容相減。 rd = rs - rt
div/divu
mul/mulu: 兩個定點寄存器的內容相乘。
slt/slti/sltui: 如果rs的值小於rt,那麽設置rd的值為1,否則設置rd的值為0。 rd = (rs < rt) ? 1 : 0 ; rd = (rs < im) ? 1 : 0
邏輯類:
and/andi: 與運算,兩個寄存器中的內容相與 ;i為立即數。 rd = rs & rt ; rd = rs & im
or/ori: 或運算。 rd = rs | rt ; rd = rs | im
xor/xori: 異或運算。 rd = rs ^ rt ;rd = rs ^ im
nor/nori: 取反運算。 rd = !(rs | rt)
跳轉類:
j/jr/jal/jalr: j直接跳轉 PC = { (PC+4) [31,28] , addr, 00};jr使用寄存器跳轉 PC = rs; jal $31 = PC;PC = {(PC+4) [31,28],addr,00}
beq/beqz/benz/bne: 條件轉移eq相等,z零,ne不等。 beq , PC = (rs == rt) ? PC+4+im << 2 : PC ; bne , PC = (rs != rt) ? PC+4+im << 2 : PC
載入類:
lui: 把一個16位的立即數填入到寄存器的高16位,低16位補零。 rt = im * 65536(2^16)
lw: rt = memory[ rs + im]
sw: memory[ rs + im] = rt
位移類:
sll/srl: 邏輯左移/右移。 rd = rs << shamt ; rd = rs >> shamt
32個通用寄存器
MIPS下一共有32個通用寄存器 ;在匯編中,寄存器標誌由$符開頭。寄存器表示可以有兩種方式:直接使用該寄存器對應的編號,例如:從$0到$31;使用對應的寄存器名稱,例如:$t1, $sp。
0 ($zero) : 永遠返回值為0
1 ($at) : 用做匯編器的暫時變量
2-3 ($v0-$v1) : 子函數調用返回結果
4-7 ($a0-$a3) : 子函數調用的參數
8-15 ($t0-$t7) : 暫時變量,子函數使用時不需要保存與恢復
16-23($s0-$s7) : 子函數寄存器變量。子函數必須保存和恢復使用過的變量在函數返回之前,從而調用函數知道這些寄存器的值沒有變化。
24-25($t8-$t9) : 暫時變量,子函數使用時不需要保存與恢復
26-27($k0-$k1) : 通常被中斷或異常處理程序使用作為保存一些系統參數
28 ($gp) : 全局指針。一些運行系統維護這個指針來更方便的存取“static“和”extern”變量。
29 ($sp) : 堆棧指針
30 ($s8/$fp) : 第9個寄存器變量。子函數可以用來做楨指針
31 ($ra) : 子函數的返回地
cp0 :協處理器0,MIPS對CPU的控制用cp0完成
MIPS匯編指令集