MIPSアーキテクチャ
MIPS アセンブリ言語 > 整数

MIPSアーキテクチャは32本の整数レジスタを持つ。算術処理を行うにはデータがレジスタ上になければならない。レジスタ$0は常に0であり、レジスタ$1はアセンブラが一時的に使用する（擬似命令や大きな定数を扱う場合）。
エンコーディングは命令語の各ビットが命令のどの部分と対応しているかを示している。ハイフン (-) はそのビットが無視されることを意味する。
| 種類 | 名称 | 構文 | 意味 | 形式/オペコード/機能コード | 形式/オペコード/機能コード | 形式/オペコード/機能コード | 注記/エンコーディング |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 算術 | Add | add $d,$s,$t | $d = $s + $t | R | 0 | 2016 | 2つのレジスタを加算。オーバーフロー時にはトラップ発生 000000ss sssttttt ddddd--- --100000 |
| 算術 | Add unsigned | addu $d,$s,$t | $d = $s + $t | R | 0 | 2116 | 上と同様だが、オーバフローを無視 000000ss sssttttt ddddd--- --100001 |
| 算術 | Subtract | sub $d,$s,$t | $d = $s - $t | R | 0 | 2216 | 2つのレジスタで減算。オーバーフロー時にはトラップ発生 000000ss sssttttt ddddd--- --100010 |
| 算術 | Subtract unsigned | subu $d,$s,$t | $d = $s - $t | R | 0 | 2316 | 上と同様だが、オーバーフローを無視 000000ss sssttttt ddddd000 00100011 |
| 算術 | Add immediate | addi $t,$s,C | $t = $s + C (signed) | I | 816 | - | 符号拡張した即値とレジスタを加算。addi $1, $2, 0 のようにレジスタ間転送にも使える。オーバフロー時にはトラップ発生 001000ss sssttttt CCCCCCCC CCCCCCCC |
| 算術 | Add immediate unsigned | addiu $t,$s,C | $t = $s + C (signed) | I | 916 | - | 上と同様だが、オーバフローを無視（即値は符号拡張される） 001001ss sssttttt CCCCCCCC CCCCCCCC |
| 算術 | Multiply | mult $s,$t | LO = (($s * $t) << 32) >> 32;  HI = ($s * $t) >> 32; | R | 0 | 1816 | 2つのレジスタで乗算。64ビットの積は専用レジスタ HI と LO に格納。(int HI,int LO) = (64-bit) $s * $t と表すこともできる。HIとLOには mfhi および mflo でアクセスする。 |
| 算術 | Divide | div $s, $t | LO = $s / $t        HI = $s % $t | R | 0 | 1A16 | 2つのレジスタで除算。32ビットの商をLO、余りをHIに格納。 |
| 算術 | Divide unsigned | divu $s, $t | LO = $s / $t        HI = $s % $t | R | 0 | 1B16 | 2つのレジスタの内容を符号なし整数と解釈して除算。商はLO、余りはHIに格納。 |
| データ転送 | Load double word | ld $t,C($s) | $t = Memory[$s + C] | I | 2316 | - | $s+C というアドレスから8バイトの連続する位置にあるデータをロードし、$tとその次のレジスタに格納する。 |
| データ転送 | Load word | lw $t,C($s) | $t = Memory[$s + C] | I | 2316 | - | $s+C というアドレスから4バイトの連続する位置にあるデータをロードする。 |
| データ転送 | Load halfword | lh $t,C($s) | $t = Memory[$s + C] (signed) | I | 2116 | - | $s+C というアドレスから2バイトの連続する位置にあるデータをロードし、符号拡張してレジスタに格納 |
| データ転送 | Load halfword unsigned | lhu $t,C($s) | $t = Memory[$s + C] (unsigned) | I | 2516 | - | 上と同様だが、符号拡張しない。 |
| データ転送 | Load byte | lb $t,C($s) | $t = Memory[$s + C] (signed) | I | 2016 | - | $s+C というアドレスの1バイトのデータをロードし、符号拡張する。 |
| データ転送 | Load byte unsigned | lbu $t,C($s) | $t = Memory[$s + C] (unsigned) | I | 2416 | - | 上と同様だが、符号拡張しない。 |
| データ転送 | Store double word | sd $t,C($s) | Memory[$s + C] = $t | I |  | - | $t とその次のレジスタの内容を $s+C という位置から8バイト連続でストアする。オペランドの順序に注意が必要。 |
| データ転送 | Store word | sw $t,C($s) | Memory[$s + C] = $t | I | 2B16 | - | $s+C という位置から4バイト連続でストアする。 |
| データ転送 | Store half | sh $t,C($s) | Memory[$s + C] = $t | I | 2916 | - | レジスタの下位16ビットを $s+C という位置から2バイト連続でストアする。 |
| データ転送 | Store byte | sb $t,C($s) | Memory[$s + C] = $t | I | 2816 | - | レジスタの下位8ビットを $s+C という位置にストアする。 |
| データ転送 | Load upper immediate | lui $t,C | $t = C << 16 | I | F16 | - | 16ビットの即値をレジスタの上位16ビットにロードする。ロードできる最大値は216-1。 |
| データ転送 | Move from high | mfhi $d | $d = HI | R | 0 | 1016 | HIレジスタの値を汎用レジスタに転送。この命令から2命令以内に multiply または divide 命令を使ってはならない（その場合の動作は未定義） |
| データ転送 | Move from low | mflo $d | $d = LO | R | 0 | 1216 | LOレジスタの値を汎用レジスタに転送。この命令から2命令以内に multiply または divide 命令を使ってはならない（その場合の動作は未定義） |
| データ転送 | Move from Control Register | mfcZ $t, $s | $t = Coprocessor[Z].ControlRegister[$s] | R | 0 |  | コプロセッサZのコントロールレジスタの内容を汎用レジスタに転送。符号拡張する。 |
| データ転送 | Move to Control Register | mtcZ $t, $s | Coprocessor[Z].ControlRegister[$s] = $t | R | 0 |  | 汎用レジスタの4バイトの内容をコプロセッサZのコントロールレジスタに転送。符号拡張する。 |
| 論理 | And | and $d,$s,$t | $d = $s & $t | R | 0 | 2416 | ビット毎のAND 000000ss sssttttt ddddd--- --100100 |
| 論理 | And immediate | andi $t,$s,C | $t = $s & C | I | C16 | - | 即値とのビット毎のAND 001100ss sssttttt CCCCCCCC CCCCCCCC |
| 論理 | Or | or $d,$s,$t | $d = $s | $t | R | 0 | 2516 | ビット毎のOR |
| 論理 | Or immediate | ori $t,$s,C | $t = $s | C | I | D16 | - | 符号拡張した即値とのビット毎のOR |
| 論理 | Exclusive or | xor $d,$s,$t | $d = $s ^ $t | R | 0 | 2616 | ビット毎のXOR |
| 論理 | Nor | nor $d,$s,$t | $d = ~ ($s | $t) | R | 0 | 2716 | ビット毎のNOR |
| 論理 | Set on less than | slt $d,$s,$t | $d = ($s < $t) | R | 0 | 2A16 | $sと$tの値を符号付き整数として比較し、$s が小さければ $d に1を、そうでなければ0を格納 |
| 論理 | Set on less than immediate | slti $t,$s,C | $t = ($s < C) | I | A16 | - | 符号拡張した即値と$sの値を比較し、$sが小さければ $d に1を、そうでなければ0を格納。 |
| シフト | Shift left logical | sll $d,$t,C | $d = $t << C | R | 0 | 0 | $sの内容をCビット左にシフト。 2^{CONST} をかけるのと同等 |
| シフト | Shift right logical | srl $d,$t,C | $d = $t >> C | R | 0 | 216 | $sの内容をCビットだけ右にシフト。シフトされて空いた上位ビットには0を格納。正の整数を  2^{C} で割ったのと同等。 |
| シフト | Shift right arithmetic | sra $d,$t,C |  \scriptstyle \$d=\$t>>C+\left(\left(\sum _{n=1}^{\text{CONST}}2^{31-n}\right)\cdot \$2>>31\right) | R | 0 | 316 | $sの内容をCビットだけ右にシフト。シフトされた空いた上位ビットは元の値を符号付整数と解釈して符号拡張する。2の補数で表された符号付整数を  2^{C} で割ったのと同等。 |
| 条件分岐 | Branch on equal | beq $s,$t,C | if ($s == $t) go to PC+4+4*C | I | 416 | - | 2つのレジスタの値が等しい場合、指定されたアドレスに分岐 000100ss sssttttt CCCCCCCC CCCCCCCC |
| 条件分岐 | Branch on not equal | bne $s,$t,C | if ($s != $t) go to PC+4+4*C | I | 516 | - | 2つのレジスタの値が等しくない場合、指定されたアドレスに分岐 |
| 無条件ジャンプ | Jump | j C | PC = PC+4[31:28] . C*4 | J | 216 | - | 指定されたアドレスに無条件ジャンプ |
| 無条件ジャンプ | Jump register | jr $s | goto address $s | R | 0 | 816 | 指定したレジスタが示すアドレスに無条件ジャンプ |
| 無条件ジャンプ | Jump and link | jal C | $31 = PC + 8; PC = PC+4[31:28] . C*4 | J | 316 | - | プロシージャコール用。$31にリターンアドレスを格納してジャンプする。プロシージャからの復帰は jr $31 とする。リターンアドレスが PC+8 なのは、遅延スロットがあるため。 |
注: MIPSのアセンブリ言語のコード上、分岐命令での分岐先アドレスはラベルで表現される。
注: "load lower immediate" 命令は存在しない。これは addi 命令や ori 命令でレジスタ $0 を使うことで実現される。例えば、addi $1, $0, 100 も ori $1, $0, 100 もレジスタ$1に100という値が格納される。
注: 即値を減算するには、その値の否定を即値として加算すればよい。