指定する第3オペランド。ベース(相対)アドレシングレジスタの値と、指定した定数(偏位と呼ばれます)の和でアクセスする番地(実効アドレス)を指定する方式です。)で読み書きするメモリ番地を指定する際に使われます。ベースアドレシングとなっています。読み書きするレジスタを指定しているだけなので、レジスタアドレシングです。疑似直接アドレシングオペランドの下位28ビットを直接指定し、残りの上位4ビットをプログラムカウンタの上位ビットしてメモリ番地を指定する方式です。下位28ビットだけ直接指定するのかMIPSの命令長である32ビットのうち、6ビットはどんな命令かを指定するオペコードに使われるので、最大で残り26ビットを使うことができます。疑似直接アドレシングでは、この26ビットを最大限にアドレス指定に使います。ここでmipsの命令長は4バイト(32ビット)単位なので、絶対アドレスの値は必ず4の倍数、つまり2進数の下2桁は00になります。移動先の下2桁「00」を追加し、28ビットまで指定をすることができます。それでも残りの4ビットはどうしようもできないのでプログラムカウンタの上位4ビット、つまり次の命令のアドレスの上位4桁を残りの4ビットとし、プログラムカウンタの上位4ビットと指定した28ビットでアクセスする番地を決定します。メモリの番地を下のように16のエリア(アドレスの上位4ビットごと)に分割したときに、プログラムカウンタがあるエリア内であれば自由に絶対アドレス指定ができるのが擬似直接アドレシングです。命令)でのみ疑似直接アドレシングが使われます。PC相対アドレシング現在のプログラムカウンタからどれだけ先(もしくは前)の番地にアクセスするかを指定する形式です*1。4の値)を基準に「どれだけ先(前)」かを指定します。PC相対アドレシングで使えるビット数は16ビット(I形式の即値部分)です。ここで、mipsの命令長は4バイト(32ビット)単位なので、アクセスを行うアドレスの値は必ず4の倍数、つまり2進数の下2桁は00になります。相対アドレス(基準番地から指定する番地がどれだけ先なのか)も当然4の倍数となり、下2桁は00となります。相対アドレスを指定する際には下2桁の「00」を省略することで2ビットを追加した18ビットをアドレス指定に使うことができます。ここで、18ビットのうちの1ビットはアドレスの前後(正負)を指定するために使う必要があるので、残りは17ビットとなります。番地を指定、アクセスすることができます。疑似直接アドレシングPC相対アドレシングでアクセスできる(実効アドレスにできる)メモリ番地の範囲を図で表すと、下のようになります。命令、およびレジスタの値と偏位を指定するベース(相対)アドレシングでは、メモリのすべての番地をアクセス対象(実効アドレス)にすることができます。MIPSにおける5つのアドレシングモードMIPSでのアドレシングモード指定方法は全部で5つである。そのうちの1つはレジスタを指定、1つは定数を指定、残り3つがメモリを指定のアドレシングモードである。レジスタアドレシング(レジスタ指定)レジスタをオペランドとして指定する。値アドレシング(定数指定)定数をオペランドとして指定する。ベースアドレシング(メモリ指定)レジスタの値と定数(偏位)を足した番地を実効アドレスとし、計算された実効アドレスを指定する。疑似直接アドレシング(メモリ指定)実効アドレスの下位28ビットは直接指定、残りの上位4ビットは現在のプログラムカウンタと同じとし、計算された実効アドレスを指定。PC相対アドレシング(メモリ指定)次の命令のプログラムカウンタからアクセスしたいアドレスがどれくらい先かを相対的に指定。データ転送命令(メモリ→レジスタ)では、前編に引き続き命令紹介をしていきたいと思います。最初はメモリからレジスタへのデータ転送(ロード)命令です。データの転送量、および「符号あり整数」・「符号なし整数」のどちらに設定したいかによって使う命令が変わってきます。(nには負の値も指定可能)を用います。メモリから連続する4バイトを読み込み、レジスタに格納するI形式の命令です。番地から連続する4バイトのデータをレジスタに読み込みます。合わせるため、32ビットに符号拡張されます。値は必ず4の倍数となります。上の図で示す通り、レジスタに格納する際は上位バイトから順番に1バイトずつ格納されます。メモリから連続する2バイトを読み込み、レジスタに格納するI形式の命令です。番地から連続する2バイトのデータをレジスタの下位2バイトに読み込みます。読み込んだ際32ビットに符号拡張されます。合わせるため、32ビットに符号拡張されます。値は必ず2の倍数となります。上の図で示す通り、レジスタの下位2バイトに格納する際は上位バイトから順番に1バイトずつ格納され、符号拡張されます。ため、符号ビットは1となります*2。そのため、1で桁埋めされます(16進数だと上位桁がFになります)。読み込まれるビットが符号なし整数になります。値を負の値にすることはできます。符号なし整数として考えるので、符号拡張ではなくゼロ拡張が行われます。byte]メモリから1バイトを読み込み、レジスタに格納するI形式の命令です。番地から1バイトのデータをレジスタの下位1バイトに読み込みます。読み込んだ際32ビットに符号拡張されます。合わせるため、32ビットに符号拡張されます。上の図で示す通り、レジスタの下位1バイトに格納され、符号拡張されます。ため、符号ビットは0となります。そのため、0で桁埋めされます。読み込まれるビットが符号なし整数になります。値を負の値にすることはできます。符号なし整数として考えるので、符号拡張ではなくゼロ拡張が行われます。5つの命令をまとめると下の図のようになります。データ転送命令(レジスタ→メモリ)レジスタからメモリへのデータ転送(ストア)命令も紹介したいと思います。レジスタの中身を上位から順にメモリに格納します。番地から連続する4バイトにレジスタの中身を上位バイトから順番に格納します。値は必ず4の倍数となります。上位のバイトから1バイトずつ格納していきます。残りの上位16ビットは無視されます。レジスタの下位2バイトの中身を上位から順にメモリに格納します。番地から連続する2バイトにレジスタの下位2バイト(下位半分)の中身を上位バイトから順番に格納します。値は必ず2の倍数となります。下位2バイトを上位のバイトから1バイトずつ格納していきます。byte]レジスタの1バイトの中身を上位から順にメモリに格納します。番地から1バイトにレジスタの下位1バイト(下位1/4)の中身を格納します。下位1バイトをを格納します。残りの上位24ビットは無視されます。3つの命令をまとめると下の図のようになります。強制分岐命令ここからは分岐命令についてです。強制分岐命令と条件分岐命令の2つがあるので、まずは強制分岐命令について説明していきます。強制分岐命令の基本的な形です。J形式の珍しい命令です。ついている命令に無条件で分岐します。ラベルがある2行下にワープします。分岐先の命令の下位28ビット〜下位3ビットが入ります(アセンブルの際に自動的に計算してくれます)。サブルーチン(関数)用のJ形式強制分岐命令です。どっかの航空会社じゃないですよ。次の命令のアドレスを格納します。使うことで、サブルーチンから元に戻ることができます。レジスタで指定されたアドレスに分岐するR形式の命令です。どっかの鉄道会社じゃないですよ。番地に強制分岐します。命令などと異なり、すべての番地にワープすることができます。することで、サブルーチンから元に戻ることができます。条件分岐命令つぎは条件分岐命令について説明していきます。2つのレジスタの値が等しいときに指定されたラベルの命令に分岐するI形式の命令です。ついている命令に分岐します。分岐元(比較命令の次の命令)から何命令先かが入ります。このようなオペランドの指定方法をPC相対アドレシングモードと呼びます*3。しなくても、アセンブラから機械語に変換する際に自動的に何命令離れているかを計算してくれます。便利ですね!もちろん、下のような「前に戻る条件分岐命令」も設定することができます。命令のような強制分岐が使われることが多いです。2つのレジスタの値が等しくないとき、指定されたラベルの命令に分岐するI形式の命令です。ついている命令に分岐します。値を2増やす処理をしたいとします。1減らし、$s2を2増やす)を書きます。ワープしてしまい、思った通りの処理がされません。増やしてしまい、真逆の操作になる)そのため、アセンブリで条件分岐を用いた書く場合、下のように条件分岐とラベルの間に条件を満たさない場合の処理を書く必要があります。ワープさせ、等しいときに行う処理をさせないようにします。比較命令は、2つのレジスタの値を比較し、どちらが大きいかを0か1の値で返します。先程紹介した条件分岐命令とセットで使われます。2つのレジスタの値を比較するR形式の命令です。