2012-04-10 6 views
0

インラインアセンブリコードでラベルを使用しようとすると、理解不能なEAX_BAD_ACCESSエラーのために、アサンプトasmステートメントの直後にアプリケーションがクラッシュします。gccのインラインアセンブリでラベルを使用すると奇妙な悪いアクセスエラーが発生します

たとえば、次のコードを考えてみます。

asm volatile (
    "myloop: \n" 
    : 
    : 
    : 
); 

はなぜいつもこのスニペットクラッシュの原因を?私はgcc 4.2でXcode 4.3.1を使用しています。

+0

通常、スニペットはクラッシュしません。そのコードだけを使用しているときにアプリケーションがクラッシュすることは確実ですか?そうでない場合は、周囲のコードを入力してください。 – Job

+0

はい、そうです。私はちょうど新しい空のiosアプリケーションを作成し、AppDelegateの起動メソッドのどこかにこのコードを挿入しました。私がシミュレータから起動すると、すべて正常に動作しますが、私のiPhoneから起動すると、直ぐには分解できないEAX_BAD_ACCESSエラーが発生し、いくつかのランダムな逆アセンブリコードが表示されます。このコードがなければ、アプリは正常に起動します。 –

答えて

0

リンカーツールチェーンのリンカーに問題があります。私もこの問題に直面しました。 リンカーは、生成されたアセンブリから任意のラベルを取り出し、関数の開始と見なし、ラベルから始まるセクションを再配置します。これにより、関数のエピローグなしで切り捨てられ、PCが孤立して、次のアドレスにあるセクション/関数/ルーチンにドリフトします。 リンカはローカルラベルを2通りの方法で理解しています(逆の場合はわかります)。 1.ラベル名の先頭に大文字の「L」を使用します。これは、コンパイラが独自のローカルラベル(ループなど)をマークする方法です。 2.数字ラベル、例えば "0:"などを使用し、前方ジャンプの場合は "b 0f"、後方の場合は "b 0b"のような指向性分岐を使用します。 したがって、あなたのPROBを解決: ASM揮発性( "Lmyloopます:\ n" : : : )。揮発性

それとも ASM( "0:\ n" は
: : : )。

うん!私は知っている...アップルツールチェーンは哀れです。 XCodeのインラインアームアセンブリにはさらに多くの問題があります。

関連する問題