命令セットの概要
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/07/05 10:21 UTC 版)
命令は三種類のフォーマットに分類される(R, I, J)。Rフォーマットは三つのレジスタとオペコードから構成される。Iフォーマットは二つのレジスタと16ビットのイミディエート値(とオペコード)から構成される。Jフォーマットは6ビットのオペコードと26ビットのイミディエート値から構成される。 算術演算(加減算)は以下のような形式である。 add $1, $2, $3 ; $1 = $2 + $3 (符号付)addu $1, $2, $3 ; $1 = $2 + $3 (符号無)sub $1, $2, $3 ; $1 = $2 - $3 (符号付)subu $1, $2, $3 ; $1 = $2 - $3 (符号無)addi $1, $2, 100 ; $1 = $2 + 100 (符号無・符号拡張されたイミディエート値)addiu $1, $2, 100 ; $1 = $2 + 100 (符号付・符号拡張されたイミディエート値) 符号付き演算であるadd, sub, addiでは、オーバーフロー時に例外処理が発生する。一方、符号無し演算であるaddu, subu, addiuでは、オーバーフロー時に例外処理が発生しない。C言語ではオーバーフロー時に例外処理を行わないことや、負の数は2の補数で表現可能であることから、ほとんどの場合、符号無し演算が用いられる。 MIPSは、ロード・ストア型のアーキテクチャなので、メモリへのアクセスは基本的に以下のふたつの命令で実現される。 lw $1, 100($2) ; $2 + 100 で示されるアドレスのメモリワード(32ビット)を $1 レジスタにロードする。sw $1, 100($2) ; $1 レジスタの内容(32ビット)を $2 + 100 で示されるアドレスのメモリにストアする。 分岐とジャンプ命令には、以下のようなものがある。これらは必ず次の命令を実行してからジャンプするため(ディレイスロット)、注意が必要である。 beq $1, $2, 100 ; もし ($1 == $2) ならば、PC+4+100 へ飛ぶ。slt $1, $2, $3 ; もし ($2 < $3) ならば $1 = 1、そうでなければ $1 = 0 。(これは正確には比較命令)j 10000 ; 10000番地へ飛ぶ。jal 10000 ; $31 = PC + 4 とした上で、10000番地へ飛ぶ。サブルーチンコールで使用する。 他に重要な命令として、以下のものがある。 lui $1, 100 ; イミディエート値 100 を $1 レジスタの上位16ビットに格納する。 MIPSでは、命令サイズが32ビットであるため、32ビットの定数やアドレスを一命令ではレジスタに格納できない。そこで、lui 命令と addiu 命令などを組み合わせて使用する。アセンブリ言語には32ビット定数をレジスタに格納するマクロ命令があり、マクロ命令のために汎用レジスタのうちのひとつをアセンブリ言語に固定的に割り当てている。
※この「命令セットの概要」の解説は、「R3000」の解説の一部です。
「命令セットの概要」を含む「R3000」の記事については、「R3000」の概要を参照ください。
- 命令セットの概要のページへのリンク