ソフトウェア基礎技術研修

MIPSのまとめ
(教科書3.7節~3.8節, 4.1節~4.4節)
Created by Tsuneo Nakanishi, 2002-2004
レジスタ
MIPS のレジスタ
レジスタ名
レジスタ番号
用途
関数呼出時のレジスタ破壊
$zero
0
$v0~$v1
2~3
関数の返り値
$a0~$a3
4~7
引数用
$t0~$t7
8~15
一時保存用
$s0~$s7
16~23
変数用
$t8~$t9
24~25
一時保存用
$sp
29
スタックポインタ(後述)
不可
$fp
30
フレームポインタ(後述)
不可
$ra
31
戻り番地
不可
定数値 0,不要な結果の破棄
(NA)
可
不可
可
不可
可
プログラムカウンタ PC: 次に実行する命令の番地を格納.非分岐命令実行ご
とに +4 され,また分岐命令実行時に更新される.
Created by Tsuneo Nakanishi, 2002-2004
命令形式
命令形式: 命令語のフィールド構成.
 MIPS は命令語を32bit 幅で統一している.
 MIPS の命令形式は,R形式,I形式,J形式の3種類がある.
 どの命令形式かは,op フィールド(命令操作コード)で判別できる.
R形式
I形式
J形式
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
op
rs
rt
address/immediate
6bit
5bit
6bit
16bit
op
address
6bit
26bit
Created by Tsuneo Nakanishi, 2002-2004
加減算命令(1)
レジスタ±レジスタ → レジスタ
add
sub
addu
subu
$○, $△, $□
$○, $△, $□
$○, $△, $□
$○, $△, $□
# $△ + $□ → $○
# $△ – $□ → $○
# $△ + $□ → $○
# $△ – $□ → $○
 add/sub 命令は,2の補数表現された符号つき整数の加減算
を行う.
 addu/subu 命令は,符号なし整数の加減算を行う.
 add/sub 命令と addu/subu 命令はオーバーフロー発生時の
振る舞いが違う.(計算については同じことを行う.)
Created by Tsuneo Nakanishi, 2002-2004
加減算命令(2)
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
op
rs
rt
rd
shamt
funct
add $○, $△, $□
000000
$△
$□
$○
00000
100000
addu $○, $△, $□
000000
$△
$□
$○
00000
100001
sub $○, $△, $□
000000
$△
$□
$○
00000
100010
subu $○, $△, $□
000000
$△
$□
$○
00000
100011
R形式
命令
Created by Tsuneo Nakanishi, 2002-2004
加減算命令(3)
レジスタ + 定数 → レジスタ
addi
addiu
$○, $△, n
$○, $△, n
# $△ + n → $○
# $△ + n → $○
即値オペランド
 addi/addiu 命令では,定数 n に 16bit の2の補数表現の符号
つき整数(–32768~32767)を指定できる.
 定数 n は 32bit に符号拡張されてから加算される.
 addi 命令と addiu 命令はオーバーフロー発生時の振る舞い
が違う.(計算については同じことを行う.)
 「subi」「subiu」は存在しない.(∵addi,addiu で代用すればよ
い.)
Created by Tsuneo Nakanishi, 2002-2004
加減算命令(4)
op
rs
rt
address/immediate
6bit
5bit
5bit
16bit
op
rs
rt
address/immediate
addi $○, $△, n
001000
$△
$○
n
addiu $○, $△, n
001001
$△
$○
n
I形式
命令
Created by Tsuneo Nakanishi, 2002-2004
加減算命令(5)
例) $s1 に 65539 が格納されているとき,
addi
$s0, $s1, 13
00000000 00000001 00000000 00000011 $s1: 65539(10)
+) 00000000 00000000 00000000 00001001
13(10)
00000000 00000001 00000000 00001100 $s0: 65552(10)
addi
$s0, $s1, –13
00000000 00000001 00000000 00000011 $s1: 65539(10)
+) 11111111 11111111
11111111 11110111
–13(10)
00000000 00000000 11111111 11111010 $s0: 65526(10)
Created by Tsuneo Nakanishi, 2002-2004
比較命令(1)
レジスタ < レジスタ → レジスタ
slt
sltu
$○, $△, $□
$○, $△, $□
# $△ < $□ → $○
# $△ < $□ → $○
レジスタ < 定数 → レジスタ(定数は 32bit に符号拡張)
slti
sltiu
$○, $△, n
$○, $△, n
# $△ < n → $○
# $△ < n → $○
 slt/slti 命令は,第二オペランドと第三オペランドを 2 の補数表現された符号
つき整数とみなして,比較結果を $○ に書き込む.
 sltu/sltiu 命令は,第二オペランドと第三オペランドを符号なし整数とみなし
て,比較結果を $○ に書き込む.
 slti/sltiu 命令では,定数 n は 32bit に符号拡張されてから比較される.
Created by Tsuneo Nakanishi, 2002-2004
比較命令(2)
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
op
rs
rt
rd
shamt
funct
slt $○, $△, $□
000000
$△
$□
$○
00000
101010
sltu $○, $△, $□
000000
$△
$□
$○
00000
101011
R形式
命令
Created by Tsuneo Nakanishi, 2002-2004
比較命令(3)
op
rs
rt
address/immediate
6bit
5bit
5bit
16bit
op
rs
rt
address/immediate
slti $○, $△, n
001010
$△
$○
n
sltiu $○, $△, n
001011
$△
$○
n
I形式
命令
Created by Tsuneo Nakanishi, 2002-2004
論理演算命令(1)
ANDゲート: 入力が全て 1 のときのみ出力が 1.
A
Y
B
A
B
Y
0
0
0
0
1
0
1
0
0
1
1
1
AND演算(&): オペランドのビットごとに AND をとる.
1
1
0
1
1
1
1
0
0
1
0
1
1
0
0
0
1
0
1
0
0
0
0
0
Created by Tsuneo Nakanishi, 2002-2004
論理演算命令(2)
ORゲート: 入力のいずれかが 1 のときのみ出力が 1.
A
Y
B
A
B
Y
0
0
0
0
1
1
1
0
1
1
1
1
OR演算(|): オペランドのビットごとに OR をとる.
1
1
0
1
1
1
1
0
0
1
0
1
1
0
0
0
1
1
1
1
1
1
1
0
Created by Tsuneo Nakanishi, 2002-2004
論理演算命令(3)
XORゲート: 2つの入力が異なる値のときのみ出力が 1.
A
Y
B
A
B
Y
0
0
0
0
1
1
1
0
1
1
1
0
XOR演算(^): オペランドのビットごとに XOR をとる.
1
1
0
1
1
1
1
0
0
1
0
1
1
0
0
0
0
1
0
1
1
1
1
0
Created by Tsuneo Nakanishi, 2002-2004
論理演算命令(4)
レジスタ and/or レジスタ → レジスタ
and
or
xor
$○, $△, $□
$○, $△, $□
$○, $△, $□
# $△ & $□ → $○
# $△ | $□ → $○
# $△ ^ $□ → $○
レジスタ and/or 定数 → レジスタ(定数は 32bit にゼロ拡張)
andi
ori
xori
$○, $△, n
$○, $△, n
$○, $△, n
# $△ & n → $○
# $△ | n → $○
# $△ ^ n → $○
Created by Tsuneo Nakanishi, 2002-2004
論理演算命令(5)
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
op
rs
rt
rd
shamt
funct
and $○, $△, $□
000000
$△
$□
$○
00000
100100
or $○, $△, $□
000000
$△
$□
$○
00000
100101
xor $○, $△, $□
000000
$△
$□
$○
00000
100110
R形式
命令
Created by Tsuneo Nakanishi, 2002-2004
論理演算命令(6)
op
rs
rt
address/immediate
6bit
5bit
6bit
16bit
op
rs
rt
address/immediate
andi $○, $△, n
001100
$△
$○
n
ori $○, $△, n
001101
$△
$○
n
xori $○, $△, n
001110
$△
$○
n
I形式
命令
Created by Tsuneo Nakanishi, 2002-2004
シフト命令(1)
n ビット論理シフト演算: n ビット分を左右にずらし,はみ出した
ビットを捨てて,空いたビットに 0 を補填する.
n ビット左シフト:
0 1 1 1 0 1 1 0
0 1 1 1 0 1 1 0 0 0
n ビット右シフト:
0 1 1 1 0 1 1 0
0 0 0 1 1 1 0 1 1 0
Created by Tsuneo Nakanishi, 2002-2004
シフト命令(2)
n ビット算術右シフト演算: n ビット分を右にずらし,はみ出した
ビットを捨てて,空いたビットに 最上位ビット(符号ビット) を補填
する.
n ビット右シフト:
1 1 1 1 0 1 1 0
1 1 1 1 1 1 0 1 1 0
Created by Tsuneo Nakanishi, 2002-2004
シフト命令(3)
レジスタを n ビット論理左右シフト → レジスタ
sll
srl
$○, $△, n
$○, $△, n
# $△ を n ビット論理左シフト → $○
# $△ を n ビット論理右シフト → $○
レジスタを n ビット算術右シフト → レジスタ
sra
$○, $△, n
# $△ を n ビット算術右シフト → $○
Created by Tsuneo Nakanishi, 2002-2004
シフト命令(4)
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
op
rs
rt
rd
shamt
funct
sll $○, $△, n
000000
00000
$△
$○
n
000000
srl $○, $△, n
000000
00000
$△
$○
n
000010
sra $○, $△, n
000000
00000
$△
$○
n
000011
R形式
命令
Created by Tsuneo Nakanishi, 2002-2004
転送命令(1)
レジスタ/メモリ間(符号つき)
lw
lh
lhu
lb
lbu
sw
sh
sb
$○, 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)
 オフセット n には,16bit の2の補数表現の整数(–32768~32767)を指定できる.
 オフセット n は 32bit に符号拡張されてからベースレジスタに加算される.
 lw/sw 命令の対象番地は4の倍数,lh/sh 命令の対象番地は2の倍数でなければな
らない.(整列化制約)
 lb/lh 命令では読み込むデータの符号拡張,lbu/lhu 命令ではゼロ拡張が行われる.
Created by Tsuneo Nakanishi, 2002-2004
転送命令(2)
lw/lh/lb/lhu/lbu/sw/sh/sb
$○, n($△)
$○
–32768
$△
zzzz
lw/sw
a b c d
lh/sh
X X a b
lhu
0 0 a b
lb/sb
X X X a
lbu
0 0 0 a
+n
32767
a
b
c
d
Created by Tsuneo Nakanishi, 2002-2004
転送命令(3)
I形式
op
rs
rt
address/immediate
6bit
5bit
5bit
16bit
命令
op
rs
rt
address/immediate
lw $○, n($△)
100011
$△
$○
n
sw $○, n($△)
101011
$△
$○
n
lh $○, n($△)
100001
$△
$○
n
lhu $○, n($△)
100101
$△
$○
n
sh $○, n($△)
101001
$△
$○
n
lb $○, n($△)
100000
$△
$○
n
lbu $○, n($△)
100100
$△
$○
n
sb $○, n($△)
101000
$△
$○
n
Created by Tsuneo Nakanishi, 2002-2004
転送命令(4)
即値→レジスタ
lui
# $○の上位 16bit に n を格納
# $○の下位 16bit に 0 を格納
$○, n
n
$○
0000…00
32bit 即値(nm)の転送
lui
addi
$○, n
$○, m
# $○の上位 16bit に n を格納
# $○の下位 16bit に m を格納(符号拡張あり)
lui
ori
$○, n
$○, m
# $○の上位 16bit に n を格納
# $○の下位 16bit に m を格納(符号拡張なし)
Created by Tsuneo Nakanishi, 2002-2004
転送命令(5)
I形式
命令
lui $○, n
op
rs
rt
address/immediate
6bit
5bit
5bit
16bit
op
rs
rt
address/immediate
001100
00000
$○
n
Created by Tsuneo Nakanishi, 2002-2004
分岐命令(1)
j
jal
jr
beq
bne
Label
Label
$○
$△, $□, Label
$△, $□, Label
# Label に無条件分岐
# Label に無条件分岐(関数呼出用)
# $○の番地に無条件分岐
# $△ = $□ ならば Label に分岐
# $△  $□ ならば Label に分岐
 命令によってジャンプできる範囲に違いがある.(後述)
Created by Tsuneo Nakanishi, 2002-2004
分岐命令(2)
R形式
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
op
rs
rt
rd
shamt
funct
000000
$○
00000
00000
00000
001000
命令
jr $○
op
rs
rt
address/immediate
6bit
5bit
5bit
16bit
命令
op
rs
rt
address/immediate
beq $△, $□, Label
000100
$△
$□
d
bne $△, $□, Label
000101
$△
$□
d
I形式
Created by Tsuneo Nakanishi, 2002-2004
分岐命令(3)
J形式
op
address
6bit
26bit
命令
op
immediate
j Label
000010
ラベル Label の番地のビット27~2
jal Label
000011
ラベル Label の番地のビット27~2
擬似直接アドレッシング: j, jal 命令の分岐先番地
PC
J形式
分岐先
b31~b28
j/jal
b31~b28
整列化制約
b27~b0
address
address
00
Created by Tsuneo Nakanishi, 2002-2004
アドレッシングモード
アドレッシングモード: 機械語における番地指定,さらにはオペラ
ンドの表現方法.
アドレッシングモード
形式
説明
レジスタアドレッシング
R
「$○」と直接レジスタを指定する形式. add, sub,
and, or 命令など.
ベース相対アドレッシング
I
「n($○)」とベースレジスタとオフセットで主記憶の
番地を指定する形式.lw, sw 命令など.
即値アドレッシング
I
「n」と定数を指定する形式.addi, subi, andi, ori
命令など.
擬似直接アドレッシング
J
命令の番地を指定する形式.アセンブリ言語では
ラベル名として表される.j, jal 命令など.
PC相対アドレッシング
I
命令の番地を指定する形式.アセンブリ言語では,
擬似直接アドレッシングと同様にラベル名として表
されるが,命令表現の形式と意味は異なる. beq,
bne 命令など.
Created by Tsuneo Nakanishi, 2002-2004
R形式(1)
R形式
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
命令
op
rs
rt
rd
shamt
funct
add $○, $△, $□
000000
$△
$□
$○
00000
100000
addu $○, $△, $□
000000
$△
$□
$○
00000
100001
sub $○, $△, $□
000000
$△
$□
$○
00000
100010
subu $○, $△, $□
000000
$△
$□
$○
00000
100011
slt $○, $△, $□
000000
$△
$□
$○
00000
101010
sltu $○, $△, $□
000000
$△
$□
$○
00000
101011
and $○, $△, $□
000000
$△
$□
$○
00000
100100
or $○, $△, $□
000000
$△
$□
$○
00000
100101
xor $○, $△, $□
000000
$△
$□
$○
00000
100110
Created by Tsuneo Nakanishi, 2002-2004
R形式(2)
R形式
op
rs
rt
rd
shamt
funct
6bit
5bit
5bit
5bit
5bit
6bit
命令
op
rs
rt
rd
shamt
funct
sll $○, $△, n
000000
00000
$△
$○
n
000000
srl $○, $△, n
000000
00000
$△
$○
n
000010
sra $○, $△, n
000000
00000
$△
$○
n
000011
jr $○
000000
$○
00000
00000
00000
001000
Created by Tsuneo Nakanishi, 2002-2004
I形式(1)
I形式
op
rs
rt
immediate
6bit
5bit
5bit
16bit
命令
op
rs
rt
immediate
addi $○, $△, n
001000
$△
$○
n
addiu $○, $△, n
001001
$△
$○
n
slti $○, $△, n
001010
$△
$○
n
sltiu $○, $△, n
001011
$△
$○
n
lui $○, $△, n
001111
$△
$○
n
andi $○, $△, n
001100
$△
$○
n
ori $○, $△, n
001101
$△
$○
n
xori $○, $△, n
001110
$△
$○
n
Created by Tsuneo Nakanishi, 2002-2004
I形式(2)
I形式
op
rs
rt
address
6bit
5bit
6bit
16bit
命令
op
rs
rt
immediate
lw $○, n($△)
100011
$△
$○
n
sw $○, n($△)
101011
$△
$○
n
lh $○, n($△)
100001
$△
$○
n
lhu $○, n($△)
100101
$△
$○
n
sh $○, n($△)
101001
$△
$○
n
lb $○, n($△)
100000
$△
$○
n
lbu $○, n($△)
100100
$△
$○
n
sb $○, n($△)
101000
$△
$○
n
Created by Tsuneo Nakanishi, 2002-2004
I形式(3)
I形式
op
rs
rt
address
6bit
5bit
6bit
16bit
命令
op
rs
rt
address
beq $△, $□, Label
000100
$△
$□
d
bne $△, $□, Label
000101
$△
$□
d
Created by Tsuneo Nakanishi, 2002-2004
I形式(4)
PC相対アドレッシング: beq, bne 命令の分岐先番地
PC
I形式
00
op
rs
rt
address
address を符号拡張
+
00
整列化制約: 命令の
番地は常に4の倍数.
分岐先(Label の番地)
00
Created by Tsuneo Nakanishi, 2002-2004
J形式
J形式
op
address
6bit
26bit
命令
op
immediate
j Label
000010
ラベル Label の番地のビット27~2
jal Label
000011
ラベル Label の番地のビット27~2
擬似直接アドレッシング: j, jal 命令の分岐先番地
PC
J形式
分岐先
b31~b28
j/jal
b31~b28
整列化制約
b27~b0
address
address
00
Created by Tsuneo Nakanishi, 2002-2004
分岐命令の守備範囲
00000000
10000000
PC相対アドレッシング
(PCを中心に 218 番地の範囲)
20000000
30000000
40000000
50000000
PC
JR命令は全域
60000000
70000000
擬似直接アドレッシング
(PCを含むに 228 番地分のページ)
D0000000
E0000000
F0000000
Created by Tsuneo Nakanishi, 2002-2004