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)