1

MIPS バイナリ命令をデコードする方法を理解しようとしています。

gcc を使用して Debian MIPS システムで C 言語で hello world プログラムをコンパイルし、objdump を実行すると、.text セクションの最初の命令は次のようになります。

600: 03e00025 move zero,ra

MOVEこれが命令であるとどのように判断するのかわかりません。

03e0002500000011111000000000000000100101バイナリです。私が正しく理解している場合、ここの最初の 6 ビットはオペコードであり、この場合はすべて 0 であり、R タイプの命令であることを意味するため、最後の 6 ビットを調べる必要があり100101ます。MIPS Instruction Set Manualを見ると、これが命令であるように見えますORMOVE私はそのマニュアルでさえ見つけることができません。

これをグーグルで調べたところ、明らかにアセンブリに「疑似」命令があり、おそらく にmove $t, $s展開されていることがわかりましたaddiu $t, $s, 0が、マニュアルを見るとADDIUopcode があり001001ます。私が見つけた別の結果は、それがに変換されると主張してADDいますが、の最後の6ビットは であるADD必要が100000あるため、どちらにも適合しません。

私は何が欠けていますか?

4

1 に答える 1

2

MIPS マシン コードには に固有のオペコードはありませんが、人間の利便性のために、多くのアセンブラは 、、および1 つ以上の実際のマシン命令に moveアセンブルする疑似命令をサポートしています。は一般的なものです。lilamoveaddiu

objdump が (Jester によると) 命令をデコードして、or $0, $ra, $0実際にどのようにエンコードされているかを示すことは完全に正しいでしょう。

move目的によっては、レジスタをニーモニックにコピーするために一般的に使用される方法を逆アセンブラでデコードすることが理にかなっています。0即値、またはレジスタの読み取りからゼロを追加または OR すると、$zero値に何も行われないため、変更されずにコピーされます。

asm を読むとき、通常、それがororiaddiu $0, $ra, 0、またはその他のものであるかどうかは気にしません。


アセンブラが異なればmove疑似命令に異なる実装が使用される場合もあれば、手書きの asm がそれらのいずれかを使用する場合もあります。どちらにしてもパフォーマンスへの影響はないと思います。そのため、どのマシン命令を使用して a を実装するmoveかの詳細は、アセンブラーによって異なります。


moveの目的地を持つ aのポイントが何であるかはわかりません$zero$zero書き込みを破棄するため、これは何もしません。(これは に相当する CPU レジスタです/dev/zero)

于 2018-11-24T00:08:34.220 に答える