2011-01-04 3 views
2

ここには、VC++プロジェクトに挿入した単純なasmコードがあります。 addr_curr_ebpは、EBPポインタの現在のアドレスです。これは、スタックフレーム内の古いEBP値を指しています。 4バイト後に、アプリケーション関数内の戻りアドレスが入ります。コードセクションから1バイトを抽出します。 gtalk、vlcなどの他のアプリケーションと一緒に自分のコードを実行します。私のコードにProbStat 1と2を含めると、アプリケーションが常にクラッシュします。これらのステートメントを削除すると、すべて正常に動作します。これは何だと思いますか?Help:ソースコードにアクセスするとアプリケーションがクラッシュする

__asm{ 
     push eax 
     push ebx 
     push cx 

     mov ebx, addr_curr_ebp 
     mov eax, [ebx + 4] 

     mov cl, BYTE PTR [eax - 5] //ProbStat 1 
     mov ret_5, cl // ProbStat 2 

     pop cx 
     pop ebx 
     pop eax 
} 
+0

クラッシュまたは例外はありますか?これはどこで発生しますか?デバッガを設定して、すべての例外タイプを破りましたか? –

+1

'CX'を押すだけで何も保存しません。また、MSはC++の 'this'ポインタに' ECX'レジスタを使います。それ以外の場合は、あなたの質問に答えるための十分な情報がありません。 – JimR

+0

@JimR: 'push cx'はcxレジスタを保存し、 'pop cx'はそれを復元します。その間に、clだけが変更されます。だからecxは保存されています。 – TonyK

答えて

1

"ret_5"がどこにあるかを確認するにはコードスニペットが不十分です。クラスのメンバーであれば、自動クラッシュが発生します。 ecxレジスタには "this"ポインタが格納されています。

このことがわからない場合は、_ReturnAddress組み込み関数を使用する必要があるように聞こえます。このコードを呼び出す呼び出し命令の後にの後にアドレスを返します。署名されていないchar *に割り当てます。このようにアセンブリする必要はありません。

+1

'this'ポインタはこのasmブロックでは使用されず、終了前に復元されるため、ecxが一時的に変更されても問題ありません。しかし、あなたが言うように、ret_5がクラスメンバーの場合、コードは意図したとおりに動作しません。 – TonyK

+0

@ハンス:CXの代わりにEDXを使用しました(確かに)、ret_5をグローバル変数にしましたが、それでもクラッシュします。 Gtalkの場合、「Google Talkに内部エラーが発生しました。これを閉じる必要があります.Googleにこのエラーを報告するにはどうすればよいですか?」というエラーが表示されます。 – Bruce

+0

はい、おそらく奇跡が発生します。私は提供された情報から手がかりを持っていない、あなたはあなたの質問を改善する必要があります。 –

関連する問題