1. 程式人生 > >MIPS匯編指令集

MIPS匯編指令集

指令 通用 返回值 協處理器 內容 borde 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

: 復制,n為負,z為零。mov $1,$2; movz $1,$2,$3($3為零則復制$2到$1)。
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匯編指令集