oriについて

MIPS の機械語命令

ori Rt, Rs, Imm 

を実行すると、 16ビットの即値 Imm を32ビットにゼロ拡張したものと レジスタ Rs の内容の間でビットごとの or 演算を行なったものをレジスタ Rt に収める。

ここで、ゼロ拡張とは、 上位ビットに0をつけ加えることでビット数の多い数値に変換すること[春学期の復習]。 ここでは、16ビット数値を32ビット数値に変換するのだから、 上位16ビットに0をつめることになる:

例: 0010100111101101 を32ビットにゼロ拡張する場合

                      0010100111101101

                      ↓ 上位に16ケタの0をつけ加える。

      00000000000000000010100111101101

また、ビットごとの or 演算とは、0を偽、1を真と考えて、 2つのデータの間で対応するビットごとに or 演算をすること。 C 言語の式で言えば、a | b という演算に相当する [プログラミングの授業で「ビット論理和」として習ったはず]。

例: 8ビットのデータ 01100101 と 10101100 の間でビットごとの or 演算を行う場合

          タテに見る
          ↓
          0    1    1    0    0    1    0    1
          ∨   ∨   ∨   ∨   ∨   ∨   ∨   ∨   
          1    0    1    0    1    1    0    0
          ||   ||   ||   ||   ||   ||   ||   ||   
          1    1    1    0    1    1    0    1   ← これが結果

ビットごとの and 演算やビットごとの not 演算なども同様に定義される。 (C 言語の式でいえば、これらは a & b~a である。)

さて、

    ori Rdest, $0, Imm

の場合、$0 には 0 (つまり 0 ばかり32ケタ並んだデータ)が入っているので、 それと Imm のゼロ拡張したものの間で or 演算をすると、 単に Imm をゼロ拡張したものになる。 (0 ∨ x = x に注意。) 従って、Rdest には Imm (をゼロ拡張したもの)が入ることになる。

                     Imm=     0010100111101101

                              ↓ 上位に16ケタの0をつけ加える。(ゼロ拡張)

              00000000000000000010100111101101
                             ↑
                             │この2つの間でビットごとの or 演算をする。
                             ↓
         $0 = 00000000000000000000000000000000

         結果=00000000000000000010100111101101

これが Rdest レジスタに入る。結局、Imm をゼロ拡張したものが Rdest に入ったことになる。(dest ← destination)