2011-09-09 3 views
1

Visual C++ 2010 Ultimate(Windows 7 Professional)のインラインアセンブリに問題があります。私は文字、DWORD文字列などなどを使用すると、すべての私のインラインアセンブリは、動作しません...だから、私は、コンソールアプリケーションでMSDNからこのコードをコピー:インラインアセンブリがクラッシュしますか?

// InlineAssembler_Calling_C_Functions_in_Inline_Assembly.cpp 
// processor: x86 
#include <stdio.h> 

char format[] = "%s %s\n"; 
char hello[] = "Hello"; 
char world[] = "world"; 
int main(void) 
{ 
    __asm 
    { 
     mov eax, offset world 
     push eax 
     mov eax, offset hello 
     push eax 
     mov eax, offset format 
     push eax 
     call printf 
     //clean up the stack so that main can exit cleanly 
     //use the unused register ebx to do the cleanup 
     pop ebx 
     pop ebx 
     pop ebx 
    } 
} 

私は自分のアプリケーションでこれらの行を除いては何もありません、結果:文字列が印刷されず、アプリケーションがクラッシュします。これがどうして起こるのか?

答えて

0

私はebxにポップすることが理由であると仮定しています。 eaxを除くすべてのレジスタの整合性を維持することは、お客様の責任です。代わりにeaxにポップアップしてみてください。

+0

なぜ 'printf'がアクセス違反を引き起こしているのか分かりませんが、最初の3つの引数(' eax'を最初に読み込む必要はありません)を押してから、問題を再現できます。関数呼び出し、つまり 'eax'へのポップアップはありません。 'printf'はまだクラッシュします。 ' –

+0

これは理由ではありませんが、この答えはまだ確実に_future_クラッシュを避ける非常に重要なものを追加します。 +1 – BlackBear

1

プロジェクト+プロパティ、C/C++、コード生成、選択/ MTd。リリース構成に対して同じ手順を繰り返し、/ MTを選択します。

あなたはそれが、あなたはこのような呼び出しを記述する必要がありますCRTの非静的バージョンで動作したい場合は

:DLLから

call dword ptr printf 

輸出は、間接的に呼び出される必要があります。

+0

うん、そこにいいキャッチ。 +1 –

+0

別の尋ねられない精神的なデバッグの答え。 upvoteありがとう:) –

+0

レイモンド陳は誇りに思う= D –

関連する問題