ここには、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ブロックを使用しましたが、それは役に立ちませんでした。私が何をすることができるかについての提案はありますか?
"スタックフレームの戻りアドレス"の意味を明確にすることはできますか?あなたが持っている中心的な問題であると思われます。 –
0xzzzzzz? ACTUALアドレスの転記はどうですか? –
@Jonathan:各スタックフレームには、関数が終了するとコントロールが転送される戻りアドレスがあります。呼び出し元関数の内部にあります。 – Bruce