レジスタ名 | 用途 | 備考 |
---|---|---|
$zero | 定数 0 | |
$at | アセンブラが使用する | |
$v0~$v1 | 関数・サブルーチンの返値格納用 | |
$a0~$a3 | 関数・サブルーチンへ渡す引数(arguments)の格納用 | |
$t0~$t9 | 一時(temporary)作業用レジスタ (caller-saved) | 関数・サブルーチンを呼び出す側 (呼出元, caller) が値を保存しなければいけない 勝手に使っても良いが、他の機能を呼び出すと値が破壊される可能性がある。 |
$s0~$s7 | 作業用レジスタ(safe function variable)(callee-saved) | 呼び出された関数・サブルーチン側 (呼出先, callee) が値を保存しなければいけない 使用前に既存の値を保存する必要があるが、他の機能を呼び出しても値が破壊されない。 |
$k0~$k1 | OS用 | |
$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を指定する |