MIPSのまとめ（教科書3.7節～3.8節， 4.1節～4.4節）

レジスタ
MIPS のレジスタ
レジスタ名

レジスタ番号$zero0$v0～$v1

用途

関数呼出時のレジスタ破壊

定数値 0，不要な結果の破棄

(NA)

2～3

関数の返り値

可$a0～$a3

4～7

引数用

不可

$t0～$t7

8～15

一時保存用

可

$s0～$s7

16～23

変数用

不可

$t8～$t9

24～25

一時保存用

可

$sp

29

スタックポインタ（後述）

不可

$fp

30

フレームポインタ（後述）

不可

$ra31

戻り番地

不可

プログラムカウンタ PC： 次に実行する命令の番地を格納．非分岐命令実行ごとに +4 され，また分岐命令実行時に更新される．
九州大学工学部電気情報工学科（2006年度）

命令形式
命令形式: 命令語のフィールド構成．
z MIPS は命令語を32bit 幅で統一している．
z MIPS の命令形式は，R形式，I形式，J形式の3種類がある．
z どの命令形式かは，op フィールド（命令操作コード）で判別できる．

R形式

I形式

J形式

oprsrtrdshamt

funct

6bit

5bit

5bit

5bit

5bit

6bit

oprsrtaddress/immediate

6bit

5bit

5bit

16bit

op

address

6bit

26bit
九州大学工学部電気情報工学科（2006年度）

命令セットz 算術論理演算¾ 加減算命令（R形式，I形式）¾ 比較命令（R形式，I形式）¾ 論理演算命令（R形式，I形式）¾ シフト命令（R形式）

z データ転送¾ メモリロード命令（I形式）¾ メモリストア命令（I形式）¾ 即値ロード命令（I形式）z 分岐¾ 条件分岐命令（I形式）¾ 無条件分岐命令（R形式，J形式）
九州大学工学部電気情報工学科（2006年度）

加減算命令（１）レジスタ±レジスタ → レジスタ
add
subaddusubu$○, $△, $□$○, $△, $□$○, $△, $□$○, $△, $□# $△ + $□ → $○# $△ – $□ → $○# $△ + $□ → $○# $△ – $□ → $○z add/sub 命令は，2の補数表現された符号つき整数の加減算を行う．
z addu/subu 命令は，符号なし整数の加減算を行う．
z add/sub 命令と addu/subu 命令はオーバーフロー発生時の振る舞いが違う．（計算については同じことを行う．）
九州大学工学部電気情報工学科（2006年度）

加減算命令（２）
R形式

op

rsrt

rd

shamt

funct

6bit

5bit

5bit

5bit

5bit

6bit

op

rsrt

rd

shamt

funct

add $○, $△, $□000000

$△

$□

$○

00000

100000addu $○, $△, $□000000

$△

$□

$○

00000

100001

sub $○, $△, $□000000

$△

$□

$○

00000

100010subu $○, $△, $□000000

$△

$□

$○

00000

100011

命令

九州大学工学部電気情報工学科（2006年度）

加減算命令（３）レジスタ + 定数 → レジスタ
addi
addiu

$○, $△, n$○, $△, n# $△ + n → $○# $△ + n → $○即値オペランドz addi/addiu 命令では，定数 n に 16bit の2の補数表現の符号つき整数（–32768～32767）を指定できる．
z 定数 n は 32bit に符号拡張されてから加算される．
z addi 命令と addiu 命令はオーバーフロー発生時の振る舞いが違う．（計算については同じことを行う．）
z 「subi」「subiu」は存在しない．（∵addi，addiu で代用すればよい．）
九州大学工学部電気情報工学科（2006年度）

加減算命令（４）I形式

oprsrtaddress/immediate

6bit

5bit

5bit

16bit

op

rsrt

address/immediate

addi $○, $△, n001000$△$○naddiu $○, $△, n001001

$△

$○

n

命令

九州大学工学部電気情報工学科（2006年度）

加減算命令（５）例） $s1 に 65539 が格納されているとき，
addi$s0, $s1, 1300000000 00000001+) 00000000 00000000
00000000 00000001
addi

00000000 00000011
00000000 00001001
00000000 00001100$s1: 65539(10)13(10)$s0: 65552(10)00000000 00000011
11111111 11110111
11111111 11111010$s1: 65539(10)–13(10)$s0: 65526(10)$s0, $s1, –13

00000000 00000001+) 11111111 11111111
00000000 00000000

九州大学工学部電気情報工学科（2006年度）

比較命令（１）レジスタ < レジスタ → レジスタ
slt
sltu

$○, $△, $□$○, $△, $□# $△ < $□ → $○# $△ < $□ → $○レジスタ < 定数 → レジスタ（定数は 32bit に符号拡張）
slti
sltiu

$○, $△, n$○, $△, n# $△ < n → $○# $△ < n → $○z slt/slti 命令は，第二オペランドと第三オペランドを 2 の補数表現された符号つき整数とみなして，比較結果を $○ に書き込む．
z sltu/sltiu 命令は，第二オペランドと第三オペランドを符号なし整数とみなして，比較結果を $○ に書き込む．
z slti/sltiu 命令では，定数 n は 32bit に符号拡張されてから比較される．
九州大学工学部電気情報工学科（2006年度）

論理演算命令（１）レジスタ and/or レジスタ → レジスタ
andor
xor

$○, $△, $□$○, $△, $□$○, $△, $□# $△ & $□ → $○# $△ | $□ → $○# $△ ^ $□ → $○レジスタ and/or 定数 → レジスタ（定数は 32bit にゼロ拡張）
andi
ori
xori

$○, $△, n$○, $△, n$○, $△, n# $△ & n → $○# $△ | n → $○# $△ ^ n → $○九州大学工学部電気情報工学科（2006年度）

論理演算命令（２）ANDゲート： 入力が全て 1 のときのみ出力が 1．
AYBABY0000

10100111

AND演算（&）： オペランドのビットごとに AND をとる．
110111100101100010100000九州大学工学部電気情報工学科（2006年度）

シフト命令（１）レジスタを n ビット論理左右シフト → レジスタsll
srl$○, $△, n$○, $△, n# $△ を n ビット論理左シフト → $○# $△ を n ビット論理右シフト → $○レジスタを n ビット算術右シフト → レジスタ
sra$○, $△, n# $△ を n ビット算術右シフト → $○九州大学工学部電気情報工学科（2006年度）

シフト命令（２）n ビット論理シフト演算: n ビット分を左右にずらし，はみ出したビットを捨てて，空いたビットに 0 を補填する．
n ビット左シフト:
0 1 1 1 0 1 1 0n=2の場合
0 1 1 1 0 1 1 0 0 0
n ビット右シフト:
0 1 1 1 0 1 1 0
n=2の場合0 0 0 1 1 1 0 1 1 0
九州大学工学部電気情報工学科（2006年度）

シフト命令（３）n ビット算術右シフト演算: n ビット分を右にずらし，はみ出したビットを捨てて，空いたビットに 最上位ビット（符号ビット） を補填する．
n ビット右シフト:
1 1 1 1 0 1 1 0

n=2の場合1 1 1 1 1 1 0 1 1 0

九州大学工学部電気情報工学科（2006年度）

データ転送命令（１）レジスタ／メモリ間（符号つき）
lw
lh
lhu
lb
lbu
sw
shsb

$○, n($△)$○, n($△)$○, n($△)$○, n($△)$○, n($△)$○, n($△)$○, n($△)$○, n($△)# （$△ + n）番地 → $○，1ワード（32bit）# （$△ + n）番地 → $○，1ハーフワード（16bit）# （$△ + n）番地 → $○，1ハーフワード（16bit）# （$△ + n）番地 → $○，1バイト（8bit）# （$△ + n）番地 → $○，1バイト（8bit）# $○ → （$△ + n）番地，1ワード（32bit）# $○ → （$△ + n）番地，1ハーフワード（16bit）# $○ → （$△ + n）番地，1バイト（8bit）

z オフセット n には，16bit の2の補数表現の整数（–32768～32767）を指定できる．
z オフセット n は 32bit に符号拡張されてからベースレジスタに加算される．
z lw/sw 命令の対象番地は4の倍数，lh/sh 命令の対象番地は2の倍数でなければならない．（整列化制約）
z lb/lh 命令では読み込むデータの符号拡張，lbu/lhu 命令ではゼロ拡張が行われる．
九州大学工学部電気情報工学科（2006年度）

データ転送命令（２）lw/lh/lb/lhu/lbu/sw/sh/sb $○, n($△)$○–32768

$△

zzzz
+n
32767

abcdlw/sw

a b c dlh/sh

X X a blhu

0 0 a blb/sb

X X X albu

0 0 0 a

九州大学工学部電気情報工学科（2006年度）

データ転送命令（４）即値→レジスタlui$○, n# $○の上位 16bit に n を格納# $○の下位 16bit に 0 を格納$○

n0000…00

32bit 即値（nm）の転送
lui$○, naddi $○, mluiori$○, n$○, m# $○の上位 16bit に n を格納# $○の下位 16bit に m を格納（符号拡張あり）# $○の上位 16bit に n を格納# $○の下位 16bit に m を格納（符号拡張なし）
九州大学工学部電気情報工学科（2006年度）

分岐命令（１）jjaljrbeqbneLabel
Label$○$△, $□, Label$△, $□, Label# Label に無条件分岐# Label に無条件分岐（関数呼出用）# $○の番地に無条件分岐# $△ = $□ ならば Label に分岐# $△ ≠ $□ ならば Label に分岐

z 命令によってジャンプできる範囲に違いがある．
¾j, jal（J形式）：擬似直接アドレシング¾jr（R形式）：レジスタ値をそのままPCに設定¾beq, bne（I形式）：PC相対アドレシング

九州大学工学部電気情報工学科（2006年度）

分岐命令の守備範囲
00000000
10000000

PC相対アドレシング（PCを中心に 218 番地の範囲）

20000000
30000000
40000000
50000000

PC
JR命令は全域

60000000
70000000

擬似直接アドレシング（PCを含むに 228 番地分のページ）

D0000000
E0000000
F0000000
九州大学工学部電気情報工学科（2006年度）