2

私はこの件について本当に混乱しています。Xcode で LLVM 4.1 コンパイラを使用しています。このような単純な基本コードを 32 ビットまたは x64 または x64-x86 モードで ARC をオフにしてコンパイルすると、すべて問題ありませんが、自動参照カウント モードでコンパイルすると、エラーが発生しますBAD_ACCESS

これはサンプルコードです:

-(void) doNothing{

__asm__ volatile(
             "pushl %ebp;"
             "movl %esp , %ebp ;" 
             "movl %eax , -4(%ebp);"
             "movl %ebp, %esp;"
             "popl %ebp;"
             "leave;" 
             "ret  "    // retl in x86
             );

}

エラーの原因を突き止めようとしたところ、ARC モードで動作するのはプッシュ/ポップだけであることがわかりました。

過去にインライン アセンブリで巨大なコードを書いたことがあり、ARC を使用してモジュールに結合する必要があるため、非常にイライラします。解決できない場合は、ARC なしで動作するようにすべてのモジュールを修正する必要があるかもしれません。

誰でもそれについて私を助けることができますか?

4

4 に答える 4

2

ObjCメッセージではなく、CまたはC++関数にアセンブラーコードを配置することをお勧めします。__attribute__((naked))そして、関数宣言に追加します。

于 2013-01-04T07:05:08.050 に答える
2

おそらく解決策はありますが、修正できない場合は、問題のあるメソッドの実装をカテゴリに移動し、そのカテゴリだけを -fno-objc-arc でコンパイルできます。そうすれば、objc コードはアークのままになり、アセンブラが機能します。

于 2013-01-03T19:21:34.093 に答える
2

OS X では 32 ビット モードで ARC を使用できません。Objective-C Feature Availability Indexによると、ARC には OS X で 64 システムが必要です。

于 2013-01-04T08:05:45.063 に答える
0

解決策を見つけましたが、なぜ機能するのかわかりません!! 説明できる人に答えのポイントを与えます。問題の主な原因は、ARC の x64 の動作に関連していることに気付きました。そこで、コードを変更して「leave」と「ret」の行を削除したところ、動作するようになりましたが、わかりません。新しいコード:

             "pushq %rbp;"
             "movq %rsp , %rbp ;"
             "movl %eax , -4(%rbp);"
             "popq %rbp;"
             );
于 2013-01-03T22:28:28.673 に答える