2011-07-13 13 views
4

コンパイラのバグのようですかを把握しようとしている間、私は、Visual Studioの2008年からMSVCコンパイラによって生成されたコードでこの行を見つけました:[this]を宛先として使用しているmovss命令の目的は何ですか?

movss dword ptr [this], xmm2 

私はそれはバグIに関連しているとは思わないが、探していた、私は何の鳴き声のようだった? float値(this btwとはまったく関係ない)を[this]に格納していますか?

その行は正確には何ですか?私は確かにそれを理解できないので!それとも、逆アセンブルのビューは私の上でトリックですか?

+0

これは本当に逆アセンブルされているのですか、インラインアセンブラを含むソースコードですか? 'this'はアセンブラで意味を持たないC++のキーワードなので、私は尋ねます。 'this'ポインタはたいてい' ecx'に格納されます。一方、x64コンパイラはインラインアセンブリをサポートしていません。 –

+0

MSVCデバッガの逆アセンブリビューに表示される内容です。 [これは]私が見ている関数への最初の入力パラメータのシンボル(私はデバッグシンボルがあります)です。 – thehan

+0

しかし、デバッガはこれを間違って表示するかもしれません。とにかくそれはインラインアセンブリではありません。コードはx64用にコンパイルされていますが、これは許可されていません。 – thehan

答えて

3

xmmレジスタに必ず浮動小数点値が含まれるとは限りません。これらは128ビット幅のSIMDレジスタで、基本的にSIMDレジスタ内に1つ以上の値を格納できることを意味します。通常の設定は、8個の16ビット整数、4 32個の整数、4個の浮動小数点数、2個の2倍です。

しかし、コンパイラは、「this」の最初の要素が32ビットであれば、好きなものを自由に配置することができます。

+0

しかし、私が見る限り、この行は基本的に 'this'のvtableを上書きします。そして、私はxmm2にそこに書き込まれるはずのない浮動小数点値が含まれていることを知っています...うーん.. EDIT:xmm2は以前浮動小数点型のメンバ変数をロードして以来、その値を変更していません。 – thehan

+0

'this'がC++と同じ 'this'を参照する場合、vtableを上書きしません。それは、それがmovssがするものなので、それが書いているオブジェクトの最初の4バイトを上書きするつもりです。 –

2

Intel manual on x86 instructionsによれば、MOVSSはXMMレジスタの最下位32ビットをコピーします。 (各XMMレジスタの長さは128ビットです)

命令は "スカラー単精度浮動小数点値の移動"と呼ばれますが、実際には "32ビット値の移動"として扱う必要があります。命令は、データが実際に浮動小数点かどうかは気にしません。解釈せずにビットをコピーするだけです。

この場合、命令はXMM2の最下位32ビットをthisが指し示すメモリ位置にコピーします。これは、あなたのコンパイラが(EAXのような汎用レジスタを使う代わりに)記憶レジスタとしてXMM2を使用しているからです。いくつかのより多くのアセンブリおよび/またはソースコードは、本当に役立つだろうが、私は、少なくとも二つの可能性を参照提供

4

  1. thisは、このポインタではなく、いくつかのメモリ領域を指しているだけでランダムレジスタ。逆アセンブラはその名前をそのように指定しました。なぜなら、関数内でこのポインタとして以前に使用されたか、または他の理由があったからです。

  2. thisは、クラスインスタンスを指しており、そのクラスは最初のメンバとして浮動小数点フィールドを持ち、仮想メソッドはありません。

+0

うーん、私はあなたがイゴールの最初のケースで正しいと思います...私の真のthisポインタは0x0000000031593FC0を指していますが、ディスアセンブラ[this]は0x00000000becccccdを指しています。今、それが何を表しているのかを理解する... – thehan

+0

0xbecccccd = -4浮動小数点値として。 –

+0

@thehanもっとコードを投稿してみませんか?それはいくつかの超秘密のものですか? –

関連する問題