1

C++/CLI でインライン asm を使用しています。恐ろしい問題の事実は、私が観察したバグである可能性があります。ある関数呼び出しから別の関数呼び出しにベクトルを渡しました。呼び出された関数内の _asm{....some assembly code here} のコード スニペット全体をコメントすると、他の関数から提供されたベクトルが使用され、ベクトル全体が正常に取得され、呼び出された関数の引数に正常にコピーされます。正しい方法で。

しかし、uncmment _asm{} の場合、呼び出された関数で _asm{} パッチを使用すると、オブジェクトのベクトル全体が破損し、ベクトルやその他の文字列データを含むオブジェクト全体が破損し、オブジェクト内のすべてのデータが npos=4294967295 のように表示されます.

それは何ですか?これはなぜですか?CLI で問題が発生していますか、それともインライン asm を間違った方法で使用していますか?

ここで立ち往生しているので、親切に助けてください。

             strParamType  = strReturnType;
             if(strParamType.find("IDispatch")!=string::npos)
             {
                 IDispatch* pIDispatch; 
                 _asm
                 {
                   mov  esi,esp 
                       lea  eax,[pIDispatch] 
                   push eax
             }
              }

ここで _asm{} 内に何も書かないと、私が説明した問題が発生します。

よろしくウスマン

4

1 に答える 1

3

あなたが提供した情報源から、あなたが何をしようとしているのかを完全に推測することはできませんが、いくつかの観察があります:

  1. 特に_asm.NET 環境で使用する場合は、一連の規則に従う必要があります。たとえば、Microsoft のアドバイスを参照してください。
  2. あなたのコードは初期化されませんpIDispatch。実際のコードで何が続くかはわかりませんが、アセンブラー コードはスタック上のポインターのアドレスを取得し、それを再びスタックに格納します。コードがポインターを初期化しようとしない限り、これは問題を引き起こします。しかし、if 節の後では、ポインタは範囲外になります!
  3. アセンブリ コードは、スタック ポインターを復元せずに変更します。これは確かにプロセスをクラッシュさせます。自分が何をしているのか (オペレーティング システムの作成など) を本当に理解していない限り、実行しないでください。
于 2011-11-26T05:18:42.190 に答える