レジスタ

レジスタ名 用途 備考
$zero定数 0
$atアセンブラが使用する
$v0~$v1関数・サブルーチンの返値格納用
$a0~$a3関数・サブルーチンへ渡す引数(arguments)の格納用
$t0~$t9一時(temporary)作業用レジスタ (caller-saved)関数・サブルーチンを呼び出す側 (呼出元, caller) が値を保存しなければいけない
勝手に使っても良いが、他の機能を呼び出すと値が破壊される可能性がある。
$s0~$s7作業用レジスタ(safe function variable)(callee-saved)呼び出された関数・サブルーチン側 (呼出先, callee) が値を保存しなければいけない
使用前に既存の値を保存する必要があるが、他の機能を呼び出しても値が破壊されない。
$k0~$k1OS用
$gpグローバルポインタ
$spスタックポインタ
$fpフレームポインタ
$raリターンアドレス格納用

算術演算

加減算

名前 構文 意味
add add $rd, $rs, $rt $rd ← $rs + $rt
add unsigned addu $rd, $rs, $rt $rd ← $rs + $rt:オーバーフロー処理なし
add immediate addi $rd, $rs, 即値 $rd ← $rs + 即値
add immediate unsigned addiu $rd, $rs, 即値 $rd ← $rs + 即値:オーバーフロー処理なし
subtract sub $rd, $rs, $rt $rd ← $rs - $rt
subtract unsigned subu $rd, $rs, $rt $rd ← $rs - $rt:オーバーフロー処理なし

補足:MIPS には即値の減算(subi)がない。しかし、実際には「sub $t0, $t0, 1」のような記述ができる。これはアセンブラにより「addi $t0, $t0, -1」のように変換されることで実現される。こうした変換は例外的であり、通常は構文でレジスタが指定されている個所に即値を書くことはできない。

乗除算

乗除算では計算結果が演算用の特別なレジスタHiおよびLoに格納されるため、結果の格納先の指定がない。計算結果はmfhiもしくはmfloによって汎用レジスタに値を取り出すことで参照する。

名前 構文 意味
multiply mult $rs, $rt Hi ← $rs × $rtの上位32ビット、
Lo ← $rs × $rtの下位32ビット
divide div $rs, $rt Lo ← $rs / $rt (商)、
Hi ← $rs % $rt(余り)
move from Hi mfhi $rd $rd ← Hi
move from Lo mflo $rd $rd ← Lo
multiply mul $rd, $rs, $rt $rd ← $rs × $rt

論理演算

名前 構文 意味
and and $rd, $rs, $rt $rd ← $rs and $rt
and immediate andi $rt, $rs, 即値 $rt ← $rs and 即値
or or $rd, $rs, $rt $rd ← $rs or $rt
or immediate ori $rt, $rs, 即値 $rt ← $rs or 即値
nor nor $rd, $rs, $rt $rd ← not ($rs or $rt)
xor immediate xori $rt, $rs, 即値 $rt ← $rs xor 即値
xor xor $rd, $rs, $rt $rd ← $rs xor $rt
not not $rd, $rs $rd ← not $rs

シフト演算

名前 構文 意味
shift left logical sll $rd, $rt, 即値 $rd ← $rtを即値で指定したビット分だけ左シフト
shift right logical srl $rd, $rt, 即値 $rd ← $rtを即値で指定したビット分だけ右シフト
shift right arithmetic sra $rd, $rt, 即値 $rd ← $rt を即値で指定したビット分だけ右シフト(MSB を保存)

データ転送

レジスタ

名前 構文 意味
load immediate li $rt, 即値 $rt ← 即値
load address la $rt, ラベル $rt ← ラベルの実行アドレス
move move $rd, $rs $rd ← $rs

メモリ

名前 構文 意味
load word lw $rt, 即値 $rt ← 即値のアドレスのメモリの内容(ワード)
load word lw $rt, 即値($rs) $rt ← $rs の値 + 即値のアドレスのメモリの内容(ワード)
store word sw $rt, 即値 即値のアドレスのメモリ ← $rt
store word sw $rt, 即値($rs) $rs の値 + 即値のアドレスのメモリ ← $rt

分岐命令(ジャンプ)

通常命令はメモリーへの格納順に実行されますが、これを変更する分岐命令の書式は以下の通りです。

名前 構文 意味
branch on equal beq $rs, $rt, ラベル $rs と $rt の内容が等しければ指定したラベルの命令へ跳ぶ
branch on not equal bne $rs, $rt, ラベル $rsと$rtの内容が異なれば指定したラベルの命令へ跳ぶ
branch on greater than or equal to zero bgez $rs, ラベル $rs の内容が0以上ならば指定したラベルの命令へ跳ぶ
branch on greater than zero bgtz $rs, ラベル $rsの内容が0より大きければ指定したラベルの命令へ跳ぶ
branch on less than or equal to zero blez $rs, ラベル $rsの内容が0以下ならば指定したラベルの命令へ跳ぶ
branch on less than zero bltz $rs, ラベル $rsの内容が0より小さければ指定したラベルの命令へ跳ぶ/td>
branch b ラベル 指定したラベルの命令へ跳ぶ

分岐合成命令

以下の分岐命令はアセンブラにより複数の命令に展開される。このとき、$atがアセンブラ専用の作業レジスタとして使用される。

名前 構文 意味
branch on equal to zero beqz $rs, ラベル $rsの内容が0ならば指定したラベルの命令へ跳ぶ
branch on not equal to zero bnez $rs, ラベル $rsの内容が0でなければ指定したラベルの命令へ跳ぶ
branch on greater than or equal bge $rs, $rt, ラベル $rsの内容が$rtの内容以上ならば指定したラベルの命令へ跳ぶ
branch on greater than bgt $rs, $rt, ラベル $rsの内容が$rtの内容より大きければ指定したラベルの命令へ跳ぶ
branch on less than or equal ble $rs, $rt, ラベル $rsの内容が$rtの内容以下ならば指定したラベルの命令へ跳ぶ
branch on less than blt $rs, $rt, ラベル $rsの内容が$rtの内容より小さければ指定したラベルの命令へ跳ぶ

サブルーチン呼び出し

サブルーチン(C言語での関数に相当)の呼び出しは jal 命令を、サブルーチン内の処理が終わり呼び出し元に戻るためには jr 命令を使用します。jal 命令では jal 命令の直後のアドレスが $ra レジスタに格納され、jr 命令ではそのアドレスが格納されたレジスタ(通常は $ra)を指定することで呼び出し元に制御を戻します。

名前 構文 意味
jump and link jal ラベル 次の命令のアドレスを$raに待避し、指定したラベルの命令へ跳ぶ
jump register jr $rs レジスタ$rsで指定した命令へ跳ぶ
  サブルーチンの呼び出し元に戻る時は$raを指定する

サブルーチン使用時の注意

  • サブルーチンに渡す引数はレジスタ$a0~$a3に格納してから呼び出す(引数が多い時は工夫が必要)。
  • サブルーチンから呼び出し元に返す値はレジスタ$v0~$v1に格納する(戻り値が多い時は工夫が必要)。
  • サブルーチンを呼び出すとレジスタ$raは必ず変更される。この他、$v0~$v1、$a0~$a3、$t0~$t9の各レジスタは値を変更される可能性があるため、これらを継続して使用する場合はサブルーチンを呼び出す前に値を待避し、サブルーチンから戻ってきたら復元する必要がある。
  • レジスタ$s0~$s7はサブルーチン実行前後で値が変わらないようにプログラムしなくてはならない。サブルーチン内で$s0~$s7を使用する場合は、これらを一時待避してから使用し、使用後は復元する必要がある。