2011-01-05 18 views
0

ここには、VC++プロジェクトに挿入した単純なasmコードがあります。 return_addrは、スタックフレームのリターンアドレスです。 StackWalk関数を(私によって書かれていないcodeproject.com/KB/threads/StackWalker.aspx)StackWalk64()フレームを抽出する使用します。これの詳細は関係ありません。リターンアドレスを使用して、現在調べているスタック内の関数のコードから1バイトを抽出します。アセンブリコードの読み取りアクセス違反

__asm{ 
     push eax 
     push ecx 

     mov eax, return_addr 

     mov cl, BYTE PTR [eax - 5] //Problem Statement 
     mov ret_5, cl 

     pop ecx 
     pop eax 
} 

は、私は問題文が含まれている場合、アプリケーションが常にクラッシュし、VLCなどGtalkなどのような他のアプリケーションと一緒に自分のコードを実行します。これらのステートメントを削除すると、すべて正常に動作します。私はデバッガを走らせて、Problem Statementにアクセス違反が0xzzzzzzというエラーを読み込んでいることを示しています。私はアプリケーションがいくつかの制限されたDLLまたはコードセクションのコードを読み込もうとしていると仮定し、それはエラーを発生させます。私はtry catchブロックを使用しましたが、それは役に立ちませんでした。私が何をすることができるかについての提案はありますか?

+0

"スタックフレームの戻りアドレス"の意味を明確にすることはできますか?あなたが持っている中心的な問題であると思われます。 –

+0

0xzzzzzz? ACTUALアドレスの転記はどうですか? –

+0

@Jonathan:各スタックフレームには、関数が終了するとコントロールが転送される戻りアドレスがあります。呼び出し元関数の内部にあります。 – Bruce

答えて

0

return_addrの値が何であれ、アクセス違反が発生しないため、有効なメモリ位置を指していません。したがって、その詳細は非常に重要です。

+0

などのさまざまなアドレスでエラーが発生します。return_addrには有効な値が含まれています。私はすべてのデータを記録し、ログファイルにret_5の有効な値を取得しますが、return_addr(上記参照)の値によってはプログラムがクラッシュします。 googletalkモジュールのベースアドレスは0x400000です。だから、これらのアドレスは少し疑わしいです。 – Bruce

関連する問題