マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

レジスタ同士の演算

Intelのマニュアルでわかってなかった部分がわかったので書いておく。それはレジスタ同士の演算である。例えばNASMで

ADD AX, BX

のような計算である。とあるOSでオペコード0x31がでてきたので、マニュアルを見た。そしたらXORであることがわかった。0x31のあとには1つのModR/Mバイトというのが続く。このModR/Mバイトというのがわかってなかった。NASMで以下のコードをアセンブル

XOR DI, SI

16進数で31F7となる。31がXORのオペコードでF7がModR/Mバイトである。このModR/Mバイトは8bitの中で3つの要素にわかれている。Modとregister/opecodeとR/Mである。F7を2進数で書くと
11110111となる。この赤い部分がModで緑の部分がregister/opecodeで青い部分がR/Mとなっている。レジスタ同士の演算の場合、このModとR/Mの組み合わせで演算される側(左)のレジスタ、register/opecodeが演算する側(右)のレジスタを表す。今回、ModとR/Mの組み合わせは11と111でDIとなっている。register/opecodeは110でSIとなっている。この場合だとエミュレータではレジスタを数字で管理していた方がよさそうだ。Registersクラスを消して配列にしよう