数式が読み込まれない場合は1回再読み込みしてみてください。まとめシリーズこんにちは、ももやまです。今回から前編、後編の2回にわけてMIPSの命令について紹介していきます。シフト命令の8つについて説明していきたいと思います。論理シフト・算術シフトの違い符号拡張・ゼロ拡張の違いもし、1つでもわかっていない項目があれば、下にある記事(アセンブラを学ぶ前に必ず知っておくべき9つの知識)を読んでから下の内容を読むことを強くおすすめします。www.momoyama-usagi.com1.MIPSのレジスタ構成MIPSには、32ビットのレジスタが32本ついており、それぞれのレジスタに番号と名前がついています。それぞれのレジスタの使用用途を下に示しています。「こんなレジスタがあるんだな〜」て思っていただけたらOKです。「それぞれのレジスタの使用例」は、命令を紹介する際に合わせて紹介したいと思います。以外は汎用レジスタとなっています*1。命令内容を示すオペコードと、命令の対象を示すオペランドから成っています。(MIPSアーキテクチャに限りません)MIPSの命令はすべて32ビット固定長です。(つまりどんな命令もオペコード、オペランド合わせて32ビット、32桁の2進数で示されています)32ビットに統一を行い、設計を単純化することで、動作の高速性を重視しています。32ビットに統一したことにより命令形式を1つに抑えることが難しくなったため、MIPSではオペランドによって命令形式がR形式、I形式、J形式の3つに分けられています。3つの形式の判定は、オペコードと呼ばれる最初の6ビットで判定されます。R形式R形式は、主にレジスア同士の演算を対象にした形式です。32ビットを下のようなフィールドに分割しています。op(オペコード)[6ビット]R形式の場合、0b000000が入っています。このままでは命令内容がわからないため、function(機能)の6ビットで具体的な命令内容を判別します。計算対象の元となるレジスタ番号が2進数(絶対値)で入ります。どちらで書いてもOKです。ようなレジスタ名で書かれます。)なお、第1オペランドを使わない命令の場合、0b00000(オール0)が入ります。計算対象の先となるレジスタ番号が2進数(絶対値)で入ります。第2オペランドを使わない命令の場合、0b00000(オール0)が入ります。計算結果を代入するレジスタをレジスタ番号が2進数(絶対値)で指定します。(格納先を指定しない命令の場合、0が入ります。shamt(シフト量)[5ビット]シフト命令でのみ使います。どれくらいシフトするかを2進数絶対値で入れます。シフト命令以外ではshamtを使わないので、0b00000が入ります。R形式の場合、最初のop部分(6ビット)だけでは命令内容を特定できません。そのため、最後の6ビット部分でどんな命令なのかを判定します。(それぞれの命令におけるコードは後ほど紹介したいと思います。I形式I形式は、主に即値(定数)やデータ転送用に使われる形式です。I形式では32ビットを下のようなフィールドに分割しています。op(オペコード)[6ビット]命令形式、および命令内容を特定します。(それぞれの命令におけるコードは後ほど紹介したいと思います。計算対象の元となるレジスタ番号が2進数(絶対値)で入ります。指定すると、0b10001(2進数で17)が入ります。計算結果を入れるレジスタの番号が2進数(絶対値)で入ります。指定すると、0b01001(2進数で9)が入ります。